Сценарий таков:
У меня есть скрипт 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). Кажется, что это случайно приводит к сбою безголового браузера, после чего весь браузерObjt.get('url...') больше не работает.
В сообщениях об ошибках говорится:
Сообщение: не удалось декодировать ответ от марионетки
Любые дальнейшие запросы селена для страниц возвращают ошибку:
Сообщение: попыталась выполнить команду без установления соединения
Чтобы показать код:
Когда я создаю драйвер:
Код: Выделить всё
options = Options()
options.set_headless(headless=True)
driver = webdriver.Firefox(
firefox_options=options,
executable_path=config.GECKODRIVER
)
Код: Выделить всё
driverКод: Выделить всё
browserObj.get(url)
soup = BeautifulSoup(browserObj.page_source, 'lxml')
Ошибка может указывать на строку BeautifulSoup, которая приводит к сбою браузера.
Что может быть причиной этого и что я могу сделать, чтобы решить проблему?
Изменить: добавление трассировки стека, которая указывает на то же самое:
Код: Выделить всё
Traceback (most recent call last):
File "main.py", line 164, in
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 имеет версию 65, и в DigitalOcean у меня, похоже, нет простого способа вернуться к старой версии, поэтому я остановился на Firefox.
Мобильная версия