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

时间:2020-06-26 17:51:12

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

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

此问题是此问题的后续解答,Selenium Webdriver not finding XPATH despite seemingly identical strings。我通过更新代码使其更优雅地工作来确定问题实际上并非来自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尝试给它时间加载,但是我还尝试了整个站点范围内的等待调用以及time.sleep调用。等待似乎无法解决问题。我正在寻找最简单的方法来处理这些延迟加载的图像,最好是在Selenium中使用,但是如果我可以将其他库或产品与我已经拥有的Selenium代码一起使用,那将是很好的。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您的图像只有在滚动到视图中时才会加载。 Selenium Python文档在其FAQ中包含它是一个非常普遍的要求。根据{{​​3}},以下脚本将在抓取图像之前向下滚动页面。

    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变量,它将向下滚动在尽可能长的时间内。

this answer可以对仍在加载的所有剩余图像进行追赶。

测试运行产生了82张图像,我确认使用implicit wait高亮显示了82张图像,将其全部刮在了页面上。根据允许加载的图像数量,您会看到不同的数字。