Python 采集转转二手商品详情:API 接口与爬虫实战全方案(2026 最新)

转转(58 同城旗下二手平台)无官方公开商品详情 API ,主流采集方案为逆向 App / 网页接口(JSON 数据直采)网页爬虫,以下从接口分析、Python 代码、反爬、合规、主题文章全维度拆解,可直接落地。


一、转转商品数据采集核心方案(API / 爬虫二选一)

方案 1:逆向 App 接口(推荐,数据全、效率高、稳定)

转转 App 采用加密 JSON 接口,直接返回结构化商品数据(标题、价格、成色、SKU、描述、卖家信息等),无 HTML 解析损耗,是工业级采集首选。

  • 核心接口(抓包获取)
    1. 商品列表接口
    2. 商品详情接口
    3. 搜索接口
  • 关键参数:itemId(商品 ID)、cityId(城市)、categoryId(分类)、page/pageSize(分页)
  • 加密特征:请求头含zz-tokensigntimestampdeviceId,参数需验签(MD5 + 固定密钥)

方案 2:网页爬虫(简易,适合小规模 / 测试)

转转 Web 端商品页为动态渲染,数据嵌在 HTML 或异步 JS 接口,适合小批量采集。

  • 列表页:
  • 详情页:
  • 数据特点:价格、标题、成色、地区可 XPath 提取,描述、图片需解析 JS 或异步接口。

二、转转商品详情接口字段(逆向 App 返回 JSON 结构)

json

复制代码
{
  "code": 200,
  "msg": "success",
  "data": {
    "itemId": "123456789", // 商品唯一ID
    "title": "95新 iPhone 14 128G 紫色",
    "price": "3299", // 售价
    "originalPrice": "5999", // 原价
    "quality": "95新", // 成色:99新/95新/9成新/8成新/7成新
    "qualityDesc": "屏幕细微划痕,功能全好",
    "categoryName": "手机",
    "brand": "Apple",
    "model": "iPhone 14",
    "area": "北京 朝阳区", // 地区
    "sellerName": "转转优品",
    "sellerLevel": "钻石卖家",
    "sellerScore": 4.9,
    "publishTime": "2026-03-20 14:30",
    "browseCount": 1280, // 浏览量
    "wantCount": 86, // 想要人数
    "desc": "国行全原装,无拆无修,电池健康88%...", // 商品描述
    "images": [ // 商品图片(多图)
      "https://img.zhuanzhuan.com/xxx/1.jpg",
      "https://img.zhuanzhuan.com/xxx/2.jpg"
    ],
    "attributes": [ // 规格属性
      {"name": "容量", "value": "128GB"},
      {"name": "颜色", "value": "紫色"},
      {"name": "保修", "value": "过保"}
    ],
    "service": ["正品保障", "7天无理由", "顺丰包邮"] // 服务标签
  }
}

三、Python 采集实战代码(App 接口 + 网页爬虫双版本)

版本 1:App 接口采集(核心代码,含签名 / 请求头)

依赖:pip install requests

python

运行

复制代码
import requests
import hashlib
import time
import json

# 转转App基础配置(抓包获取)
BASE_URL = "https://appapi.zhuanzhuan.com"
APP_KEY = "zz_app_android"  # 固定
APP_SECRET = "xxxxxx"  # 抓包/逆向获取密钥
DEVICE_ID = "8675xxxxxx"  # 设备ID(抓包)

# 生成签名(转转官方算法)
def generate_sign(params: dict) -> str:
    # 1. 参数按key字典排序
    sorted_params = sorted(params.items())
    # 2. 拼接参数串 + 密钥
    param_str = "".join([f"{k}{v}" for k, v in sorted_params])
    sign_str = f"{APP_SECRET}{param_str}{APP_SECRET}"
    # 3. MD5加密转大写
    return hashlib.md5(sign_str.encode("utf-8")).hexdigest().upper()

# 获取商品详情(App接口)
def get_zz_item_detail(item_id: str) -> dict:
    api_path = "/api/zz/item/detail"
    timestamp = str(int(time.time()))
    
    # 业务参数
    params = {
        "itemId": item_id,
        "cityId": "110100",  # 北京
        "appKey": APP_KEY,
        "timestamp": timestamp,
        "deviceId": DEVICE_ID
    }
    
    # 生成签名
    params["sign"] = generate_sign(params)
    
    # 请求头(抓包完整复制)
    headers = {
        "User-Agent": "ZhuanZhuan/10.0.0 (Android 13; Xiaomi 13)",
        "Content-Type": "application/x-www-form-urlencoded",
        "zz-token": "your_zz_token",  # 登录token(抓包)
        "Accept-Encoding": "gzip"
    }
    
    try:
        resp = requests.get(BASE_URL + api_path, params=params, headers=headers, timeout=10)
        resp.raise_for_status()
        return resp.json()
    except Exception as e:
        return {"error": f"请求失败:{str(e)}"}

# 测试调用
if __name__ == "__main__":
    item_id = "123456789"  # 替换真实商品ID
    detail = get_zz_item_detail(item_id)
    print(json.dumps(detail, ensure_ascii=False, indent=2))
相关推荐
聆风吟º2 小时前
【C标准库】深入理解C语言 atoi 函数:字符串转换为整数
c语言·开发语言·库函数·atoi
凤山老林2 小时前
81-Java Scanner 类
java·开发语言
j_xxx404_2 小时前
MySQL数据库基础硬核解析:从 C/S 网络服务到磁盘文件与存储引擎
linux·运维·服务器·开发语言·数据库·mysql·ai
艾莉丝努力练剑2 小时前
【QT】系统相关:QT文件
linux·服务器·开发语言·网络·qt·tcp/ip·计算机网络
糖果店的幽灵2 小时前
Spring AI 从入门到精通-ChatClient你与 AI 对话的终极武器
人工智能·python·spring
沐苏瑶2 小时前
深入浅出 Java 文件操作与 IO:从文件系统到数据流实战
java·开发语言
海鸥-w2 小时前
用python (fastapi)做项目第二天实现新闻列表和新闻详情接口
开发语言·python·fastapi
Cloud_Shy6182 小时前
解读《Effective Python 3rd Edition》:从练气到老魔(第四章 Item 25 - 26)
开发语言·人工智能·经验分享·笔记·python·学习方法
caimouse3 小时前
Reactos 第 4 章 对象管理 — 4.8 系统调用 NtDuplicateObject / 4.9 系统调用 NtClose
开发语言·windows·架构
GDAL3 小时前
uv 完整教程:下一代 Python 包管理工具
python·uv