Rei*_*rne 15 python firefox selenium web-scraping geckodriver
美好的一天,我已经在这里和谷歌进行了一些搜索,但还没有找到解决这个问题的解决方案.
场景是:
我有一个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
)
Run Code Online (Sandbox Code Playgroud)
driver
作为参数传递给脚本的函数,browserObj
然后用于调用特定页面,然后一旦加载它就传递给BeautifulSoup进行解析:
browserObj.get(url)
soup = BeautifulSoup(browserObj.page_source, 'lxml')
Run Code Online (Sandbox Code Playgroud)
该错误可能指向正在崩溃浏览器的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
Run Code Online (Sandbox Code Playgroud)
注意:此脚本用于与Chrome配合使用.由于服务器是32位服务器,我只能使用chromedriver v0.33,它只支持Chrome v60-62.目前Chrome是v65,而在DigitalOcean上,我似乎没有一种简单的方法可以恢复到旧版本 - 这就是为什么我被Firefox困住了.
myo*_*yol 12
对于在Docker容器中运行selenium webdriver时遇到此问题的其他人,将容器大小增加到2gb可以解决此问题。
我想如果OP通过将其服务器RAM升级到2Gb来解决其问题,这也会影响物理机,但这可能是偶然的。
我仍然不知道为什么会这样,但是我可能已经找到了解决方法。我在一些文档中读到了可能存在争用情况(关于什么,我不确定,因为不应有两个项目争夺相同的资源)。
我更改了抓取代码以执行此操作:
import time
browserObj.get(url)
time.sleep(3)
soup = BeautifulSoup(browserObj.page_source, 'lxml')
Run Code Online (Sandbox Code Playgroud)
我没有选择为何选择3秒的具体原因,但是自从添加此延迟以来,我没有遇到Message: failed to decode response from marionette
任何要抓取的URL错误。
更新:2018年10月
六个月后,这仍然是一个问题。Firefox,Geckodriver,Selenium和PyVirtualDisplay已全部更新为最新版本。该错误无模式地自发地再次发生:有时有效,有时无效。
解决此问题的方法是将服务器上的RAM从1 GB增加到2 GB。自从增加以来,没有发生过这样的失败。
这个错误信息...
Message: failed to decode response from marionette
Run Code Online (Sandbox Code Playgroud)
...暗示GeckoDriver和Marionette之间的通信被中断/中断。
此问题的一些原因和解决方案如下:
在讨论中命令执行期间崩溃导致“内部服务器错误:无法解码来自牵线木偶的响应” @whimboo 提到,在执行测试时,Selenium可能会导致 Firefox 的父进程崩溃,错误如下:
DEBUG <- 500 Internal Server Error {"value":{"error":"unknown error","message":"Failed to decode response from marionette","stacktrace":...}...}
Run Code Online (Sandbox Code Playgroud)
在讨论Failed to decode response from marionette with Firefox >= 65 @rafagonc 中提到,在docker环境中使用GeckoDriver / FirefoxDriver或ChromeDriver时可能会发生此问题,因为僵尸进程的存在即使在调用driver.quit()
. 有时,当您一个接一个地打开许多浏览实例时,您的系统可能会耗尽内存或 PID。请参阅:Selenium 在 Firefox 中使用过多 RAM
正如@andreastt 提到的一个解决方案,以下配置应该可以解决 Docker 的内存不足问题:
--memory 1024mb --shm-size 2g
Run Code Online (Sandbox Code Playgroud)步骤:在docker容器中配置SHM大小
同样,在本地主机中执行测试时,建议保留以下(最低)配置:
--memory 1024mb
Run Code Online (Sandbox Code Playgroud)由于您使用的二进制文件版本之间不兼容,也可能会发生此问题。
解决方案:
Test
以非 root 用户身份执行您的操作。[e10s] libyuv::ARGBSetRow_X86 崩溃
您可以在以下位置找到相关的详细讨论:
归档时间: |
|
查看次数: |
12443 次 |
最近记录: |