首页 > 解决方案 > 使用 Selenium Webdriver 和 Python 的系统之间存在 NoSuchElementException 的运行时差异

问题描述

背景

我一直在用 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 的第一位数据时被挂断,这似乎是可能的。

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

标签: pythonseleniumselenium-webdriverwebdriverwaitnosuchelementexception

解决方案


理想情况下,要检索innerText你必须诱导WebDriverWait并且visibility_of_element_located()你可以使用以下任一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的相关讨论:


推荐阅读