当前位置: 首页 > 面试题库 >

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

章禄
2023-03-14
问题内容

美好的一天,我在这里和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。自从增加以来,没有发生过这样的失败。



 类似资料:
  • 你好,我在这里和谷歌上做了很多搜索,但还没有找到解决这个问题的方法。 我在本地计算机(OSX10.10)上运行这个脚本。火狐是最新的V59。Selenium的版本为3.11.0,使用geckodriver V0.20。 这个脚本在本地没有问题,它可以运行所有的URL,刮页没有问题。 现在,当我把脚本放在我的服务器上时,唯一的区别是它是Ubuntu16.04(32位)。我使用适当的geckodriv

  • 我使用的标准代码来自:https://mandrillapp.com/api/docs/messages.php.html,。但我一直都有这个例外,我不知道为什么 致命错误:未捕获的异常“mandrill_error”,消息为“我们无法从Mandrill API解码JSON响应:window.nreum(nreum={}),__nr_require=函数(e,n,t){函数r(t){if(!n[t

  • 问题内容: 我什至不理解标题中服务之间的基本区别。这些服务仅仅是提供软件来帮助您配置/组织/管理VM,还是为VM运行提供物理基础设施?换句话说,它们只是开发人员与AWS,Rackspace和Azure之间的便捷接口吗? 问题答案: 不完全是。 Chef / Puppet是“相同的”,它们是配置管理。尽管您可以使用它们来管理虚拟机或公共/私有云,但是大多数人并不倾向于那样使用它们。它们是配置管理。它

  • 问题内容: 最近几天,我一直在将Selenium,Tor和Firefox混为一谈,以完成多项任务。我设法用Python编写了一个简单的脚本,该脚本可通过Selenium控制Firefox,而Firefox则连接到Tor以获得隐私。 现在,我正在寻找一种节省资源的方法,因此我想到了以无头模式运行Firefox,我认为这是一个常见功能,但事实并非如此。我正在寻找一种方法来做到这一点。之所以是Firef

  • 在过去的几天里,我一直把Selenium、Tor和Firefox作为多个任务的组合。我用Python编写了一个简单的脚本,通过Selenium控制Firefox,同时Firefox连接到Tor以保护隐私。 现在,我正在寻找一种节省资源的方法,所以我想到了在无头模式下运行Firefox,我认为这是一个常见的特性但似乎并非如此。我正在寻找一种方法来做这件事。之所以是火狐浏览器,而不是基于终端的浏览器,