You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态滚动页面图片URL爬取难题:滚动后旧图片消失如何提取全量URL

解决动态滚动网站图片URL抓取不全的问题

问题说明

爬取支持动态滚动的网站时,滚动到新位置后之前的图片会消失,导致无法提取全部图片URL。原代码尝试直接滚动到底部,但未及时抓取当前内容,且错误获取了<a>标签的文本而非图片URL。

原代码

wd.get('https://dynamicWebPage')
scroll_pause_time = 2
screen_height = wd.execute_script("return window.innerHeight")

last_scroll_height = wd.execute_script("return document.body.scrollHeight")
items = [] 
while True:
    wd.execute_script("window.scrollTo(0, document.body.scrollHeight);")

    time.sleep(scroll_pause_time)

    new_scroll_height = wd.execute_script("return document.body.scrollHeight")
    print(new_scroll_height, last_scroll_height)
    if new_scroll_height == last_scroll_height:
      break
    last_scroll_height = new_scroll_height
    elements = wd.find_elements(By.XPATH,"//a")
    items.extend([element.text for element in elements])

解决方案

针对图片滚动后消失的问题,核心思路是逐屏滚动+即时抓取当前可见区域的图片URL,同时用显式等待提升可靠性:

  • 逐屏滚动:每次滚动一屏高度,而非直接滚到底,确保当前加载的图片元素在被销毁前被抓取
  • 抓取图片URL:定位<img>标签,提取src或data-src(很多动态网站用懒加载属性存真实地址)
  • 显式等待:等待新图片元素加载完成,代替固定sleep
  • 去重:用集合存储URL,避免重复抓取

修改后的代码

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

wd = webdriver.Chrome()
wd.get('https://dynamicWebPage')
wait = WebDriverWait(wd, 10)
image_urls = set()  # 用集合自动去重
screen_height = wd.execute_script("return window.innerHeight")
current_scroll = 0

while True:
    # 逐屏滚动
    current_scroll += screen_height
    wd.execute_script(f"window.scrollTo(0, {current_scroll});")
    
    # 等待新图片加载完成
    try:
        wait.until(EC.presence_of_all_elements_located((By.XPATH, "//img")))
    except:
        # 无新元素加载,退出循环
        break
    
    # 提取当前可见图片的URL(优先取懒加载属性data-src)
    images = wd.find_elements(By.XPATH, "//img")
    for img in images:
        img_url = img.get_attribute("data-src") or img.get_attribute("src")
        if img_url:
            image_urls.add(img_url)
    
    # 检查是否滚动至页面底部
    total_height = wd.execute_script("return document.body.scrollHeight")
    if current_scroll >= total_height - screen_height:
        break

# 输出去重后的图片URL列表
print(list(image_urls))
wd.quit()

关键说明

  1. 逐屏滚动:每次滚动一屏高度,避免一次性滚到底导致已加载的图片元素被页面销毁机制移除
  2. 懒加载适配:多数动态网站用data-src存储真实图片地址,src仅放占位图,因此优先提取data-src
  3. 显式等待:WebDriverWait会等待图片元素加载完成,比固定time.sleep()更灵活,避免等待不足或过长
  4. 自动去重:集合会自动过滤重复的图片链接,无需额外处理

内容的提问来源于stack exchange,提问作者Basir Mahmood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:52:19