Как перезапустить драйвер Selenium Gecko (HTTPConnectionPool (host = '127.0.0.1', port = ...): тайм-аут чтения.)? - PullRequest
0 голосов
/ 03 ноября 2019

Я пишу свой первый веб-сканер с Python 3 и Selenium:


import selenium
from selenium import webdriver

GECKO_PATH = os.path.expanduser("~/code/geckodriver")
DRIVER = None

def get_page_javascript(url):
    "Downloads a simple webpage with javascript."
    driver = get_driver()
    driver.get(url)
    return driver.page_source

def crawl_page(url):
    """Gets the page source and returns all links on the page.
    """

    ...

def main():

   to_visit = ["<some website>"]

   while to_visit:
        url = to_visit.pop(0)

        try:
            print("About to visit '%s'" % url)
            html, new_links = crawl_page(url = url)
        except (urllib.error.HTTPError, urllib.error.URLError, selenium.common.exceptions.UnexpectedAlertPresentException, socket.timeout, urllib3.exceptions.ReadTimeoutError) as e:
            print("Skipping '%s' due to error: %s" % (url, str(e)))
            #get_driver().quit()
            #init_driver()
            continue

        # Handle html
        ...

        # Add new links
        to_visit.extend(new_links)
        # Note: I omitted code to avoid double visits

Если загрузка одной страницы занимает слишком много времени, драйвер Gecko все еще застрял, и все последующие вызовы завершатся неудачно. Я получил:

About to visit http://www.moretonhall.org/News
Skipping 'http://www.some-website.org/News' due to error: HTTPConnectionPool(host='127.0.0.1', port=62772): Read timed out. (read timeout=)
About to visit http://www.some-website.org/Other-News
Skipping 'http://www.some-website.org/Other-News' due to error: HTTPConnectionPool(host='127.0.0.1', port=62772): Read timed out. (read timeout=)
About to visit http://www.some-website.org/More-News
Skipping 'http://www.some-website.org/More-News' due to error: HTTPConnectionPool(host='127.0.0.1', port=62772): Read timed out. (read timeout=)
About to visit http://www.some-website.org/Another-Page

К тому времени драйвер Gecko показывал первую страницу some-website.org/News.

Если я пытаюсь перезапускать драйвер при каждой ошибке, комментируя:

#get_driver().quit()
#init_driver()

затем я получаю новые экземпляры Gecko с каждой ошибкой и неперехваченную ошибку, которая не упоминает мой код, возможно потому, что вызов для выхода из драйвера шел в своем собственном потоке:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 384, in _make_request
    six.raise_from(e, None)
  File "", line 2, in raise_from
  File "/usr/local/lib/python3.7/site-packages/urllib3/connectionpool.py", line 380, in _make_request
    httplib_response = conn.getresponse()
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 1336, in getresponse
    response.begin()
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 306, in begin
    version, status, reason = self._read_status()
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/http/client.py", line 267, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/socket.py", line 589, in readinto
    return self._sock.recv_into(b)
socket.timeout: timed out

Я также попытался увеличить время ожидания до 30 секунд из решений в Как установить время ожидания по умолчанию для Selenium Python WebDriver? , но ни одно не сработало, и время ожидания осталось несколько секунд.

Как можноЯ правильно перезапускаю движок Gecko в Selenium или приказываю ему сдаться и перезапустить с новым URL?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...