2015-11-19 78 views
1

我正在使用Scrapy来满足我的爬行需求。对于动态网页,我使用Selenium在Firefox中加载页面。由于代码将在AWS实例上运行,因此我使用PyVirtualDisplay为Firefox创建虚拟显示。整个过程在几个月内运行良好,直到今天停止,没有任何代码修改。无法从Scrapy脚本启动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 PTS/1 00:00:01 /usr/lib中/火狐/火狐-foreground

的ubuntu 26435 31306 0 19:12 PTS/0 00:00: 00 grep --color = auto firefox

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

回答

1

所以最后很多实验后,我发现一些作品(不知道为什么虽然)。

上述方式通过Shell工作,但不通过脚本。如果我通过明确指定Firefox Binary来创建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) 

这工作得很好。如果有人可以分享他们的想法,为什么这只会这样工作,我会很感激。

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

谢谢你回复@Rahul。 是的,我可以关闭浏览器并使用'browser.close()'和'display.stop()'显示。事实上,该脚本在另一个具有完全相同配置的系统上工作正常。正如我所说,它也用于这个系统的工作,但由于某种原因现在不工作。 –

相关问题