爬取H&M男装页面仅获少量正常图片URL,其余为base64占位图求助
解决H&M男装专区爬取图片URL出占位图的问题
核心原因
H&M用了两种机制导致你拿到占位图:一是图片懒加载,页面初始化时仅加载可视区域内的真实图片,其余位置用base64占位图填充,需滚动到对应区域才会触发真实图片加载;二是基础反爬策略,未伪装的爬虫请求会被返回占位图。
Requests爬取的解决办法
- 换个属性提取真实URL:H&M的真实图片链接一般存在
data-src或data-image这类属性里,别死盯img标签的src,改成提取这些属性即可。 - 伪装请求头:给请求加上真实的
User-Agent、Referer,必要时复制浏览器登录H&M后的Cookie带上,避免被识别为爬虫。示例代码片段:
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://www2.hm.com/zh_cn/men.html' } response = requests.get('目标页面URL', headers=headers) # 解析HTML时提取data-src而非src
Selenium爬取的解决办法
- 滚动页面触发懒加载:通过JS脚本循环滚动页面到底部,每次滚动后等待2秒,让浏览器加载未显示区域的真实图片。示例代码片段:
from selenium import webdriver from selenium.webdriver.common.by import By from time import sleep options = webdriver.ChromeOptions() options.add_argument("--disable-blink-features=AutomationControlled") # 规避自动化工具识别 driver = webdriver.Chrome(options=options) driver.get('https://www2.hm.com/zh_cn/men.html') # 循环滚动加载全部商品 for _ in range(5): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") sleep(2) # 优先取src,是占位图则替换为data-src images = driver.find_elements(By.TAG_NAME, 'img') for img in images: img_url = img.get_attribute('src') if 'data:image/gif;base64' in img_url: img_url = img.get_attribute('data-src') print(img_url)
- 确保图片加载开启:检查Selenium配置,不要开启禁用图片加载的选项,否则浏览器永远只会返回占位图。
更高效的替代方案
直接抓后端API接口:打开浏览器开发者工具的Network面板,过滤XHR/Fetch请求,找到返回商品列表的接口,直接请求该接口获取数据,里面会包含完整的图片URL,无需处理懒加载问题。
额外提醒:爬取时添加随机延迟,避免频繁请求导致IP被封禁。
内容的提问来源于stack exchange,提问作者Gavin Alfaro
相关产品推荐
相关产品推荐

