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(机器号模式,无需用户授权):

python 复制代码
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)签名算法(淘宝全系通用)

python 复制代码
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)获取视频信息

python 复制代码
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)下载视频

python 复制代码
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)一键体验

python 复制代码
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 模拟(带自动签名)

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 并发)

python 复制代码
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 逆向 → 零门槛、需签名校验,适合"今天就要数据"的紧急需求。

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

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

相关推荐
小白学大数据38 分钟前
使用 Selenium 爬取京东手机销量与评分数据 (1)
爬虫·selenium·测试工具·智能手机
belldeep43 分钟前
python:pyTorch 入门教程
pytorch·python·ai·torch
YJlio44 分钟前
Registry Usage (RU) 学习笔记(15.5):注册表内存占用体检与 Hive 体量分析
服务器·windows·笔记·python·学习·tcp/ip·django
奔波霸的伶俐虫1 小时前
redisTemplate.opsForList()里面方法怎么用
java·开发语言·数据库·python·sql
longze_71 小时前
生成式UI与未来AI交互变革
人工智能·python·ai·ai编程·cursor·蓝湖
WX131695189981 小时前
音频分析仪APX525 APX515 APX528 APX526测试参数
科技·音视频·信息与通信
weixin_438077491 小时前
CS336 Assignment 4 (data): Filtering Language Modeling Data 翻译和实现
人工智能·python·语言模型·自然语言处理
小郭团队1 小时前
未来PLC会消失吗?会被嵌入式系统取代吗?
c语言·人工智能·python·嵌入式硬件·架构
yesyesido1 小时前
智能文件格式转换器:文本/Excel与CSV无缝互转的在线工具
开发语言·python·excel
王夏奇1 小时前
python在汽车电子行业中的应用1-基础知识概念
开发语言·python·汽车