Я пишу свой первый веб-сканер с 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?