如何在 selenium 中处理延迟加载的图像?

Eri*_*awa 1 selenium lazy-loading webdriver web-scraping python-3.x

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

这个问题是这个问题的后续,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')))
Run Code Online (Sandbox Code Playgroud)

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

Luc*_*can 5

您的图片只有在滚动到视图中时才会加载。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))
Run Code Online (Sandbox Code Playgroud)

为了不永远滚动鞋子(似乎),我break在 5 次迭代后添加了一个,但是,您可以随意删除i变量,它会尽可能长时间地向下滚动。

隐含的等待在那里,让追赶任何剩余图像仍处于加载。

测试运行产生了 82 张图像,我确认它使用Chrome 的 DevTools 选择器抓取了页面上的所有图像,其中突出显示了 82。根据允许加载的图像数量,您将看到不同的数字。

  • @EricHasekawa 出于好奇,你为什么不接受我的回答? (2认同)