Python / Firefox无头抓取脚本中的“无法解码来自木偶的响应”消息

发布于 2021-01-29 18:25:15

美好的一天,我在这里和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。

关注者
0
被浏览
43
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我仍然不知道为什么会这样,但是我可能已经找到了解决方法。我在一些文档中读到了可能存在竞争状况(关于什么,我不确定,因为不应有两个项目竞争同一资源)。

    我更改了抓取代码以执行此操作:

    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。自从增加以来,没有发生过这样的失败。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看