Я использую Selenium Chrome для извлечения информации из онлайн-источников. По сути, я перебираю список URL-адресов (хранится в mylinks
) и загружаю веб-страницы в браузере следующим образом:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("window-size=1200,800")
browser = webdriver.Chrome(chrome_options=options)
browser.implicitly_wait(30)
for x in mylinks:
try:
browser.get(x)
soup = BeautifulSoup(browser.page_source, "html.parser")
city = soup.find("div", {"class": "city"}).text
except:
continue
Моя проблема в том, что браузер "зависает" в некоторыхточка. Я знаю, что эта проблема вызвана веб-страницей. Как следствие, моя рутина останавливается, так как браузер больше не работает. Также browser.implicitly_wait(30)
здесь не помогает. Ни явное, ни неявное ожидание не решает проблему.
Я хочу «тайм-аут» проблемы, то есть я хочу quit()
браузер через x
секунд (в случае зависания браузера) и перезапустить его.
Я знаю, что мог бы использовать subprocess
с timeout
, например:
def startprocess(filepath, waitingtime):
p = subprocess.Popen("C://mypath//" + filepath)
try:
p.wait(waitingtime)
except subprocess.TimeoutExpired:
p.kill()
Однако для моей задачи это решение было бы вторым наилучшим.
Вопрос: существует ли альтернативный способ тайм-аута шага browser.get(x)
в цикле выше (в случае зависания браузера) и перехода к следующему шагу?