抖音用户主页视频数据爬虫详解:点赞、收藏、分享字段抓取与 TaoToken 统一 Key 配置

发布时间:2026/10/8 0:01:10
抖音用户主页视频数据爬虫详解:点赞、收藏、分享字段抓取与 TaoToken 统一 Key 配置 1. 抖音主页视频列表到底能抓到什么点赞收藏分享字段的公开数据采集思路抖音用户主页的视频列表本质上是一个公开的展示页。你打开某个博主的主页往下滑动会不断加载出新的视频卡片每张卡片上都有播放量、点赞、收藏、分享、评论这些互动数字。这些数字对做内容分析、竞品调研、选题复盘的人来说价值很高——它能告诉你哪类选题在这个账号里跑得最好哪条视频的收藏率异常高哪条视频分享远大于点赞。我这次要拆的是「用户主页视频列表」这条链路不是单条视频详情也不是评论区。目标很明确给定一个博主的 sec_user_id把主页上所有视频的点赞、收藏、分享、评论、发布时间、标题、视频 ID 这些字段完整拉下来并且能翻页翻到底。适合谁看会一点 Python、能看懂 requests 请求、想自己搭一套采集脚本的人。如果你完全没写过代码建议先补一下 requests 和 pandas 的基础不然下面的参数你会看得比较吃力。核心难点有三个。第一主页列表接口是 POST参数里 sec_user_id 是加密后的作者标识得从主页 URL 里提取。第二分页不是简单的 page1、page2而是靠 max_cursor 游标每次响应里带回下一个游标同时 has_more 告诉你还有没有下一页。第三鉴权信息Cookie 或统一 Key会过期批量跑的时候很容易中途 401。我试过直接拿浏览器 Cookie 硬跑跑十几个博主就开始掉后来把鉴权统一收到一个 Key 配置里稳定性好了很多。下面按「先讲清楚接口长什么样 → 再讲怎么把鉴权统一 → 再给可复制的配置 → 再验证 → 再排错」的顺序来。先明确一点这里采集的是公开可见的互动数字不涉及登录态下的私密数据也不做高频轰炸。请求之间留间隔单账号视频量通常几百条分页几次就到底了。字段清单先列出来方便你对照后面代码里的提取逻辑字段名含义来源aweme_id视频唯一 ID列表项desc视频标题/文案列表项create_time发布时间戳列表项digg_count点赞数statisticscollect_count收藏数statisticsshare_count分享数statisticscomment_count评论数statisticsplay_count播放数statisticsmax_cursor下一页游标响应顶层has_more是否还有下一页响应顶层这张表就是最终要落库的结构。你会发现点赞、收藏、分享都在 statistics 对象里不在列表项顶层提取的时候别找错层级。2. TaoToken 统一 Key 配置把接口鉴权从散落 Cookie 收拢到一处上一节说到 Cookie 容易过期这是采集脚本最烦的地方。你写死一个 Cookie今天能跑明天可能就 401。更麻烦的是如果你同时跑多个数据源比如抖音 别的平台每个源一套鉴权维护成本直接翻倍。我的做法是把所有对外请求的鉴权统一走 TaoToken 的 Key。TaoToken 是一个模型与接口调用的统一入口官网在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。它的作用是让你用一个 Key 去调用后端能力不用在每个脚本里散落不同的凭证。这里要区分清楚抖音主页列表接口本身是抖音的公开接口TaoToken 不替代它。TaoToken 负责的是你脚本里「需要模型能力或统一鉴权」的那部分比如你在采集后想用模型做字段清洗、标题分类、异常值判断或者你想把请求出口统一管理。把 Key 收到一处脚本里只读环境变量换 Key 不用改代码。具体操作路径第一步打开 https://taotoken.net/api-keys 登录后创建一个 API Key。这个 Key 就是后面所有请求要带的凭证。创建时给它起个能认出来的名字比如 douyin-collector方便以后区分。第二步把 Key 写进环境变量不要硬编码在脚本里。Linux/macOS 下export TAOTOKEN_API_KEYsk-你的keyWindows PowerShell$env:TAOTOKEN_API_KEYsk-你的key第三步在脚本里读取。Python 用 os.environimport os TAOTOKEN_API_KEY os.environ.get(TAOTOKEN_API_KEY) if not TAOTOKEN_API_KEY: raise RuntimeError(缺少 TAOTOKEN_API_KEY请先设置环境变量)这样做的直接好处Cookie 过期你只需要重新登录一次抖音侧而 TaoToken 的 Key 是长期有效的不会因为平台登录态变化而失效。两套鉴权解耦排错的时候一眼能看出是平台侧问题还是 Key 侧问题。如果你用的是 Claude Code 这类编码工具想把 Key 配进去可以走 https://taotoken.net/claude-code-anthropic 这个入口里面有对应的接入说明。配置的时候三件套要写全Base URL、Key、Model ID缺一个都会连不上。注意Key 只放在服务端或本地环境变量里不要提交到 Git也不要写进前端代码。一旦泄露去 console 里吊销重建。3. 可复制的请求头与分页配置sec_user_id 提取 max_cursor 游标翻页这一节是核心直接给能跑的配置。先解决 sec_user_id 怎么来。你打开一个博主主页URL 长这样https://www.douyin.com/user/MS4wLjABAAAAxxxxxxxxxxxxxxxxuser/ 后面那一串就是 sec_user_id。用正则从 URL 里抠出来import re def extract_sec_user_id(url: str) - str: m re.search(r/user/([A-Za-z0-9_\-]), url) if not m: raise ValueError(f无法从 URL 提取 sec_user_id: {url}) return m.group(1)拿到 sec_user_id 后构造主页视频列表请求。接口是 POST请求参数里只有 sec_user_id 是必须的count 控制每页数量max_cursor 控制翻页起点。请求头配置关键是 Content-Type 和 User-AgentCookie 走你登录后的会话import requests BASE_URL https://www.douyin.com/aweme/v1/web/aweme/post/ HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36, Content-Type: application/x-www-form-urlencoded; charsetUTF-8, Referer: https://www.douyin.com/, Accept: application/json, text/plain, */*, } def build_params(sec_user_id: str, max_cursor: int 0, count: int 20) - dict: return { sec_user_id: sec_user_id, count: count, max_cursor: max_cursor, device_platform: webapp, aid: 6383, channel: channel_pc_web, version_code: 170400, version_name: 17.4.0, }分页逻辑是这套脚本的灵魂。响应 JSON 顶层有两个字段max_cursor 和 has_more。第一次请求传 max_cursor0响应里带回新的 max_cursor下一次请求就用这个新值。has_more 为 1 表示还有下一页为 0 表示到底了。def fetch_all_videos(session: requests.Session, sec_user_id: str, count: int 20): all_items [] max_cursor 0 page 0 while True: params build_params(sec_user_id, max_cursor, count) resp session.post(BASE_URL, headersHEADERS, paramsparams, timeout15) resp.raise_for_status() data resp.json() items data.get(aweme_list) or [] all_items.extend(items) page 1 print(f第 {page} 页本页 {len(items)} 条累计 {len(all_items)} 条) has_more data.get(has_more, 0) max_cursor data.get(max_cursor, 0) if not has_more or not items: break time.sleep(1.5) # 控制频率别打太快 return all_items注意 count 这个参数。你把它设成 100响应不一定真给你 100 条平台会按自己的策略返回。所以别依赖 count 做分页判断只依赖 has_more 和 max_cursor。字段提取点赞收藏分享都在 statistics 里def parse_item(item: dict) - dict: stats item.get(statistics) or {} return { aweme_id: item.get(aweme_id), desc: (item.get(desc) or ).strip(), create_time: item.get(create_time), digg_count: stats.get(digg_count, 0), collect_count: stats.get(collect_count, 0), share_count: stats.get(share_count, 0), comment_count: stats.get(comment_count, 0), play_count: stats.get(play_count, 0), }如果你要把这套脚本的鉴权统一到 TaoToken可以在 session 初始化时把 Key 注入到统一请求层。下面是一个 settings 片段路径按你项目实际结构调整这里以项目根目录的 config/settings.json 为例{ taotoken: { base_url: https://taotoken.net/api, api_key_env: TAOTOKEN_API_KEY, model_id: your-model-id }, douyin: { list_endpoint: https://www.douyin.com/aweme/v1/web/aweme/post/, page_size: 20, sleep_seconds: 1.5, max_pages: 50 } }读取配置import json, os with open(config/settings.json, r, encodingutf-8) as f: cfg json.load(f) api_key os.environ[cfg[taotoken][api_key_env]] base_url cfg[taotoken][base_url] model_id cfg[taotoken][model_id]三件套 Base URL、Key、Model ID 都在这里了。Base URL 用 https://taotoken.net/api Key 从环境变量读Model ID 按你实际用的填。这样换模型或换 Key 只改配置不动业务代码。4. 验证一次完整抓取字段完整性与去重效果实测配置写完了得跑一次看结果。验证分两步先看字段全不全再看有没有重复。先跑抓取把结果转成 DataFrameimport pandas as pd session requests.Session() # 这里 session 需要带上你登录后的 Cookie具体获取方式见下一节排错 sec_user_id extract_sec_user_id(https://www.douyin.com/user/MS4wLjABAAAAxxxxxxxx) raw_items fetch_all_videos(session, sec_user_id, count20) rows [parse_item(it) for it in raw_items] df pd.DataFrame(rows) print(总条数:, len(df)) print(字段:, list(df.columns)) print(df[[aweme_id, digg_count, collect_count, share_count]].head())预期输出类似第 1 页本页 20 条累计 20 条 第 2 页本页 20 条累计 40 条 ... 总条数: 186 字段: [aweme_id, desc, create_time, digg_count, collect_count, share_count, comment_count, play_count]字段完整性检查确认 digg_count、collect_count、share_count 三列没有大面积空值。如果某列全是 0大概率是 statistics 层级取错了回去看 parse_item。去重检查主页列表在翻页边界偶尔会重复返回同一条用 aweme_id 去重before len(df) df df.drop_duplicates(subset[aweme_id]).reset_index(dropTrue) after len(df) print(f去重前 {before} 条去重后 {after} 条去掉 {before - after} 条重复)实测下来一个 180 多条视频的账号翻页 10 次左右到底去重通常能去掉 0 到 3 条边界重复。如果重复数量很大说明 max_cursor 没正确更新检查你是不是把初始值 0 写死了。导出 Exceldf.to_excel(douyin_homepage_videos.xlsx, indexFalse) print(已导出 douyin_homepage_videos.xlsx)打开 Excel 核对几列点赞数应该和你在主页看到的量级一致收藏数一般小于点赞数分享数通常最小。如果三个数字量级明显不对比如收藏比点赞还大一个数量级那就是字段映射错了。再补一个完整性断言方便你自动化跑required [aweme_id, digg_count, collect_count, share_count] missing [c for c in required if c not in df.columns] assert not missing, f缺少字段: {missing} assert df[aweme_id].is_unique, aweme_id 存在重复去重未生效 print(字段与去重校验通过)跑通这一步说明你的采集链路是通的。接下来就是处理鉴权过期和报错。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 报错对照采集脚本跑不起来九成是下面这几类错。我按真实报错信息对照着讲。401 Unauthorized / 登录态失效现象请求返回 401或者返回的 JSON 里 status_code 非 0。原因基本是 Cookie 过期。抖音的登录态有时效批量跑久了就掉。处理重新登录获取 Cookie或者用自动化方式在需要时刷新登录态。如果你把鉴权统一到了 TaoToken先确认 401 是来自抖音侧还是 Key 侧——看报错 URL 域名。抖音域名报 401 就是平台 Cookie 问题TaoToken 域名报 401 就是 Key 问题去 https://taotoken.net/api-keys 检查 Key 是否有效、是否被吊销。local proxy failed / 连接被拒现象requests 抛 ProxyError提示 local proxy failed 或 connection refused。原因是你本地配了代理但代理没起来或者环境变量 HTTP_PROXY 指向了一个失效地址。处理检查环境变量echo $HTTP_PROXY echo $HTTPS_PROXY如果不需要代理直接清掉unset HTTP_PROXY HTTPS_PROXY然后在 requests 里显式禁用代理session.trust_env Falsereading choices / 响应结构对不上现象解析时报 KeyError 或 TypeError提示 reading choices 之类。这通常发生在你把模型返回结构和平台返回结构搞混了。抖音列表接口返回的是 aweme_list不是 choices。choices 是模型对话接口的字段。处理打印原始响应前 500 字符确认结构print(resp.text[:500])看清楚顶层是 aweme_list 还是别的再改提取路径。别拿模型接口的解析代码套平台接口。OAuth / token 校验失败现象报 OAuth 相关错误或者 token invalid。如果你在脚本里用了需要 OAuth 的模型调用检查 token 是否过期、scope 是否对。走 TaoToken 的话确认 Base URL 填的是 https://taotoken.net/api Key 和 Model ID 三件套齐全。缺 Model ID 是最常见的很多人只填了 URL 和 Key结果调用时报模型不存在。has_more 一直为 1死循环现象翻页停不下来或者翻到后面返回空列表但 has_more 还是 1。处理加双重终止条件has_more 为 0 或者 items 为空都停再加一个 max_pages 上限兜底if page cfg[douyin][max_pages]: print(达到最大页数上限停止) break字段全是 0现象抓到了条数但点赞收藏分享全是 0。原因statistics 层级取错或者你抓的是精简版响应。检查 parse_item 里是不是从 item[statistics] 取的而不是 item 顶层。排错的核心思路就一条先看报错来自哪个域名分清是平台侧还是 Key 侧再去对应的配置里找。别一上来就改代码。6. 采集链路的下一步把 Key 配置沉淀成可复用模板跑通一次完整抓取之后你会发现真正花时间的不是写请求而是维护鉴权和翻页边界。把这两块沉淀成模板后面换账号、换平台都能直接套。我的做法是建一个 collector 基类把 session 初始化、Key 读取、重试、限速都放进去抖音只是其中一个子类。这样下次你要抓另一个平台的主页列表只需要改 endpoint 和字段映射鉴权层完全不动。Key 配置这块建议固定三件套的读取顺序先读环境变量读不到再读本地配置文件都没有就报错退出。不要给默认值默认值会让配置错误被掩盖。如果你后面要做长期、批量的采集任务可以考虑把模型调用也接进来比如用模型对视频标题做自动分类、对异常互动数据做标注。这类长期任务适合走 Coding Plan入口在 https://taotoken.net/coding-plan 把编码和调用统一管理。只是想验证某个模型对字段清洗的效果可以直接在 https://taotoken.net/models 里对话试一下确认输出格式再写进脚本。最后留一个实用习惯每次采集完把本次的 sec_user_id、抓取时间、条数、去重数记一行日志。下次数据对不上时翻日志比翻代码快得多。采集脚本的稳定性往往就藏在这些不起眼的记录里。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询