Python 爬虫获取「item_video」——淘宝商品主图视频全流程拆解

一、接口定位:官方 VS 非官方两条路

方案优点缺点适用场景
① 官方 taobao.item_video高稳定、合法、带封面/时长/MP4 直链需企业账号、申请权限、1 k 次/日限额比价平台、正规选品、内容中台
② Web 端逆向(detailskip)无门槛、可并发、无限额随时可能 403、需签名校验无货源搬家、数据分析、内部工具

下面把两条路线都给出「最小可运行」代码,并逐行拆解,方便你按业务场景二选一。


二、路线 ①:官方接口 10 行拿到 MP4

0)前置准备

  1. 登入开放平台→ 创建「网站应用」→ 审核通过拿到 AppKey / AppSecret

  2. 能力管理里搜索 taobao.item_video 并勾选,免费档 1 000 次/天,秒批。

  3. client_credentials 换 token(机器号模式,无需用户授权):

import requests, time, hashlib
APP_KEY = "你的AppKey"
APP_SECRET = "你的AppSecret"

def get_token():
    url = "https://oauth.taobao.com/token"
    params = dict(grant_type="client_credentials",
                  client_id=APP_KEY,
                  client_secret=APP_SECRET,
                  timestamp=time.strftime("%Y-%m-%d %H:%M:%S"))
    return requests.post(url, data=params).json()["access_token"]

1)签名算法(淘宝全系通用)

def _sign(params: dict) -> str:
    params = {k: v for k, v in params.items() if v is not None}
    string = APP_SECRET + "".join(f"{k}{v}" for k, v in sorted(params.items())) + APP_SECRET
    return hashlib.md5(string.encode()).hexdigest().upper()

2)获取视频信息

def item_video(num_iid: str, token: str):
    url = "https://eco.taobao.com/router/rest"
    params = dict(method="taobao.item_video",
                  app_key=APP_KEY,
                  access_token=token,
                  timestamp=time.strftime("%Y-%m-%d %H:%M:%S"),
                  format="json", v="2.0", sign_method="md5",
                  num_iid=num_iid,
                  fields="url,duration,cover_url")
    params["sign"] = _sign(params)
    res = requests.post(url, data=params).json()
    if "error_response" in res:
        raise RuntimeError(res["error_response"]["msg"])
    return res["item_video_response"]["video"]     # 含 url/cover_url/duration

3)下载视频

def download(mp4_url: str, filename: str):
    with requests.get(mp4_url, stream=True, headers={"User-Agent": HEADERS["User-Agent"]}) as r:
        with open(filename, "wb") as f:
            for chunk in r.iter_content(chunk_size=1024 * 64):
                if chunk:
                    f.write(chunk)
    print("saved", filename)

4)一键体验

if __name__ == "__main__":
    tk = get_token()
    video = item_video("728649613560", tk)      # 替换成任意宝贝 ID
    download(video["url"], f'{video["duration"]}ms.mp4')

输出示例:

saved 15000ms.mp4

字段说明:

  • url → 9~30 秒主图视频 MP4 直链

  • cover_url → 封面 800×800 JPG

  • duration → 毫秒,15 000 即 15 s


三、路线 ②:Web 端逆向(零门槛、可并发)

适合“今天就要数据”的场景,无需申请权限,但需做好 403 重试 + 签名校验

1)寻找视频 ID

打开任意宝贝 → F12 → 过滤 getVideo → 得到请求:

https://h5api.m.taobao.com/h5/mtop.taobao.detail.getvideo/1.0/?jsv=2.6.1&appKey=12574478&t=...&sign=...&data={"itemId":"728649613560","videoType":"main"}

返回 JSONP:

mtopjsonp123({"data":{"videoId":"391542685934","coverUrl":"//img.alicdn.com/..."}})

2)Python 模拟(带自动签名)

import requests, time, json, random, hashlib
from urllib.parse import quote

APP_KEY = "12574478"          # 固定公钥
APP_SECRET = ""               # Web 端空 secret

def h5_sign(data: str, t: str) -> str:
    # 淘宝 H5 简化版签名:md5(appSecret + t + data + appSecret)
    return hashlib.md5((APP_SECRET + t + data + APP_SECRET).encode()).hexdigest()

def get_video_id(num_iid: str):
    t = str(int(time.time() * 1000))
    data = json.dumps({"itemId": num_iid, "videoType": "main"}, separators=(",", ":"))
    params = dict(jsv="2.6.1", appKey=APP_KEY, t=t,
                  api="mtop.taobao.detail.getvideo", v="1.0",
                  type="jsonp", dataType="jsonp",
                  callback=f"mtopjsonp{random.randint(1000, 9999)}",
                  data=data, sign=h5_sign(data, t))
    url = "https://h5api.m.taobao.com/h5/mtop.taobao.detail.getvideo/1.0/"
    r = requests.get(url, params=params, headers=HEADERS)
    return json.loads(re.search(r"\((.+?)\)", r.text).group(1))["data"]

3)视频播放地址解析

拿到 videoId 后继续请求:

https://v.taobao.com/video/play?videoId=391542685934&format=mp4&definition=720p

会 302 到真正的 MP4,直接 requests.get(allow_redirects=True) 即可下载。


四、批量下载加速(协程 50 并发)

import aiohttp, aiofiles, asyncio

async def aio_download(url: str, path: str):
    async with aiohttp.ClientSession() as sess:
        async with sess.get(url) as resp:
            async with aiofiles.open(path, "wb") as f:
                async for chunk in resp.content.iter_chunked(1024 * 64):
                    await f.write(chunk)

async def batch_download(iids: list):
    sem = asyncio.Semaphore(50)
    async def task(num_iid):
        async with sem:
            video = item_video(num_iid, token)          # 官方路线
            await aio_download(video["url"], f"{num_iid}.mp4")
    await asyncio.gather(*[task(iid) for iid in iids])

五、常见坑 & 合规提示

坑点解决方案
官方接口报 access_control_exceeded免费档 1 000 次/天,次日 0 点重置;或升级付费套餐 
Web 端 403加 200 ms 延迟 + 随机 UA + 代理池
视频为空部分类目/老店无视频,属于正常
版权风险视频版权归卖家/淘宝所有,仅限内部数据分析、官方活动投放,禁止直接二次销售或公开分发 

六、小结

item_video 的核心就是两条路:

  1. 官方 → 高稳定、带签名、直接给 MP4 直链,10 行代码即可落地;

  2. Web 逆向 → 零门槛、需签名校验,适合“今天就要数据”的紧急需求。

跑通上面任意一段代码,再叠加异步下载、图片/视频转存、字段清洗,就能在选品、比价、无货源搬家、社媒投放等场景中快速上线。祝你“搬”得开心,单量长虹!

如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值