使用Selenium抓取ASOS懒加载商品图片遇阻,寻求解决方案
解决ASOS商品页懒加载图片及Video海报抓取问题
你的问题核心在于ASOS的懒加载机制和混合媒体元素(img/video):
- 未进入视口的商品图片不会加载真实
src,仅保留懒加载属性(比如data-src) - 部分商品用带
poster属性的video标签展示封面,而非img标签
下面是针对这两个问题的解决方案:
核心思路
- 逐个滚动到商品容器,触发懒加载,让浏览器加载真实图片地址
- 同时兼容
img标签和video标签的海报提取 - 优先读取已加载的
src, fallback到懒加载属性(比如data-src)
修改后的代码实现
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.action_chains import ActionChains imgsSrc = set() # 等待所有商品容器加载完成(确保已点击完所有"加载更多") containers = WebDriverWait(driver, 20).until( EC.presence_of_all_elements_located((By.CLASS_NAME, "productMediaContainer_kmkXR")) ) for idx, container in enumerate(containers): # 滚动到当前商品容器,触发懒加载 ActionChains(driver).move_to_element(container).perform() # 等待元素完全可见,确保图片加载完成 WebDriverWait(driver, 5).until(EC.visibility_of(container)) # 尝试提取img标签的图片地址 try: img_elem = container.find_element(By.TAG_NAME, "img") # 先取已加载的src,没有则取懒加载的data属性(根据ASOS实际属性调整) img_src = img_elem.get_attribute("src") or img_elem.get_attribute("data-src") if img_src: imgsSrc.add(img_src) except: # 若没有img,提取video标签的poster属性 try: video_elem = container.find_element(By.TAG_NAME, "video") poster_src = video_elem.get_attribute("poster") if poster_src: imgsSrc.add(poster_src) except: print(f"第{idx+1}个商品未找到有效图片资源") print(f"成功抓取到 {len(imgsSrc)} 张图片地址")
关键细节说明
- 滚动触发懒加载:必须逐个滚动到每个商品容器,而不是只滚到页面底部——ASOS的懒加载是基于元素是否进入视口,批量滚动到底部可能无法触发所有元素的加载
- 懒加载属性兼容:如果发现
src还是占位图,检查元素的其他属性(比如data-image、data-lazy-src),替换代码中的data-src即可 - 异常处理:用try-except分别处理img和video的情况,避免单个商品的异常中断整个抓取流程
- 等待机制:使用
WebDriverWait确保元素渲染完成,减少因页面加载延迟导致的元素找不到问题
内容的提问来源于stack exchange,提问作者Clg9100
相关产品推荐
相关产品推荐

