动态滚动页面图片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()
关键说明
- 逐屏滚动:每次滚动一屏高度,避免一次性滚到底导致已加载的图片元素被页面销毁机制移除
- 懒加载适配:多数动态网站用
data-src存储真实图片地址,src仅放占位图,因此优先提取data-src - 显式等待:
WebDriverWait会等待图片元素加载完成,比固定time.sleep()更灵活,避免等待不足或过长 - 自动去重:集合会自动过滤重复的图片链接,无需额外处理
内容的提问来源于stack exchange,提问作者Basir Mahmood
相关产品推荐
相关产品推荐

