无法从Scrapy脚本启动Firefox,但它从命令行运行良好

时间:2015-11-19 19:21:23

标签: python firefox selenium scrapy

我正在使用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 firefox

     

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

     

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

我甚至可以通过shell找到元素并完成所有内容。为什么通过脚本赢得相同的工作?

2 个答案:

答案 0 :(得分: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)

这完全没问题。如果有人可以分享他们为什么只是这样工作的想法,我将不胜感激。

答案 1 :(得分:0)

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

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()