You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 17:18:05