#python #selenium #selenium-chromedriver
#python #selenium #selenium-chromedriver
Вопрос:
Я пытаюсь автоматизировать карты Google с помощью драйвера Python Selenium Chrome, мой код стабилен, чтобы получить то, что мне нужно, но не время выполнения.
Я использую итеративный код для получения данных о продавцах через Google Maps, скорость получения данных 1 продавца составляет менее 1 секунды с использованием Selenium, но когда код поймал исключение, это займет очень много времени, например, 6-7 секунд.
Вот краткое изложение времени выполнения:
https://picoolio.net/image/dgxC (Обычное время выполнения)
https://picoolio.net/image/dgxT (Время выполнения, когда исключение возникло в час открытия, слишком долгое)
https://picoolio.net/image/dgxV (Время выполнения при возникновении исключения, иногда выполняется так, как ожидалось)
Вот некоторый код для получения списка открытых часов:
try:
openhour = wait(driver, 1).until(EC.visibility_of_element_located((By.XPATH,
'.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))
driver.execute_script("arguments[0].scrollIntoView(true);", openhour)
openhour.click()
openhourstacked = wait(driver, 1).until(EC.visibility_of_element_located((By.CLASS_NAME,
'section-open-hours-container-hoverable'))).get_attribute("aria-label")
openhourlist = openhourstacked.split(",")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]
except NoSuchElementException:
openhourlist = []
print("No Open Hour list in this merchant!")
openhour_trig = True
except WebDriverException:
openhourlist = []
print("Failed to load Open Hour list in this merchant!")
openhour_trig = True
Во многих рекомендациях говорится, что для правильного выполнения явного ожидания я должен использовать комбинацию WebDriverWait и EC (ожидаемые условия), и я попробовал это напрямую с помощью приведенного выше кода, но WebDriverWait, похоже, не работает для всех входящих исключений, другими словами, иногда успешно, а иногда терпит неудачу.
Я попытался заменить EC.visibility_of_all_element_located
на EC.presence_of_all_element_located
, но это не имеет никакого значения.
Я ожидал, что время выполнения будет по-прежнему плавным, когда возникнет какое-либо исключение, есть ли какой-нибудь способ заставить Селен прекратить поиск элементов в случае тайм-аута, помимо вышеуказанного способа? Или это проблема с подключением к Интернету? Любые мысли приветствуются!
Обновление: итак, я модифицирую код open hour примерно так
try:
if len(driver.find_elements(By.XPATH, './/span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]'))>0:
openhour = wait(driver, 5).until(EC.visibility_of_element_located((By.XPATH,
'.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')))
#openhour = driver.find_element_by_xpath('.//span[@class="section-open-hours-button maps-sprite-pane-info-arrowup"]')
driver.execute_script("arguments[0].scrollIntoView(true);", openhour)
openhour.click()
#openhourstacked = driver.find_element_by_class_name('section-open-hours-container-hoverable').get_attribute("aria-label")
openhourstacked = wait(driver, 5).until(EC.visibility_of_element_located((By.CLASS_NAME,
'section-open-hours-container-hoverable'))).get_attribute("aria-label")
openhourlist = openhourstacked.split(",")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1].split(".")
openhourlist[len(openhourlist) - 1] = openhourlist[len(openhourlist) - 1][0]
else:
openhourlist = []
print("No Open Hour list in this merchant! (Not an Exception)")
except NoSuchElementException:
openhourlist = []
print("No Open Hour list in this merchant!")
openhour_trig = True
except WebDriverException:
openhourlist = []
print("Failed to load Open Hour list in this merchant!")
openhour_trig = True
Да, таким образом, это действительно позволяет избежать исключений, но при этом поиск повторяется, как и раньше, поэтому он может снова привести к длительному поиску до 6-7 секунд, когда элементы не найдены.. явное ожидание тоже не очень полезно в этих терминах, я думаю
Ответ №1:
Краткие сведения:
В вашем коде попробуйте увеличить время явного ожидания. Это не замедлит вас, но предотвратит эти исключения. Попробуйте 5 секунд вместо 1 секунды. Попробуйте это
wait(driver,5)
Мы используем ожидания, потому что для загрузки DOMS требуется время, и иногда нам нужно дождаться загрузки / скрытия / изменения страницы / элементов, и мы должны действовать в соответствии с изменениями.
Что делает явное ожидание, так это то, что оно ожидает выполнения ожидаемого условия до определенного времени и проверяет каждые 500 миллисекунд, выполняются ли условия или нет. Таким образом, вы теряете максимум 500 миллисекунд времени перед выполнением следующей задачи. Если условия не будут выполнены вовремя, это вызовет исключение тайм-аута. Явное ожидание не решит всех ваших проблем.
Вам все равно нужно проверить возможные исключения и решить, что делать, когда это произойдет. Некоторые сайты загружаются медленно или иногда у вас низкая пропускная способность. Тогда у вас нет способа ускорить процесс.
Сначала вы должны проанализировать страницу и убедиться, чего ожидать. Если вы ожидаете присутствия элемента, но есть вероятность, что его может и не быть, тогда вам следует соответствующим образом обработать исключение.
Если вы проверяете, существует ли элемент на странице или нет, тогда было бы лучше не ждать элемент, а попытаться использовать find_elements_
и проверить размер списка. Таким образом, вы избежите исключений, и это будет быстрее.
driver.find_elements(By.ID, "locator").size()>0
Комментарии:
1. Хороший обходной путь @S Ahmed, так что метод find_elements с size можно использовать в качестве оператора if?, Я попробую это достаточно скоро и вернусь снова
2. Я пытался выполнить проверку размера только с помощью driver.find_elements(By. ID, «locator»).size()> 0, но он продолжает повторять Selenium, чтобы снова найти элемент с большим временем
3. явное ожидание увеличивает время выполнения только тогда, когда требуется время для загрузки элементов или не загружается вообще. Вы пытались изменить стратегию загрузки страницы веб-драйвера? Вы могли бы попробовать это, чтобы ускорить время выполнения.
4. да, я когда-либо устанавливал для pageLoadStrategy значение ‘None’, используя import DesiredCapabilities, но при его запуске не удается загрузить Карты Google, поэтому я ничего не могу сделать, вот как я это установил раньше .. picoolio.net/image/dgHU
5. Попробуйте установить его
eager
так, как он, по крайней мере, ожидаетDOMContentLoad
Ответ №2:
да, явное ожидание (webdriver wait) решает эту проблему.. Другой простой способ — создать цикл for с временными секундами и записать элементы find внутри цикла, чтобы даже при сбое он проверял 180 секунд и записывал условия, превышающие ожидаемое время ожидания
for (int second = 0; second < 60; second ) {
try {}
catch (WebDriverException we)
{}
if (second >= 60) {
//write failure
}
Комментарии:
1. Я не уверен, что для перехвата исключения можно использовать цикл, который может ускорить его, но спасибо за совет 🙂
Ответ №3:
Я знаю, что это уже длинный вопрос, и получаю решения, забыл обновить снова, но я думаю, я понял, что установка неявного ожидания на несколько секунд, например: 2 секунды, подобные этому driver.implicitly_wait(2)
, поможет ограничить поиск WebDriver до последних секунд, более чем в последние секунды, он выброситИсключение
Комментарии:
1. по крайней мере, это помогает в некоторых случаях, но иногда это может работать не каждый раз..