Python采集京东商品评论API,json数据返回

以下是使用Python采集京东商品评论API的完整代码示例,包含JSON数据解析和反爬处理:

1. 准备工作

安装必要库:

复制代码
bash
pip install requests fake_useragent

2. 核心代码实现

python 复制代码
python
import requests
import json
import time
from fake_useragent import UserAgent
import hashlib
import random
 
class JDCommentScraper:
    def __init__(self, sku_id):
        self.sku_id = sku_id  # 商品ID(如:100012014970)
        self.base_url = "https://club.jd.com/comment/productPageComments.action"
        self.ua = UserAgent()
        
    def generate_sign(self, params):
        """模拟京东签名算法(简化版)"""
        sorted_params = sorted(params.items(), key=lambda x: x[0])
        raw_str = "".join([f"{k}{v}" for k, v in sorted_params]) + "你的加密密钥"  # 实际需逆向京东签名算法
        return hashlib.md5(raw_str.encode()).hexdigest()
    
    def get_comments(self, page=1, score=0, sort_type=5):
        """获取商品评论"""
        headers = {
            "User-Agent": self.ua.random,
            "Referer": f"https://item.jd.com/{self.sku_id}.html",
        }
        
        params = {
            "productId": self.sku_id,
            "score": score,          # 0:全部, 1:差评, 2:中评, 3:好评
            "sortType": sort_type,   # 5:推荐, 6:时间
            "page": page,
            "pageSize": 10,
            "callback": "fetchJSON_comment98",  # 京东JSONP回调函数名
            "_": str(int(time.time() * 1000)),  # 时间戳
        }
        
        # 实际开发中需替换为合法签名(需逆向京东签名算法)
        # params["sign"] = self.generate_sign(params)
        
        try:
            response = requests.get(
                url=self.base_url,
                headers=headers,
                params=params,
                timeout=10
            )
            
            # 处理JSONP响应(去除回调函数名)
            if response.status_code == 200:
                json_str = response.text.replace("fetchJSON_comment98(", "").replace(");", "")
                data = json.loads(json_str)
                return data
            else:
                print(f"请求失败,状态码: {response.status_code}")
                return None
                
        except Exception as e:
            print(f"请求异常: {e}")
            return None
    
    def parse_comments(self, data):
        """解析评论数据"""
        if not data or "comments" not in data:
            return []
            
        comments = []
        for item in data["comments"]:
            comment = {
                "id": item.get("id"),
                "content": item.get("content"),
                "score": item.get("score"),
                "nickname": item.get("nickname"),
                "creation_time": item.get("creationTime"),
                "images": [img.get("imgUrl") for img in item.get("images", [])],
                "after_comment": item.get("afterUserComment", {}).get("content"),
            }
            comments.append(comment)
        return comments
    
    def run(self, max_pages=5):
        """主采集逻辑"""
        all_comments = []
        for page in range(1, max_pages + 1):
            print(f"正在采集第 {page} 页...")
            data = self.get_comments(page=page)
            if data:
                comments = self.parse_comments(data)
                all_comments.extend(comments)
                
                # 随机延迟,避免触发反爬
                time.sleep(random.uniform(1, 3))
            else:
                break
                
        return all_comments
 
# 使用示例
if __name__ == "__main__":
    scraper = JDCommentScraper(sku_id="100012014970")  # 替换为目标商品ID
    comments = scraper.run(max_pages=3)
    
    # 保存为JSON文件
    with open("jd_comments.json", "w", encoding="utf-8") as f:
        json.dump(comments, f, ensure_ascii=False, indent=2)
    
    print(f"共采集 {len(comments)} 条评论,已保存到 jd_comments.json")

3. 关键说明

  1. 签名算法

    • 京东API实际使用sign参数验证请求合法性,需逆向其JS加密逻辑(可通过浏览器调试sign生成过程)。
    • 示例中简化了签名逻辑,实际需替换为合法签名。
  2. JSONP处理

    • 京东返回的是JSONP格式(如fetchJSON_comment98({...});),需去除回调函数名后解析JSON。
  3. 反爬策略

    • User-Agent轮换 :使用fake_useragent模拟不同浏览器。
    • 请求间隔:随机延迟1-3秒避免高频请求。
    • Referer头:必须携带商品页URL作为Referer。
  4. 字段解析

    • 评论内容、评分、图片、追评等关键字段已提取,可根据需求扩展。

4. 输出示例(jd_comments.json)

css 复制代码
json
[  {    "id": 123456789,    "content": "包装完好,物流速度快,手机运行流畅",    "score": 5,    "nickname": "jd_7e8f9g",    "creation_time": "2023-01-01 10:00:00",    "images": [      "//img30.360buyimg.com/n1/s450x450_jfs/t1/213456/7/8901/123456/63d1f2a1E12345678/1a2b3c4d5e6f7g8h.jpg"    ],
    "after_comment": "使用一周后无卡顿,推荐购买!"
  },
  {
    "id": 987654321,
    "content": "屏幕有亮点,申请换货中",
    "score": 1,
    "nickname": "jd_9a8b7c",
    "creation_time": "2023-01-02 15:30:00",
    "images": [],
    "after_comment":
  }
]
相关推荐
新诺韦尔API2 天前
手机空号检测接口和手机号状态查询接口有什么区别?
大数据·智能手机·api
代码扳手2 天前
从0到1揭秘!Go语言打造高性能API网关的核心设计与实现
后端·go·api
oden2 天前
AI服务商切换太麻烦?一个AI Gateway搞定监控、缓存和故障转移(成本降40%)
后端·openai·api
2501_941982053 天前
文本消息发送:构造请求体、API 调用流程及 Go 语言的 Struct 映射实现
api·rpa
未来魔导3 天前
Go-qdrant-API开启客服系统新模式
go·api·qdrant
梦想的旅途23 天前
Access Token 生命周期管理:详细设计 Token 的获取、缓存、续期和过期处理机制
机器人·企业微信·api·rpa
天远API4 天前
Java后端进阶:处理多数据源聚合API —— 以天远小微企业报告为例
大数据·api
骚戴4 天前
DeepSeek V3 & Llama 3 推理避坑指南:自建 vLLM 集群 vs API 网关架构深度对比
java·人工智能·python·大模型·api·vllm
骚戴5 天前
架构视角:Gemini 3.0 Pro 原生多模态能力的边界与工程落地
人工智能·大模型·llm·api·ai gateway
骚戴5 天前
架构设计之道:构建高可用的大语言模型(LLM) Enterprise GenAI Gateway
java·人工智能·架构·大模型·gateway·api