【问题标题】:Cannot initiate Firefox from Scrapy script, but it runs fine from the command line无法从 Scrapy 脚本启动 Firefox,但它从命令行运行良好
【发布时间】:2015-11-19 19:21:23
【问题描述】:

我正在使用 Scrapy 来满足我的爬行需求。对于动态网页,我使用 Selenium 在 Firefox 中加载页面。由于代码要在 AWS 实例上运行,因此我使用 PyVirtualDisplay 为 Firefox 创建虚拟显示器。整个过程运行了几个月,直到今天停止,没有对代码进行任何更改。

现在,当我使用命令 scrapy crawl amazon 运行爬虫时,我收到一条错误消息:

消息:在我们连接之前,浏览器似乎已经退出。 如果您在 FirefoxBinary 构造函数中指定了 log_file,请检查它 了解详情。

所以我尝试检查它是否可以在 shell 上运行。我尝试以下方法:

scrapy shell <url>
>>> from selenium import webdriver
>>> from pyvirtualdisplay import Display
>>> display = Display(visible=0, size=(800, 600))
>>> display.start()
<Display cmd_param=['Xvfb', '-br', '-screen', '0', '800x600x24', ':106835'] cmd=['Xvfb', '-br', '-screen', '0', '800x600x24', ':106835'] oserror=None returncode=None stdout="None" stderr="None" timeout=False>
>>> browser = webdriver.Firefox()
>>> browser.get(response.url)

如您所见,firefox 窗口在此处打开时没有任何错误。我什至可以看到 Firefox 在此之后作为一个进程运行。

ps -ef | grep 火狐

ubuntu 26377 24202 42 19:12 分/1 00:00:01 /usr/lib/firefox/firefox -foreground

ubuntu 26435 31306 0 19:12 pts/0 00:00:00 grep --color=auto 火狐

我什至可以通过 shell 查找元素并完成所有工作。为什么不能通过脚本进行相同的工作?

【问题讨论】:

    标签: python firefox selenium scrapy


    【解决方案1】:

    所以最后经过大量实验,我发现了一些可行的方法(虽然不知道为什么)。

    上面提到的方法是通过 Shell 而不是通过脚本。如果我通过明确指定 Firefox 二进制文件来创建 Webdriver 对象,它就可以工作。下面是代码:

    from selenium.webdriver.firefox.firefox_binary import FirefoxBinary
    log_file = open('/home/ubuntu/log.txt','w')
    binary = FirefoxBinary('/usr/bin/firefox', log_file=log_file)
    browser = webdriver.Firefox(firefox_binary=binary)
    browser.get(url)
    

    这工作得很好。如果有人能分享他们对为什么只能以这种方式工作的想法,我将不胜感激。

    【讨论】:

      【解决方案2】:

      您的代码确实对我有用。您也可以尝试关闭显示和浏览器:

      from selenium import webdriver
      from pyvirtualdisplay import Display
      
      display = Display(visible=0, size=(1024, 768))
      display.start()
      browser = webdriver.Firefox()
      browser.get(response.url)
      browser.close()
      display.close()
      

      【讨论】:

      • 感谢您回复@Rahul。是的,我可以关闭浏览器并使用browser.close()display.stop() 显示。事实上,该脚本在另一个具有完全相同配置的系统上运行良好。正如我所说,它曾经也可以在这个系统上运行,但由于某种原因现在无法运行。
      猜你喜欢
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2021-12-20
      相关资源
      最近更新 更多