Расхождения во времени выполнения с NoSuchElementException между системами, использующими Selenium Webdriver с Python - PullRequest
0 голосов
/ 14 июля 2020

Фон

Я создавал веб-скребок с Python 3.8 и Selenium. В обеих моих системах (Macbook Pro 2012 года и новая довольно мощная сборка P C) он очистит три веб-сайта с аналогичной структурой примерно за 2 часа. Для каждого сайта я собираю данные из отдельных списков продуктов с помощью Firefox Webdriver. Каждое объявление с этих сайтов занимает в среднем около 3-4 секунд, никогда не превышая 5 секунд.

Проблема

Недавно я отправил его своему партнеру, чтобы он мог проверить его в своей системе ( не уверен на точной модели, но новый ноутбук среднего уровня). Для первых двух веб-сайтов он работает плавно и очень похоже на мой P C. Однако на третьем веб-сайте около 5% объявлений застревают на срок от 10 секунд до неопределенного времени. Похоже, что нас задерживают в следующих двух разделах кода:

try:
    item = browser.find_element_by_xpath("//div[@class='outer class']/div[@class='inner class']").text
except NoSuchElementException:
    item = ""

и следующий, который входит в oop всех URL-адресов, которые нужно посетить:

try:
    browser.get(url)
except TimeoutException:
    continue

Что я рассмотрел

Я новичок во всем этом, поэтому я не уверен, каковы возможные ошибки. Вот что я рассмотрел:

Его ноутбук не на высоте: Кажется, проблема не в этом. Это определенно улучшение по сравнению с моим Macbook Pro, который отлично работает. Кроме того, 2 из 3 веб-сайтов у него работают идеально.

Его inte rnet соединение не на должном уровне: Может быть проблемой, но достаточно ли сравнения результатов Ookla, чтобы определить это? И почему это может иметь значение только на одном веб-сайте?

Его браузер / python устарел: Я проверил. Это не так.

У него слишком много процессов, запущенных на его P C: Мы сделали сброс и закрыли все ненужные программы. Похоже, это не имело значения.

Мой код ниже среднего: Это вполне возможно / вероятно.

Проблемы с Captcha: На моем сторона, я не видел капчи. Но поскольку он зацикливается на 1) загрузке следующего URL-адреса или 2) доступе к первому биту данных с этого URL-адреса, это кажется возможным.

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 14 июля 2020

В идеале, чтобы получить innerText , вы должны вызвать WebDriverWait для visibility_of_element_located(), и вы можете использовать любую из следующих Стратегий локатора :

  • Использование CSS_SELECTOR:

    item = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.outer.class > div.inner.class"))).text
    
  • Использование XPATH:

    item = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='outer class']/div[@class='inner class']"))).text
    
  • Примечание : вам необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

Ссылки

Вы можете найти пару соответствующих обсуждений на NoSuchElementException в:

...