You need to enable JavaScript to run this app. 如何从目标URL高效提取JSON中的price与priceValidUntil字段?
优惠活动
大模型
产品
解决方案
定价
更多

如何从目标URL高效提取JSON中的price与priceValidUntil字段?

实现问题排查与优化方案

你当前实现的核心问题

  • 这套写法本身无法正常跑通:请求目标Home Depot产品页拿到的是完整的HTML网页文档,不是纯格式的JSON响应,直接调用json.loads()解析整个响应文本,会直接抛出JSON格式解析错误,根本无法取到对应的offers字段。
  • 运行耗时长的根源:你当前的逻辑默认要把整个网页几MB的全量HTML内容全部下载、加载到内存之后才开始尝试解析,没有针对性定位目标数据的位置,大量带宽和计算资源都浪费在无关的HTML标签、前端脚本、页面文案上了。

高效正确的实现思路

你需要提取的带offers结构的产品数据,是标准的Schema.org结构化标记,固定嵌在页面的<script type="application/ld+json">标签内部,完全不需要加载全页内容就能精准定位:

  • 给请求补充常规浏览器请求头,避免被网站反爬机制拦截、返回验证页面,保证能拿到正常的产品页内容。
  • 采用流式请求逐段读取响应内容,匹配到目标结构化JSON块后就停止读取,不需要下载完整的全量网页。
  • 直接对定位到的JSON块做解析,提取需要的price和priceValidUntil字段即可。

参考实现代码

import requests
import json
import re

# 配置常规请求头,模拟真实浏览器访问
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"
}
target_url = "https://www.homedepot.com/p/ZLINE-Kitchen-and-Bath-36-DuraSnow-Stainless-Steel-Range-Hood-with-Hand-Hammered-Copper-Shell-8654HH-36-8654HH-36/311287560"

target_product_data = None
# 开启流式请求,逐块读取响应,不一次性加载全页内容
with requests.get(target_url, headers=headers, stream=True) as resp:
    # 匹配ld+json标签的正则规则
    ld_json_pattern = re.compile(r'<script type="application/ld\+json">(.*?)</script>', re.S)
    content_buffer = ""
    # 每次读取1KB内容到缓冲区做匹配
    for chunk in resp.iter_content(chunk_size=1024, decode_unicode=True):
        content_buffer += chunk
        matched = ld_json_pattern.search(content_buffer)
        if not matched:
            continue
        try:
            parsed_block = json.loads(matched.group(1))
            # 定位到带offers字段的产品结构化数据就停止读取
            if isinstance(parsed_block, dict) and "offers" in parsed_block:
                target_product_data = parsed_block
                break
        except json.JSONDecodeError:
            # 遇到不完整的JSON块就继续读取下一段内容补全
            continue

# 提取目标字段
if target_product_data:
    price = target_product_data["offers"]["price"]
    price_valid_until = target_product_data["offers"]["priceValidUntil"]
    print(f"提取结果:产品价格 {price} USD,价格有效期截止 {price_valid_until}")

优化效果说明

  • 这套逻辑只需要读取到目标JSON块所在的位置就停止下载,通常仅需要读取几百KB的内容,对比全量下载整个2-3MB的网页,速度能提升5-10倍。
  • 解析过程不需要遍历整个HTML的所有DOM节点,直接对定位到的JSON内容做解析,计算开销也会大幅降低。
  • 这套逻辑不依赖页面的复杂DOM结构,只要目标结构化JSON块的标签名不变,就可以稳定运行;如果后续网站调整了JSON块的存放位置,只需要微调正则匹配规则即可。

内容的提问来源于stack exchange,提问作者chrisHG

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 05:45:03