达芬奇文西 2024-09-15 00:48 采纳率: 0%
浏览 6
已结题

selenium 等待加载的问题

selenium爬虫等待网页加载的问题
网上搜索有很多类似下面的答案:

driver.get('https://www.baidu.com')
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID,
"kw")))

其解释是:WebDriverWait检测到条件出现,就继续执行下面的代码,不用浪费时间等待加载。

但我在实际执行时发现行不通,因为driver.get默认就是无限等待,直到网页加载完毕,下面的WebDriverWait语句根本不会被执行。如果执行了WebDriverWait,那说明整个网页都加载完毕了,WebDriverWait语句的存在也没有意义了。

假如网页加载很慢(假定加载完需要30s),但我所需要的元素很快就加载出来了(假定3到8s就加载出来了)。那么怎样实现当我所需元素加载出来了,就去执行下面的代码,不再等待剩下的加载内容?

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-15 00:49
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    您遇到的这个问题,确实是使用Selenium时经常需要面对的问题之一。网页加载的时间并不总是固定的,有时候某些元素会更快地加载出来,而我们并不希望浪费时间去等待整个页面完全加载完毕。为了实现您的需求,我们可以使用Selenium提供的WebDriverWait结合expected_conditions来实现有条件的等待。这样,我们可以等待特定的元素加载完成,而不必等待整个页面加载完毕。

    这里有一些建议供您参考:

    1. 使用显式等待(Explicit Wait): WebDriverWait 是Selenium的显式等待方式,它会不断检查指定的条件是否满足,而不是简单地等待固定时间。当您想要的元素加载完毕时,它就会继续执行后面的代码。这是与您的需求最为匹配的方式。例如:
    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.Chrome()  # 或其他浏览器驱动
    driver.get('https://www.example.com')  # 打开网页
    try:
        element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "your_element_id")))  # 等待特定元素加载
        # 元素加载后执行的代码...
    finally:
        driver.quit()  # 结束浏览器会话
    

    这样,WebDriver会等待指定的元素加载完成(最多等待10秒),然后执行后续的代码。如果元素在指定的时间内没有加载出来,它会抛出一个TimeoutException。您可以捕获这个异常来决定如何处理这种情况。 2. 结合JavaScript执行: 在某些情况下,您可以结合JavaScript来检测元素是否可用。例如,使用execute_script方法来执行JavaScript代码检查元素是否可见或可点击。这种方法在某些场景下可能更为灵活。 3. 处理页面中的异步加载: 如果页面中有异步加载的内容(如AJAX请求),您可能需要更复杂的等待策略来确保异步内容也已经加载完毕。这可能涉及到检查特定的AJAX请求是否完成或使用特定的页面元素作为加载完成的标志。 4. 动态调整等待时间: 对于动态内容或网络状况不佳的情况,您可能需要动态地调整等待时间。这可以通过不断地检查页面状态或使用一些更高级的工具和策略来实现。

    请注意,为了更可靠地使用这些技术,您需要了解页面加载和渲染的详细信息,以确定最适合您的场景的策略和条件。希望这些建议能帮助您解决问题!

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月22日
  • 修改了问题 9月15日
  • 创建了问题 9月15日

悬赏问题

  • ¥15 如何解除Uniaccess管控
  • ¥15 微信小程序跳转关联公众号
  • ¥15 Java AES 算法 加密采用24位向量报错如何处理?
  • ¥15 使用X11可以找到托盘句柄,监控到窗口点击事件但是如何在监听的同时获取托盘中应用的上下文菜单句柄
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏