【问题标题】:Handling a slow-loading webpage removing hardcoded delay from my script处理加载缓慢的网页,从我的脚本中删除硬编码延迟
【发布时间】:2018-05-03 19:20:03
【问题描述】:

我在 python 中编写了一个与 selenium 相关的脚本,以解析网页中的一些名称,该网页处理延迟加载方法,网页在每次滚动到底部时都会显示其内容。我的脚本无误地做到了。但是,我无法解决的唯一问题是从我的脚本中删除硬编码延迟。我真的不知道如何使用explicit wait 而不是hardcoded delay 保持逻辑(在脚本中应用),因为它可以提高效率。提前感谢您的帮助。

Webpage link

这是我迄今为止尝试过的(正在工作的):

import time
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("find_the_link_above")

last_len = len(driver.find_elements_by_class_name("listing__name--link"))
new_len = last_len

while True:
    last_len = new_len
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(3) ##I wish to kick out this harcoded delay and use explicit wait in place

    items = driver.find_elements_by_class_name("listing__name--link")
    new_len = len(items)
    if last_len == new_len:break

for item in items:
    print(item.text)
driver.quit()

【问题讨论】:

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


    【解决方案1】:

    这是实现 ExplicitWait 的方式:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait as wait
    from selenium.common.exceptions import TimeoutException
    
    driver = webdriver.Chrome()
    driver.get("https://www.yellowpages.ca/search/si/1/coffee/all%20states")
    
    last_len = len(driver.find_elements_by_class_name("listing__name--link"))
    
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        try:
            wait(driver, 3).until(lambda driver: len(driver.find_elements_by_class_name("listing__name--link")) > last_len)
            items = driver.find_elements_by_class_name("listing__name--link")
            last_len = len(items)
        except TimeoutException:
            break
    
    for item in items:
        print(item.text)
    driver.quit()
    

    这应该允许您向下滚动并等待最多 3 秒(如果需要,增加超时),直到元素数量在循环中增加或打破 while 循环以防数量保持不变

    【讨论】:

      【解决方案2】:

      要解析来自webpage 的名称,您可以使用以下代码块:

      • 代码块

        from selenium import webdriver
        from selenium.webdriver.chrome.options import Options
        
        items = []
        
        options = Options()
        options.add_argument("start-maximized")
        options.add_argument("disable-infobars")
        options.add_argument("--disable-extensions")
        options.add_argument("--no-sandbox")
        driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\path\to\chromedriver.exe')
        driver.get('https://www.yellowpages.ca/search/si/1/coffee/all%20states')
        items=driver.find_elements_by_css_selector("h3[itemprop='name']>a.listing__name--link")
        while(driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")):
            items.append(driver.find_elements_by_css_selector("h3[itemprop='name']>a.listing__name--link"))
        for item in items:
            print(item.text)
        
      • 控制台输出

        Tim Hortons
        Downtown Expresso Café
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Starbucks
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Starbucks
        Tim Hortons
        Tim Hortons
        Budokan
        Anchor Cafe House
        Starbucks
        Tim Hortons
        Tim Hortons
        Starbucks
        Tim Hortons
        Starbucks
        Tim Hortons
        Tim Hortons
        Colonial Coffee Co Ltd
        Personal Service Coffee
        Tim Hortons
        Suzie's Grill Cafe Inc
        Loaves N Fishes Catering & Cafe
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Tim Hortons
        Elizabeth Houte Coiffure
        The Grind House Cafe
        Tim Hortons
        Black Bench Coffee Roasters
        Tim Hortons
        

      【讨论】:

      • 我现有的脚本给了我 127 个名字(全名),而你建议的脚本给了我前 40 个结果。由于硬编码的延迟,我在上面尝试的方式有时会变得不一致。但是,抽动延迟我总能得到正确的结果。所以,我毕竟没有使用硬编码延迟而不是前几个结果。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多