Добрый день, я провел несколько поисков здесь и в 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.