Добрый день, я сделал несколько поисков здесь и в 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-битным сервером, я могу использовать только chromedriver v0.33, который поддерживает только Chrome v60-62. В настоящее время Chrome - это v65 и на DigitalOcean. Кажется, у меня нет простого способа вернуться к старой версии, поэтому я застрял в Firefox.