python-3.x - 如何处理 Selenium 中的延迟加载图像?

标签 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')))

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

最佳答案

您的图片只有在滚动到 View 中时才会加载。这是 Selenium Python 文档在其 FAQ 中的常见要求。 .改编自 this answer ,下面的脚本将在抓取图像之前向下滚动页面。

    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变量,它将尽可能向下滚动。

implicit wait是否允许追赶仍在加载的任何剩余图像。

测试运行产生了 82 张图像,我确认它已经通过使用 Chrome's DevTools selector 抓取了页面上的所有图像突出显示 82。根据允许加载的图像数量,您会看到不同的数字。

关于python-3.x - 如何处理 Selenium 中的延迟加载图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62600288/

相关文章:

python - 在 Fedora 24 上的 Python3 中使用 `cairo.Region` 时出现段错误

python - from x import y 适用于 Windows 但不适用于 Ubuntu

python - selenium IDE 命令 'openWindow' 是否有等效的 selenium python webdriver 命令?

java - Jbehave:我可以获得一个运行 Jbehave 的示例,对此我有几个问题。

java - 在 iframe 内导航后无法再次获取 iframe

python - 遍历 numpy 数组以填充 python 列表

python - 如何在pymysql中使用多个变量

python - scrapy,如何向表单发送多个请求

firebase - 在 firebase 云函数中运行 puppeteer 代码

Python Selenium Google 登录机器人