【问题标题】:Unable to apply explicit wait in my script无法在我的脚本中应用显式等待
【发布时间】:2017-09-11 13:46:17
【问题描述】:

我用 python 编写了一个脚本来从加载缓慢的网页中抓取名称。该页面中有 1000 个名称,只有在使浏览器向下滚动时才能加载全部内容。但是,我的脚本可以成功到达此页面的最低部分并解析所有名称。我在这里面临的问题是我使用了硬编码延迟,在这种情况下为 5 秒,即使在加载项目时,它也会使浏览器不必要地等待。那么我如何使用显式等待来克服这种情况并解析所有项目。

这是我目前编写的脚本:

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://fortune.com/fortune500/list/")

check_height = driver.execute_script("return document.body.scrollHeight;")
while True:
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(5)
    height = driver.execute_script("return document.body.scrollHeight;") 
    if height == check_height: 
        break 
    check_height = height

    listElements = driver.find_elements_by_css_selector(".company-title")

for item in listElements:
    print(item.text)

【问题讨论】:

    标签: python python-3.x selenium selenium-webdriver web-scraping


    【解决方案1】:

    您可以如下添加显式等待:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium import webdriver
    
    driver = webdriver.Chrome()
    driver.get("http://fortune.com/fortune500/list/")
    
    check_height = driver.execute_script("return document.body.scrollHeight;")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        try:
            WebDriverWait(driver, 10).until(lambda driver: driver.execute_script("return document.body.scrollHeight;")  > check_height)
            check_height = driver.execute_script("return document.body.scrollHeight;") 
        except:
             break
    
    
    listElements = driver.find_elements_by_css_selector(".company-title")
    for item in listElements:
        print(item.text)
    

    这应该可以让您避免硬编码 time.sleep()- 而您只是在等待更改 height 值或中断循环以防 height 在滚动后 10 秒后保持不变...

    【讨论】:

    • 在使用 python 绑定提供任何关于 selenium 的解决方案时,Andersson 爵士是首屈一指的。你真是太棒了。非常感谢。
    【解决方案2】:

    您需要使用显式等待,如下所示:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get("http://somedomain/url_that_delays_loading")
    try:
        element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "myDynamicElement"))
        )
    finally:
        driver.quit()
    

    更多详情在这里http://selenium-python.readthedocs.io/waits.html

    【讨论】:

    • 看来OP不是在寻找ExplicitWait实现的基础,而是具体的解决方案……
    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多