当当商品详情数据采集,当当API接口(json数据返回)

知名用户180079054731年前未分类816
以下是针对当当商品详情数据采集的 API 接口调用方案,专注于 JSON 数据返回的接口解析和 Python 实现,包含完整代码和字段说明:

一、核心 API 接口确认

经过验证,当当网目前稳定可用的商品详情相关 API 如下(均返回 JSON 格式):
接口功能请求 URL必传参数说明
商品基础信息https://product.dangdang.com/index.php?r=product/getProductInfoproductId商品 ID(如 29383160)
商品规格参数https://product.dangdang.com/index.php?r=product/getProductParamproductId详细规格(如书籍页数、开本)
商品评论分页https://product.dangdang.com/index.php?r=comment/listproductId,page评论列表(page 为页码)

二、Python 完整采集代码(含多接口整合)

python
运行
import requestsimport jsonimport timeimport randomfrom typing import Dict, Optionalclass DangdangSpider:
    def __init__(self):
        # 随机User-Agent池,降低反爬风险
        self.user_agents = [
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/125.0.0.0 Safari/537.36",
            "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_5) Firefox/126.0",
            "Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) Mobile/15E148"
        ]
        self.headers = {
            "User-Agent": random.choice(self.user_agents),
            "Referer": "https://product.dangdang.com/",
            "Accept-Language": "zh-CN,zh;q=0.9"
        }

    def _fetch(self, url: str, params: Dict) -> Optional[Dict]:
        """通用请求方法,处理异常和JSON解析"""
        try:
            # 随机延迟1-2秒,避免高频请求
            time.sleep(random.uniform(1, 2))
            response = requests.get(
                url=url,
                params=params,
                headers=self.headers,
                timeout=15
            )
            response.raise_for_status()  # 触发4xx/5xx错误
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"请求错误: {str(e)}")
        except json.JSONDecodeError:
            print("返回数据不是有效JSON")
        return None

    def get_product_base(self, product_id: str) -> Optional[Dict]:
        """获取商品基础信息(名称、价格、作者等)"""
        url = "https://product.dangdang.com/index.php?r=product/getProductInfo"
        params = {"productId": product_id}
        data = self._fetch(url, params)
        return data.get("data") if data and data.get("status") == 1 else None

    def get_product_params(self, product_id: str) -> Optional[Dict]:
        """获取商品规格参数(如书籍开本、页数)"""
        url = "https://product.dangdang.com/index.php?r=product/getProductParam"
        params = {"productId": product_id}
        data = self._fetch(url, params)
        return data.get("data") if data and data.get("status") == 1 else None

    def get_product_comments(self, product_id: str, page: int = 1) -> Optional[Dict]:
        """获取商品评论(分页,每页20条)"""
        url = "https://product.dangdang.com/index.php?r=comment/list"
        params = {
            "productId": product_id,
            "page": page,
            "size": 20,
            "sortType": 1  # 1=按时间排序,2=按 helpful 排序
        }
        data = self._fetch(url, params)
        return data.get("data") if data and data.get("status") == 1 else None

    def collect_all(self, product_id: str) -> Dict:
        """整合所有信息,返回完整数据"""
        return {
            "base_info": self.get_product_base(product_id),
            "params": self.get_product_params(product_id),
            "comments_page1": self.get_product_comments(product_id, page=1)
        }# 示例使用if __name__ == "__main__":
    spider = DangdangSpider()
    product_id = "29383160"  # 示例商品ID(可替换)
    
    # 采集完整数据
    product_data = spider.collect_all(product_id)
    
    # 打印关键信息
    if product_data["base_info"]:
        print("===== 基础信息 =====")
        base = product_data["base_info"]
        print(f"商品名称:{base.get('product_name')}")
        print(f"原价:{base.get('original_price')} | 当前价:{base.get('current_price')}")
        print(f"作者:{base.get('author')} | 出版社:{base.get('publisher')}")
        print(f"好评率:{base.get('good_comment_rate')}%")
    
    if product_data["params"]:
        print("\n===== 规格参数 =====")
        for param in product_data["params"].get("param_list", []):
            print(f"{param.get('name')}: {param.get('value')}")  # 如"开本: 16开"
    
    if product_data["comments_page1"]:
        print("\n===== 评论示例 =====")
        comments = product_data["comments_page1"]["list"]
        if comments:
            print(f"评论总数:{product_data['comments_page1']['total']}")
            print(f"用户评论:{comments[0].get('comment_content')[:80]}...")

三、关键字段说明

  1. 基础信息接口(base_info):
    • product_name:商品名称

    • current_price:当前售价(字符串,需处理)

    • original_price:原价

    • author:作者(书籍类)

    • publisher:出版社

    • publish_date:出版日期

    • good_comment_rate:好评率(百分比)

    • sales_desc:销售描述(如 “月销 XX”)

  2. 规格参数接口(params):
    • param_list:参数列表,每个元素含 name(参数名)和 value(参数值)

    • 书籍类示例:[{"name":"页数","value":"320"}, {"name":"ISBN","value":"9787115546081"}]

  3. 评论接口(comments):
    • total:评论总数

    • list:评论列表,含 comment_content(评论内容)、score(评分)、user_name(用户名)等

四、反爬与稳定性处理

  1. 请求控制:
    • 加入随机 User-Agent 和请求延迟(已实现)

    • 批量采集时建议每 10 个商品切换一次代理 IP

  2. 接口变更应对:
    • 若接口失效,通过浏览器 F12 开发者工具的「Network」面板,筛选「XHR」类型请求,重新抓取新接口 URL 和参数

  3. 合法性:
    • 遵守当当网 robots.txt(https://www.dangdang.com/robots.txt)

    • 非商业用途,单 IP 日请求量控制在 1000 次以内

通过上述代码,可稳定采集当当商品的结构化 JSON 数据,无需解析复杂 HTML,适用于商品分析、比价系统等场景。


相关文章

企业级实战:淘宝铺货核心API接口说明(含JSON返回)

前言一、铺货核心API说明(企业级极简)淘宝铺货核心依赖两类API,分别对应「获取货源商品数据」和「自有店铺上架商品」,适配跨店铺货、多平台同步、批量上架等企业场景,全程合规调用,避免爬虫风险。1....

Python 请求淘宝 API 接口:能帮程序员解决哪些问题?

一、自动化获取店铺与商品数据自动获取全店商品、标题、价格、库存、SKU、主图、详情不用人工登录、复制、粘贴、截图程序员只需写少量代码,几分钟拿到全店数据二、自动同步商品到多平台淘宝 → 拼多多、抖音、...

微店商品详情 API 签名机制实现:轻量加密逻辑与多语言适配

微店商品详情 API 签名机制实现:轻量加密逻辑与多语言适配签名机制核心逻辑微店 API 签名采用 MD5/HMAC-SHA256 加密 + 参数排序拼接 机制,确保请求合法性和数...

如何申请淘宝开放平台API权限

申请淘宝开放平台API权限的流程如下:注册淘宝开放平台开发者账号访问淘宝开放平台官网(https://open.taobao.com/),使用支付宝账号或手机号完成注册。提交个人/企业实名认证信息(如...

京东商品详情 API 接口全解析:从签名机制到高可用数据架构

前言主题:以技术视角拆解京东商品详情 API 的接入体系、鉴权签名原理、数据结构设计,以及在生产环境中构建稳定采集链路的工程实践。一、为什么"商品详情"是电商数据体系的核心接口在电...

京东商品详情 API 完整解析 + 标准 JSON 返回示例

本文以京东联盟开放接口 jd.union.open.goods.detail.query 为例,完整说明接口结构、字段含义、业务用途,并提供可直接用于开发调试的标准 JSON 返回示例。一、接口基本信...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。