如何使用Python无需模拟点击抓取Mercado Livre商品各变体的图片URL
Mercado Livre 无模拟点击商品变体图片抓取方案
Mercado Livre 的全量商品数据(含所有变体属性、对应图片关联关系、图片资源地址)会在首次请求页面时直接预加载到 HTML 中,存储在全局变量window.__PRELOADED_STATE__里,你之前报错是因为误用了速卖通专属的window.runParams变量,并非数据没有预加载。
具体实现步骤如下:
- 第一步:用
requests发起普通 GET 请求获取页面原始 HTML,请求头补充正常浏览器 UA 即可避免基础反爬拦截,无需启动浏览器或模拟操作 - 第二步:通过正则提取 HTML 中
window.__PRELOADED_STATE__对应的 JSON 字符串,解析为 Python 字典 - 第三步:定位核心数据节点:
- 所有图片的基础信息存放在
data['initialState']['components']['gallery']['pictures']数组中,每个条目包含图片ID、缩略图URL、格式等信息 - 所有变体信息以及变体和图片的关联关系存放在
data['initialState']['components']['variations']['data']数组中,每个变体条目下的pictures字段对应关联的图片ID,即使多张变体共享同一张图片也能精准匹配
- 所有图片的基础信息存放在
- 第四步:拿到缩略图URL后,按照你已知的规则,将URL末尾的
-R.xxx替换为-F.xxx即可得到高清图链接
参考代码如下:
import requests import re import json # 基础请求配置 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } product_url = "替换为你的Mercado Livre商品链接" # 拉取页面原始内容 resp = requests.get(product_url, headers=headers) resp.encoding = resp.apparent_encoding html_content = resp.text # 提取预加载JSON数据 json_match = re.search(r'window\.__PRELOADED_STATE__\s*=\s*(.*?)\s*;', html_content) if not json_match: raise ValueError("未匹配到页面预加载数据") raw_json = json_match.group(1) preload_data = json.loads(raw_json) # 提取图片和变体内关联数据 all_pictures = preload_data['initialState']['components']['gallery']['pictures'] variation_list = preload_data['initialState']['components']['variations']['data'] # 遍历输出每个变体对应的缩略图链接 for variation in variation_list: variation_name = variation['name'] related_pic_ids = {pic['id'] for pic in variation['pictures']} thumb_urls = [pic['url'] for pic in all_pictures if pic['id'] in related_pic_ids] # 生成高清图链接 hd_urls = [f"{url.rsplit('-',1)[0]}-F.{url.rsplit('.',1)[1]}" for url in thumb_urls] print(f"变体【{variation_name}】的缩略图列表:{thumb_urls}") print(f"变体【{variation_name}】的高清图列表:{hd_urls}")
该方案对按钮形式、下拉菜单形式的变体页面完全通用,两种页面的预加载数据结构一致,无需做额外适配。
内容的提问来源于stack exchange,提问作者José Guedes
相关产品推荐
相关产品推荐

