你想要用 Python 获取得物商品详情的 API 接口数据,并将返回的 JSON 数据解析出来,这是一个典型的爬虫 / API 数据采集需求。

实现思路

得物的 API 接口有反爬机制,直接请求会失败。我们需要:

  1. 模拟浏览器请求头(User-Agent、Referer 等)
  2. 处理接口参数和签名(简化版,仅用于学习)
  3. 发送请求并解析 JSON 响应

完整代码实现

python

运行

import requests
import json
import time

def get_dewu_product_detail(product_id):
    """
    获取得物商品详情API数据
    :param product_id: 商品ID(可从商品链接中获取)
    :return: 解析后的商品详情字典
    """
    # 1. 配置请求头,模拟浏览器访问
    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',
        'Referer': 'https://www.dewu.com/',
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'sec-ch-ua': '"Not_A Brand";v="8", "Chromium";v="120", "Google Chrome";v="120"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site'
    }
    
    # 2. 得物商品详情API(简化版,仅用于学习)
    # 注意:该接口可能随时变化,且正式环境需要处理签名/加密参数
    url = f'https://app.dewu.com/api/v1/product/detail?productId={product_id}'
    
    try:
        # 3. 发送GET请求,添加超时和重试机制
        response = requests.get(
            url=url,
            headers=headers,
            timeout=10
        )
        
        # 4. 检查响应状态码
        response.raise_for_status()
        
        # 5. 解析JSON数据
        result = response.json()
        
        # 6. 打印格式化的JSON(便于查看)
        print("=== 商品详情JSON数据 ===")
        print(json.dumps(result, ensure_ascii=False, indent=4))
        
        return result
        
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        return None
    except json.JSONDecodeError as e:
        print(f"JSON解析失败: {e}")
        return None

# 主程序
if __name__ == "__main__":
    # 替换为实际的得物商品ID(可从商品链接中提取,例如https://www.dewu.com/product/detail?productId=123456 中的123456)
    product_id = "12345678"  # 示例ID,请替换为真实ID
    
    # 获取商品详情
    product_detail = get_dewu_product_detail(product_id)
    
    if product_detail:
        # 提取关键信息示例
        if 'data' in product_detail:
            data = product_detail['data']
            print("\n=== 关键信息提取 ===")
            print(f"商品名称: {data.get('name', '未知')}")
            print(f"商品价格: {data.get('price', '未知')}")
            print(f"商品描述: {data.get('desc', '未知')}")
    else:
        print("未能获取商品详情数据")

代码关键说明

  1. 请求头配置headers 中包含了浏览器的标识信息,这是绕过基础反爬的关键
  2. API 接口:示例中使用的是简化版接口,得物的真实接口会有更多参数(如 timestamp、sign 等),且接口地址可能随时变化
  3. 异常处理:包含了请求超时、网络错误、JSON 解析错误等常见异常的处理
  4. 数据解析:将返回的 JSON 字符串转换为 Python 字典,并提取关键信息

重要注意事项

  1. 反爬机制:得物有严格的反爬措施,包括但不限于:
    • IP 封禁(频繁请求会被封 IP)
    • 参数签名(真实接口需要加密签名参数)
    • Cookie 验证(需要登录态)
  2. 使用规范
    • 该代码仅用于学习和研究,请勿用于商业用途
    • 请遵守得物的用户协议和 robots.txt 规则
    • 建议添加请求延迟(time.sleep()),避免高频请求
  3. 接口更新:得物的 API 接口会不定期更新,代码中的接口地址可能随时失效

进阶优化建议

如果需要稳定采集,建议:

  1. 使用代理 IP 池(避免 IP 封禁)
  2. 添加登录 Cookie(模拟登录状态)
  3. 实现参数签名算法(破解接口加密规则)
  4. 使用异步请求(aiohttp)提高效率
  5. 添加请求频率控制(如每秒最多 1 次请求)

总结

  1. 采集得物 API 数据的核心是模拟浏览器请求处理反爬机制,关键在于配置正确的请求头和参数
  2. 代码中提供了基础的请求和解析框架,但实际使用时需要根据得物接口的变化调整参数和地址
  3. 务必遵守网站规则,合理控制请求频率,避免触发反爬机制导致 IP 封禁
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐