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

知名用户180079054738个月前未分类414
以下是针对当当商品详情数据采集的 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,适用于商品分析、比价系统等场景。


相关文章

Ozon 商品详情 API 合规调用:数据使用规范与频率限制管控

根据Ozon平台API使用政策及数据安全规范,结合实际业务场景,制定以下合规调用方案,涵盖数据使用边界与请求频率管控两大核心模块:📜 数据使用规范1. 字段使用权限矩阵字段类别允许用途禁止行为商品基础...

小红书笔记详情API接口概述,json数据返回

小红书(Xiaohongshu)的笔记详情数据可以通过官方API或非官方爬虫方式获取。由于小红书未公开官方API文档,以下内容基于非官方逆向分析和公开技术讨论整理,仅供技术研究参考。一、小红书笔记详情...

Python 请求淘宝 API 商品详情:简单说明 + JSON 返回参考

一、能帮程序员高效解决什么?一键获取商品完整数据:标题、价格、图片、SKU、库存、详情、发货地、商家信息告别手工复制,代码直接调用,1 秒拿到数据自动入库 / 同步店铺 / 生成报表,全流程自动化稳定...

淘宝商品详情API实战解析:解锁电商全场景高效运营新路径

前言在数字化电商运营浪潮中,数据是核心竞争力,而淘宝商品详情API作为淘宝开放平台的核心接口,是合规获取商品全量结构化数据的“金钥匙”。不同于传统爬虫的高风险、低稳定性,淘宝商品详情API凭借官方授权...

如何使用 Python 实现淘宝商品详情 API 的签名生成?

你想知道如何用 Python 实现淘宝商品详情 API 的签名生成,这是调用淘宝 API 的核心前提(淘宝通过签名验证请求的合法性,防止篡改)。我会先拆解淘宝签名的生成规则,再提供可直接复用的 Pyt...

淘宝商品详情API解析其深度应用场景

淘宝商品详情API(如taobao.item.get)作为电商数据交互的核心工具,其应用场景已从基础商品展示延伸至全链路数字化运营。以下从技术集成、业务创新、生态协同三个维度,进一步解析其深度应用场景...

发表评论    

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