当前位置: 首页 > 知识库问答 >
问题:

如何在Selenium中处理惰性加载的映像?

单修德
2023-03-14

在标记为重复之前,请考虑我已经翻阅了许多相关的堆栈溢出帖子,以及网站和文章。我还没有找到解决办法。

这个问题是Selenium Webdriver找不到XPATH的后续问题,尽管字符串看起来完全相同。通过更新代码以更优雅的方式工作,我确定问题实际上不是来自xpath方法:

for item in feed:
    img_div = item.find_element_by_class_name('listing-cover-photo ')
    img = WebDriverWait(img_div, 10).until(
            EC.visibility_of_element_located((By.TAG_NAME, 'img')))

这适用于前5ish元素。但是之后它会超时,通过获取img_div的内部html并打印它,我发现对于超时的元素,不是我想要的图像,而是一个具有类“lazyload-placeholder”的div。这使我开始寻找惰性加载的元素,但我找不到答案。正如您所看到的,我正在使用WebDriverWait尝试给它加载时间,但我也尝试了站点范围内的wait调用,以及time.sleep调用。等待似乎并不能解决问题。我正在寻找处理这些延迟加载映像的最简单的方法,最好是在Selenium中,但是如果有其他库或产品可以与我已经有的Selenium代码一起使用,那就太好了。感谢任何帮助。

共有1个答案

夏学名
2023-03-14

您的图像只有在滚动到视图中时才会加载。Selenium Python文档在FAQ中都有这样的要求。根据这个答案,下面的脚本将在刮削图像之前向下滚动页面。

    driver.get("https://www.grailed.com/categories/footwear")

    SCROLL_PAUSE_TIME = 0.5
    i = 0
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(SCROLL_PAUSE_TIME)
        new_height = driver.execute_script("return document.body.scrollHeight")
        if new_height == last_height:
            break
        last_height = new_height
        i += 1
        if i == 5:
            break

    driver.implicitly_wait(10)
    shoe_images = driver.find_elements(By.CSS_SELECTOR, 'div.listing-cover-photo img')

    print(len(shoe_images))

为了避免(似乎)永远滚动鞋子,我在5次迭代后添加了break,但是,您可以自由地删除I变量,它将尽可能地向下滚动。

存在隐式等待以允许对仍在加载的任何剩余映像进行追赶。

一个测试运行产生了82个图像,我确认它已经通过使用Chrome的DevTools选择器刮去了页面上的所有图像,该选择器突出显示了82。根据允许加载的图像数量,您将看到一个不同的数字。

 类似资料:
  • 问题内容: 好吧,我的疑问很简单:为了获得最佳性能,建议在我不需要使用的属性中始终使用惰性初始化(这很明显)。因此,请想象以下类: 在我的主类中,我将未初始化的具有“ type”属性的人称为“波纹管”: 因此,我从数据库中获得了一个简单的Person对象,并在控制台上打印了person类型。在这一刻,代理CGLIB可以发挥作用,并且可以发挥作用,一切正常。 但是,我在这里提出我的问题: 1-当我请

  • 我是新来的。我想为我的flutter应用程序实现惰性加载功能,它使用sqflite数据库存储数据。在我的数据库中有1000+行。当应用程序打开时,我想加载10个项目。当我达到第10个数据时,然后加载下一个10个,以此类推。如何实现此功能??

  • 本文向大家介绍如何在Java中处理Selenium中的代理?,包括了如何在Java中处理Selenium中的代理?的使用技巧和注意事项,需要的朋友参考一下 我们可以借助PROXY类在Java中使用Selenium处理代理。

  • Javaworld Hibernate入门教程状态: 会话的实例是轻量级的,并且创建和销毁的成本很低。这很重要,因为您的应用程序需要一直创建和销毁会话,也许是在每次请求时。Hibernate会话不是线程安全的,根据设计,一次只能由一个线程使用。 由于Tomcat在多个线程中处理HTTP请求,因此线程安全在Web应用程序中是非常必要的。因此,我在回答中读到: 会话应该是每个方法的局部变量。通过这样做

  • 有什么方法可以声明惰性加载队列吗?

  • 问题内容: 我正在使用Python(2.7)’json’模块来处理各种JSON feed。不幸的是,这些提要中的某些不符合JSON标准- 特别是某些键没有用双语音标记(“)包装。这导致Python出现错误。 我想写一个丑陋的代码来解析和修复传入的数据之前,我想问一下-有什么方法可以让Python解析此格式错误的JSON或“修复”数据,以便有效的JSON? 工作实例 破例 我编写了一个小的REGEX