如何在遍历 URL 时使用 Selenium Python 查找 Web 元素

How to find web element with Selenium Python while iterating through URLs

我需要遍历并从一百万个网页中抓取一个元素(所有页面的 class 名称都相同)。我已经按照以下(简化)方式设置了代码:

driver = webdriver.Firefox()
wait = WebDriverWait(driver, 10)
detail_dict = {}
for i in range(1000000):
    url = f'http://www.cnappc.it/risultato.aspx?IDAssociato={i}&tipo=1#edit'
    driver.get(url)
    elem_detail = wait.until(expected_conditions
                             .presence_of_element_located((By.CLASS_NAME, 'content')))
    detail_dict[i] = elem_detail.text

代码运行相当流畅,当我中断内核进行检查时,我注意到每次迭代时 iurl 都在增加。但是,驱动程序网页在第一个 URL 上获得 'stuck',即 http://www.cnappc.it/risultato.aspx?IDAssociato=0&tipo=1#edit,因此 elem_detail.text returns 一遍又一遍地使用相同的字符串。尽管 .get() 等待页面完全加载,但驱动程序网页似乎跟不上 driver.get(url) 方法。

来自Selenium-Python/Getting Started

The driver.get method will navigate to a page given by the URL. WebDriver will wait until the page has fully loaded (that is, the “onload” event has fired) before returning control to your test or script.

我为 elem_detail 插入了预期条件,但没有用。在 driver.get(url) 之后设置 time.sleep(2) 允许驱动程序网页更改并显示不同的内容,但我会面临严重的减速。即使这样,页面也会时不时地卡住,字典值条目最终会不系统地重复。

您能否推荐一种不涉及 time.sleep() 的稳健方法?


仅供参考:我将 selenium 与 geckodriver 一起使用。

试试这个语法,你的代码不适合我 (python 2.7)

for i in range(1000000):
    url = "http://www.cnappc.it/risultato.aspx?IDAssociato=%s&tipo=1#edit" %i
    print("Get url >> %s" %url) #Just for debug and get output
    driver.get(url)

    wait = WebDriverWait(driver, 10)
    elem_detail = ....

我成功解决了切换到 webdriver.Chrome() 的问题。 Webdriver 实际上等待每个页面加载,搜索 class 元素并移动到下一页,而不指定任何 time.sleep().