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

知名用户180079054739个月前未分类441
以下是针对当当商品详情数据采集的 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 调试避坑指南,避免正式环境数据污染

淘宝开放平台沙箱环境:商品详情 API 调试避坑指南淘宝开放平台的沙箱环境(Sandbox)是开发者调试 API 的安全环境,尤其对于商品详情类接口(如taobao.item.get),使用沙箱可避免...

如何使用淘宝商品详情API获取商品信息呢

使用淘宝商品详情API(如taobao.item.get)获取商品信息,需遵循以下步骤:从注册开发者账号到处理响应数据,每一步都需细致操作以确保成功调用。以下是详细指南:一、准备工作注册淘宝开放平台账...

如何使用Python实现淘宝商品详情API返回数据的准确性校验

下面给你最简单、直接可用、程序员一看就懂的版本:如何用 Python 实现淘宝商品详情 API 返回数据的准确性校验不绕弯、不废话,直接落地。一、Python 校验淘宝 API 数据准确性:核心做什么...

淘宝商品详情API(taobao.item.get)调用的日常示例以及参数参考

我给你一套最实用、能直接复制跑通的淘宝商品详情 API(taobao.item.get)日常调用示例 + 完整参数参考,你开发时直接套用即可。一、接口基础信息接口名:taobao.item.get地址...

淘宝商品评论API接口技术文档(完整JSON返回样例)

一、接口简介淘宝商品评论核心接口 taobao.item.reviews.get 是淘宝开放平台(TOP)官方评论数据接口,用于获取商品全部用户评价、晒图、追评、评分、SKU规格、用户信息。广泛用于:...

招标网详情数据采集的API接口系列可归纳为以下核心类别与功能特点:

一、核心功能分类基础数据查询接口提供招标公告、中标结果、变更公告等全流程数据查询支持按项目名称、行业类别、采购单位、发布时间等多维度精准过滤返回结构化JSON数据,字段包含标题、正文、发布时间、地区等...

发表评论    

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