Python / Firefox无头抓取脚本中的“无法解码来自木偶的响应”消息
美好的一天,我在这里和Google上进行了许多搜索,但仍未找到解决此问题的解决方案。
该方案是:
我有一个Python脚本(2.7),它可以循环访问多个URL(例如,认为Amazon页面,抓取评论)。每个页面具有相同的HTML布局,只是抓取不同的信息。我将Selenium与无头浏览器一起使用,因为这些页面具有需要执行以获取信息的javascript。
我在本地计算机(OSX 10.10)上运行此脚本。Firefox是最新的v59。Selenium是3.11.0版本,并使用geckodriver
v0.20。
该脚本在本地没有问题,它可以在所有URL中运行,并且可以毫无问题地刮取页面。
现在,当我将脚本放在服务器上时,唯一的区别是Ubuntu
16.04(32位)。我使用了适当的geckodriver(仍为v0.20),但其他所有功能都相同(Python 2.7,Selenium
3.11)。它似乎随机破坏了无头浏览器,然后所有的浏览器browserObjt.get('url...')
不再起作用。
错误消息说:
消息:无法解码木偶的响应
对页面的任何其他硒请求都将返回错误:
消息:尝试在未建立连接的情况下运行命令
显示一些代码:
创建驱动程序时:
options = Options()
options.set_headless(headless=True)
driver = webdriver.Firefox(
firefox_options=options,
executable_path=config.GECKODRIVER
)
driver
作为参数传递到脚本的函数,browserObj
然后用于调用特定页面,然后在加载后将其传递给BeautifulSoup进行解析:
browserObj.get(url)
soup = BeautifulSoup(browserObj.page_source, 'lxml')
错误可能指向导致浏览器崩溃的BeautifulSoup行。
可能是什么原因造成的,我该怎么做才能解决此问题?
编辑:添加指向同一件事的堆栈跟踪:
Traceback (most recent call last):
File "main.py", line 164, in <module>
getLeague
File "/home/ps/dataparsing/XXX/yyy.py", line 48, in BBB
soup = BeautifulSoup(browserObj.page_source, 'lxml')
File "/home/ps/AAA/projenv/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 670, in page_source
return self.execute(Command.GET_PAGE_SOURCE)['value']
File "/home/ps/AAA/projenv/local/lib/python2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
self.error_handler.check_response(response)
File "/home/ps/AAA/projenv/local/lib/python2.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
WebDriverException: Message: Failed to decode response from marionette
注意:此脚本曾经用于Chrome。由于服务器是32位服务器,因此我只能使用仅支持Chrome v60-62的chromedriver
v0.33。目前Chrome是v65,在DigitalOcean上,我似乎没有一种简单的方法可以还原到旧版本-这就是为什么我坚持使用Firefox。
-
我仍然不知道为什么会这样,但是我可能已经找到了解决方法。我在一些文档中读到了可能存在竞争状况(关于什么,我不确定,因为不应有两个项目竞争同一资源)。
我更改了抓取代码以执行此操作:
import time browserObj.get(url) time.sleep(3) soup = BeautifulSoup(browserObj.page_source, 'lxml')
我没有选择为何选择3秒的具体原因,但是自从添加此延迟以来,我没有遇到
Message: failed to decode response from marionette
任何要抓取的URL错误。
更新:2018年10月
六个月后,这仍然是一个问题。Firefox,Geckodriver,Selenium和PyVirtualDisplay已全部更新为最新版本。此错误使自发重复发生而没有模式:有时有效,有时无效。
解决此问题的方法是将服务器上的RAM从1 GB增加到2 GB。自从增加以来,没有发生过这样的失败。