使用Requests HTML爬取图片返回data:image/gif;base64占位符 如何获取真实商品URL
问题原因
现在绝大多数电商站点都会对商品图片做懒加载优化:低像素占位图默认放在src属性中,真实高清商品图会存储在data-src/data-original/data-lazy等自定义属性,或是多尺寸集合的srcset属性中,仅当图片滚动到可视区域时才会替换src的内容。你直接提取src属性自然只能拿到占位图。
解决方案
第一步:定位真实图片存储的属性
先打印目标img标签的全部属性,确认站点存放真实图片的字段:
images = r.html.find('img.product-media-gallery__item-image') # 输出第一个匹配元素的所有属性,找到存高清图的键名 print(images[0].attrs)
第二步:提取+过滤有效图片URL
优先读取懒加载自定义属性的内容,再通过关键词、后缀过滤占位图:
valid_img_urls = [] for img in images: # 优先取懒加载属性内容,兜底取src img_url = img.attrs.get('data-src') \ or img.attrs.get('data-original') \ or img.attrs.get('data-lazy') \ or img.attrs.get('src', '') # 过滤占位图:排除带占位特征、非图片格式的地址 placeholder_keywords = ['placeholder', 'blank', 'lazy', '1x1', '10x10', 'base64'] if any(key in img_url for key in placeholder_keywords): continue if not img_url.endswith(('jpg', 'jpeg', 'png', 'webp', 'avif')): continue valid_img_urls.append(img_url) # 输出所有有效商品图地址 for url in valid_img_urls: print(url)
特殊情况:srcset属性处理
如果真实图片存放在srcset多尺寸集合中,提取最大分辨率的地址即可:
def get_max_size_img_from_srcset(srcset_str): src_items = [item.strip().split() for item in srcset_str.split(',') if item.strip()] max_size = 0 max_url = '' for url, size_flag in src_items: size = int(size_flag.replace('w', '')) if size > max_size: max_size = size max_url = url return max_url # 提取时增加srcset判断逻辑 for img in images: if 'srcset' in img.attrs and img.attrs['srcset'].strip(): img_url = get_max_size_img_from_srcset(img.attrs['srcset']) else: # 走之前的属性读取逻辑 img_url = img.attrs.get('data-src') or img.attrs.get('src', '') # 后续过滤逻辑不变
内容的提问来源于stack exchange,提问作者lanavargas2002
相关产品推荐
相关产品推荐

