Python爬虫接入京东API接口抓取网页数据的方法

一、核心前提:京东 API 接入的合规与准备

京东提供开放平台 AP京东联盟 API(面向推广者),爬虫接入需优先使用官方 API(禁止爬取非开放的网页数据,违反平台协议)。以下是基于官方 API 的规范接入方法:

1. 开发者账号与应用准备
  • 注册:访问京东开发平台,完成开发者账号注册(个人 / 企业实名认证)。
  • 创建应用:在 “管理中心 - 应用管理” 创建应用,获取核心凭证:
    • AppKey:应用唯一标识
    • AppSecret:应用密钥(需保密)
    • access_token:部分接口需用户授权获取(如订单类),商品类接口可通过 “静默授权” 获取。
  • 接口权限:在应用中申请目标接口权限(如商品查询、推广信息查询),等待审核。

2. 核心规则:API 签名机制

京东 API 要求请求参数生成MD5 签名(防止参数篡改),签名规则:

  1. 所有请求参数(除sign外)按参数名 ASCII 码升序排列;
  2. 拼接成key1=value1&key2=value2格式的字符串;
  3. 在字符串首尾拼接AppSecret,得到AppSecret + 拼接字符串 + AppSecret
  4. 对拼接后的字符串做 MD5 加密,转大写得到sign参数。

二、Python 实现京东 API 调用(以商品推广信息接口为例)

以下示例使用京东联盟「商品推广信息查询接口」(jd.union.open.goods.promotioninfo.get),可获取商品价格、佣金等信息。

1. 安装依赖库

bash

运行

pip install requests  # 发送HTTP请求
pip install hashlib   # 内置MD5加密,无需额外安装
2. 完整代码示例

python

运行

import requests
import hashlib
import time
import urllib.parse

# -------------------------- 配置项 --------------------------
APP_KEY = "你的AppKey"
APP_SECRET = "你的AppSecret"
API_URL = "https://router.jd.com/api"  # 京东API网关地址
# -------------------------------------------------------------

def generate_sign(params, app_secret):
    """生成京东API签名"""
    # 1. 按参数名ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 2. 拼接参数为key=value格式
    sign_str = "&".join([f"{k}={urllib.parse.quote(str(v), safe='')}" for k, v in sorted_params])
    # 3. 首尾拼接AppSecret
    sign_str = app_secret + sign_str + app_secret
    # 4. MD5加密并转大写
    sign = hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()
    return sign

def jd_api_request(method, params):
    """发送京东API请求"""
    # 公共参数(所有接口必传)
    common_params = {
        "app_key": APP_KEY,
        "method": method,       # 接口名称
        "format": "json",       # 响应格式
        "v": "1.0",             # API版本
        "timestamp": str(int(time.time() * 1000)),  # 时间戳(毫秒)
        "sign_method": "md5"    # 签名方式
    }
    # 合并公共参数和业务参数
    all_params = {**common_params, **params}
    # 生成签名
    all_params["sign"] = generate_sign(all_params, APP_SECRET)
    
    # 发送GET请求(京东API优先GET,部分接口支持POST)
    response = requests.get(API_URL, params=all_params, timeout=10)
    # 解析响应
    if response.status_code == 200:
        result = response.json()
        if result.get("code") == 0:  # 接口调用成功
            return result["result"]
        else:
            print(f"API调用失败:{result.get('msg')}")
            return None
    else:
        print(f"HTTP请求失败,状态码:{response.status_code}")
        return None

if __name__ == "__main__":
    # 业务参数:查询商品推广信息(需替换为目标商品SKU)
    business_params = {
        "skuIds": "100012345678",  # 商品SKU,多个用逗号分隔
        "platform": 1,             # 平台类型:1-京东APP,2-京东PC
        "unionId": "你的联盟ID"    # 京东联盟ID(需绑定应用)
    }
    # 调用接口
    result = jd_api_request("jd.union.open.goods.promotioninfo.get", business_params)
    if result:
        print("商品信息:")
        print(result)

三、关键说明

1. 接口选择

京东开放平台提供不同类型接口,常用接口参考:

  • 商品基础信息:jd.item.read.get(需权限)
  • 商品推广信息:jd.union.open.goods.promotioninfo.get(联盟接口,权限易申请)
  • 订单查询:jd.trade.order.info.get(需企业资质 + 高权限)
2. 常见问题解决
  • 签名错误:检查参数排序、URL 编码、AppSecret 是否正确,时间戳是否为毫秒级。
  • 权限不足:在开放平台 “应用管理 - 权限管理” 申请对应接口权限,审核通过后生效。
  • 频率限制:京东 API 有 QPS 限制(一般 10-100 QPS),需添加请求间隔(如time.sleep(0.1))。

四、合规与风险提示

  1. 禁止爬取非 API 数据:京东网页数据(如商品详情页 HTML)受反爬机制保护,且爬取非开放数据违反《京东开放平台服务协议》,可能导致账号封禁。
  2. API 调用规范:严格遵守接口频率限制,不得滥用 API 获取数据用于违规场景(如倒卖、恶意比价)。
  3. 数据用途:仅可用于自身应用开发,未经授权不得将获取的京东数据对外公开或商用。

五、扩展优化

  1. 异常处理:添加重试机制(如tenacity库),处理网络波动或临时接口报错。
  2. 批量查询:部分接口支持批量 SKU 查询,减少请求次数(需符合接口参数限制)。
  3. 异步请求:使用aiohttp替代requests,提高高并发场景下的调用效率。

如果需要调用其他接口,只需替换method(接口名称)和business_params(业务参数),签名逻辑和公共参数无需修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值