我正在使用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找到元素并完成所有内容。为什么通过脚本赢得相同的工作?
答案 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()