如何使用Scrapy提取页面内嵌JSON中的商品名、价格、ID、URL字段
Trendyol 商品列表页爬虫字段提取方案
原代码存在的核心问题
- 正则匹配规则过于宽泛,未锚定
window.__SEARCH_APP_INITIAL_STATE__目标变量,会匹配页面内所有赋值语句,最终得到的是混杂了无关内容的列表,无法直接取值 - 数据结构路径错误:商品列表存储在JSON的
products数组下,而非product字段,原遍历路径完全不匹配 - 未处理相对路径问题:页面内的商品详情URL是站点相对路径,无法直接访问
- 未区分价格层级:商品基础信息和规格变体(variants)下都有价格字段,原代码未做路径区分
可直接运行的修正代码
import re import json def parse(self, response): # 开启re.S模式匹配跨行JSON,精准锚定目标全局变量 state_match = re.search( r'window\.__SEARCH_APP_INITIAL_STATE__\s*=\s*({.*?})\s*;?\s*</script>', response.text, flags=re.S ) if not state_match: return # 加载完整状态数据 page_data = json.loads(state_match.group(1)) # 遍历商品列表提取目标字段 for product in page_data.get("products", []): yield { "商品ID": product["id"], "商品名称": product["name"], # 拼接完整详情页地址 "商品详情页URL": f"https://www.trendyol.com{product['url']}", # 默认商品售价,若需变体价格可遍历variants字段提取 "商品售价": product.get("price", {}).get("sellingPrice"), # 可选:提取所有规格变体的价格 "变体价格列表": [ { "规格属性": f"{v['attributeName']}:{v['attributeValue']}", "折后价": v["price"]["discountedPrice"], "原价": v["price"]["originalPrice"] } for v in product.get("variants", []) ] }
注意事项
- 若遇到JSON解析报错,可调整正则结束标记,将
</script>替换为window\.,避免页面内紧跟的其他全局变量内容被包含进匹配结果 - 部分商品无默认价格字段时,可优先取第一个变体的价格作为商品展示价
- 若需要翻页爬取,可从该状态数据中提取分页参数拼接后续请求地址
内容的提问来源于stack exchange,提问作者kratos1234
相关产品推荐
相关产品推荐

