美好的一天,我在这里和谷歌上进行了大量搜索,但尚未找到解决此问题的解决方案。
场景是:
我有一个 Python 脚本 (2.7),它循环访问多个 URL(例如,想想亚马逊页面、抓取评论)。每个页面都有相同的 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...')
不再工作了。
错误消息说:
消息:无法解码来自木偶的响应
对页面的任何进一步的 selenium 请求都会返回错误:
消息:尝试在未建立连接的情况下运行命令
显示一些代码:
当我创建驱动程序时:
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位服务器,所以我只能使用chromedriver v0.33,它只支持Chrome v60-62。目前 Chrome 是 v65,在 DigitalOcean 上我似乎没有一种简单的方法可以恢复到旧版本 - 这就是我坚持使用 Firefox 的原因。