【发布时间】:2018-09-18 23:14:34
【问题描述】:
美好的一天,我在这里和谷歌上进行了多次搜索,但尚未找到解决此问题的解决方案。
场景是:
我有一个循环遍历多个 URL 的 Python 脚本 (2.7)(例如,想想亚马逊页面、抓取评论)。每个页面都有相同的 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 的原因。
【问题讨论】:
-
使用错误堆栈跟踪更新问题。
-
为每个请求添加了堆栈跟踪。
标签: python selenium firefox web-scraping geckodriver