【问题标题】:Runtime discrepancies with NoSuchElementException between systems using Selenium Webdriver with Python使用 Selenium Webdriver 和 Python 的系统之间存在 NoSuchElementException 的运行时差异
【发布时间】:2020-11-03 09:45:37
【问题描述】:

背景

我一直在使用 Python 3.8 和 Selenium 构建网络爬虫。在我的两个系统(2012 Macbook Pro 和新的相当强大的 PC 版本)上,它将在大约 2 小时内抓取三个结构相似的网站。对于每个站点,我使用 Firefox Webdriver 从单个产品列表中抓取数据。这些网站的每个列表平均需要大约 3-4 秒,从不超过 5 秒。

问题

我最近将它发送给了我的合作伙伴,以便他可以在他的系统上进行测试(不确定具体型号,但是一台新的中端笔记本电脑)。对于前两个网站,它运行流畅,与我的 PC 非常相似。但是,在第三个网站上,大约 5% 的列表会卡住 10 秒到无限期不等。以下两段代码似乎是我们被耽搁的地方:

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

以及以下,在所有要访问的 URL 的循环中:

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

我的考虑

我对所有这些都是新手,所以我不确定可能的错误是什么。这是我考虑过的:

他的笔记本电脑不合格:似乎不是问题。这绝对是对我的 Macbook Pro 的改进,它运行良好。此外,三分之二的网站非常适合他。

他的互联网连接不佳:可能是个问题,但比较 Ookla 结果是否足以确定这一点?为什么这只会对一个网站产生影响?

他的浏览器/python 已经过时了:我查过了。他们不是。

他的 PC 上运行的进程太多:我们进行了重置并关闭了所有不必要的程序。好像没什么区别。

我的代码低于标准:这完全有可能。

验证码问题:就我而言,我还没有看到验证码。但由于它在 1) 加载下一个 URL 或 2) 访问该 URL 的第一个数据位时被挂断,这似乎是可能的。

非常感谢任何和所有帮助!

【问题讨论】:

  • 还有几件事需要检查/排除:当它卡住时,页面上是否有可用的 xpath? (即你可以在开发工具中看到它) - 你们都有相同的浏览器版本吗?您是否对任何加载时间等待设置了隐式等待,或者通常有任何大的同步时间?你们都使用相同的分辨率吗? (有些网站是响应式的,不同的窗口大小会影响 xpath)

标签: python selenium selenium-webdriver webdriverwait nosuchelementexception


【解决方案1】:

理想情况下,要检索 innerText,您必须为 visibility_of_element_located() 诱导 WebDriverWait,您可以使用以下任一 Locator Strategies

  • 使用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 上找到一些相关讨论:

【讨论】:

    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2011-08-15
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多