用Python自动化抓取抖音播放量数据并生成Excel周报
2026/9/20 11:30:50 网站建设 项目流程

简介:基于Python的抖音视频播放量抓取与分析实战项目,定位为网络爬虫与数据分析的综合练习,适合希望掌握从网页请求、内容解析到可视化呈现完整链路的Python学习者。资源共21个文件,仅32KB,其中8个.py脚本作为核心功能实现,涉及requests获取数据、BeautifulSoup提取播放量、pandas整理DataFrame、matplotlib绘制走势图;另有json配置设备与接口信息、txt记录token等参数,帮助理解实际爬虫工程中的配置管理。包内除主程序share.py、task.py外,还包含XG03.py等辅助脚本及pyc缓存文件,可快速运行或对照排错。目前已有3873人学习下载,对于想研究短视频热度算法、模拟播放量增长规律的开发者而言,是一份紧凑且可直接上手的参考资料。 这个需求我太熟了。做短视频运营的人,隔三差五就得拉一批播放量数据做复盘,后台一个个复制粘贴能累到怀疑人生。我之前接过一个本地生活账号的代运营,手底下管着十几个视频,每周都要统计播放量、点赞、评论、完播率,纯手工整理一份周报至少两个小时,后来直接用Python写了一套脚本,从登录到出Excel报告,全程自动跑,二十多分钟搞定,而且数据不会漏、不会错。这篇就把整个思路和代码实现完整拆开讲清楚,适合懂一点Python基础、想用脚本替代手工统计的人来参考。

1. 整体设计与技术选型:为什么要用Python来做这件事

1.1 需求场景拆解:播放量数据到底卡在哪

先说说我遇到的真实场景。运营账号的人,每周都要看视频表现,后台能看到数据,但有个问题:数据是一次性展示的,想按周、按月拉趋势,想对比不同发布时间的效果,后台给不了你那么灵活的维度。更麻烦的是,如果你同时管多个账号,还要一个个登录去看,工作量直接翻倍。

播放量这个指标又特别关键,它决定了你这条视频有没有进入更大的推荐池,也决定了广告主愿不愿意投你。所以把它做成可追踪、可对比、可导出的数据,是刚需。

1.2 为什么选Python而不是其他工具

市面上有现成的数据工具,比如新榜、蝉妈妈,功能全但都是付费的,而且数据口径不完全透明。也有低代码的采集工具,但灵活性差,遇到页面改版就废了。Python的优势在于生态太全了:

  • 采集层:requests、httpx、Playwright,能处理接口请求也能处理浏览器渲染。
  • 数据处理层:pandas处理列表数据,比Excel函数好用太多,清洗、透视、合并都是一行代码的事。
  • 可视化层:matplotlib、pyecharts,生成趋势图、对比图直接塞进周报。
  • 自动化层:cron或者Windows任务计划程序,定时跑,数据自动更新。

也就是说,从采集到展示,Python一套语言全给你打通了,不用在多个工具之间切来切去。

1.3 整体方案的模块化思路

我建议你把整个脚本拆成三层,不要写成一个巨大的main函数:

  • 采集层:负责登录、访问视频管理页、抽取接口数据,输出原始JSON。
  • 处理层:负责把JSON转成干净的表格,处理缺失值、类型转换。
  • 展示层:负责生成图表和Excel报告。

三层解耦的好处是,抖音页面改版了,你只需要改采集层;想增加新的分析维度,只需要改处理层和展示层。我第一版就是全写在一起,后来平台一改版,找问题找了半天,气得我直接重构。

2. 写代码之前必须搞清楚的四个关键问题

2.1 数据从哪里来:创作者平台的接口才是正确入口

很多人一上来就想爬用户维度的视频数据,这是走偏了。正常情况下,你应该登录抖音创作者服务平台,在“作品管理”页面能看到自己所有视频的播放量、点赞数、评论数、分享数。这个页面背后是有接口的,你打开浏览器的开发者工具(F12),切到Network面板,刷新页面,就能看到返回作品列表的XHR请求,返回的是JSON数据,里面字段很全,播放量通常在类似aweme_statistics或者statistics这样的字段里。

关键点在于:这是你作为账号主人查看自己的数据,不是你绕过平台去抓别人的数据,合规性上完全站得住脚。

2.2 签名参数的坑:自己造签名是下下策

你如果仔细看接口,会发现请求链接里带着一串看着像乱码的参数,比如X-Bogusa_bogus,这就是抖音的签名校验。它的作用是验证请求是合法客户端发出的,不是脚本随便构造的。早期有人纯粹用Python模拟请求,自己算签名,也有人直接跳过签名靠随机撞,结果就是被封。

我自己的实践经验是:别跟签名较劲,直接用Playwright控制真实浏览器,让抖音自己生成合法请求,我们只拦截响应、提取数据。这就像你写了个遥控器按按钮,而不是试图冒充遥控器本身。绕过了签名逆向的苦海,稳定性反而高很多。

做一个详细的解释:Playwright启动一个Chromium浏览器实例,你手动扫码登录一次,之后它把登录状态存成文件,每次运行脚本时加载这个文件,抖音根本分不清你是真人手动操作还是脚本。

2.3 数据处理和存储的选型

播放量数据量不会特别大,一个账号几千条视频顶天了,所以不需要上数据库,直接用pandas处理就够了。存储格式我选的是Excel,一是运营同事看得懂,二是领导要周报的时候你可以直接甩文件过去。字段上我建议至少保留这些:

字段名说明类型
title视频标题字符串
create_time发布时间日期时间
play_count播放量整数
like_count点赞量整数
comment_count评论量整数
share_count分享量整数
duration视频时长(秒)整数

这里特别注意:接口返回的播放量可能是字符串,比如"12.3w"这种格式,也有可能是纯数字。两种都要处理成整数,后面才能做排序、绘图。

2.4 合规和频率控制不能忽略

最后一项,也是最重要的一项。这整套东西的用途是分析你自己的账号数据,不要拿去爬别人的信息,更不要拿来刷量。我在脚本里做了两个硬性限制:每次最多采集500条数据,分页请求之间至少等3到5秒。控制频率不是因为技术做不到快,而是为了不给服务器添负担,也避免账号被限流。合规的底线不碰,这套工具才能长期稳定跑下去。

3. 实操过程:从环境搭建到跑通播放量抓取

3.1 环境准备与依赖安装

我本机用的是Python 3.10,建议你直接用3.9以上版本,别用2.x,很多库已经不兼容了。先用venv建个虚拟环境,避免依赖冲突。

python -m venv douyin_env source douyin_env/bin/activate # Windows下是 douyin_env\Scripts\activate

然后装依赖:

pip install playwright pandas matplotlib openpyxl playwright install chromium

playwright install chromium这一步必不能省,很多新手漏了就报浏览器找不到的错误。装完chromium,就可以用它来驱动浏览器了。

3.2 登录态管理:只扫码一次,之后免登录

一个我踩过坑的地方:抖音的登录态有效期不是永远的,大概一两天就会过期。如果每次都扫码,自动化就失去了意义。解决办法是用Playwright的storage_state把登录态保存到本地文件。

from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=False) context = browser.new_context() page = context.new_page() page.goto("https://creator.douyin.com/creator-micro/content/manage") input("请扫码登录,登录完成后按回车键继续...") context.storage_state(path="douyin_state.json") browser.close()

第一次运行会弹出浏览器窗口,你扫码登录后,按回车确认,登录信息就存到douyin_state.json里了。之后每次跑脚本时加载这个文件就行。

加载方式:

context = browser.new_context(storage_state="douyin_state.json")

注意一个细节:如果前两天还能用,突然某天提示登录过期,直接重新跑一遍上面的登录脚本,把douyin_state.json覆盖掉就好。

3.3 抓取视频列表数据的核心实现

登录态搞定之后,关键的采集逻辑就两部分:打开作品管理页面,拿到接口响应里的JSON数据。

做法不复杂,用Playwright的page.expect_response去监听符合条件的接口。我先看Network面板里哪个接口返回了作品列表,拿到它的URL特征,然后让浏览器离开这个页面时等待这个接口响应。

import json import time from playwright.sync_api import sync_playwright def fetch_all_videos(page, max_pages=20): all_items = [] for _ in range(max_pages): with page.expect_response(lambda r: "/aweme/post/" in r.url and r.status == 200) as resp_info: # 点击下一页或者滚动加载 page.mouse.wheel(0, 3000) response = resp_info.value data = response.json() items = data.get("aweme_list", []) if not items: break all_items.extend(items) time.sleep(3) # 控制频率,避免请求过快 return all_items

这只是一个示意,实际页面滚动加载的触发条件要看你的页面情况,但思路就是这样:监听接口、拿数据、翻页、继续监听。

拿到了原始数据后,把关键字段抽出来:

def parse_video_items(raw_items): records = [] for item in raw_items: records.append({ "title": item.get("aweme_info", {}).get("desc", ""), "create_time": item.get("aweme_info", {}).get("create_time", 0), "play_count": item.get("aweme_info", {}).get("statistics", {}).get("play_count", 0), "like_count": item.get("aweme_info", {}).get("statistics", {}).get("digg_count", 0), "comment_count": item.get("aweme_info", {}).get("statistics", {}).get("comment_count", 0), "share_count": item.get("aweme_info", {}).get("statistics", {}).get("share_count", 0), }) return records

字段名一定要以你实际抓到的JSON为准,不同时间的版本字段名偶尔会变,所以第一次跑的时候建议print一下完整JSON,确认字段没写错。

3.4 数据清洗:把脏数据变成能分析的干净表格

刚解析出来的数据不能直接用,至少要做三件事。

第一,create_time是Unix时间戳,得转成可读的日期格式。用datetime处理:

from datetime import datetime df["create_time"] = pd.to_datetime(df["create_time"], unit="s").dt.strftime("%Y-%m-%d %H:%M:%S")

第二,播放量、点赞量这些字段如果是字符串带单位,要转成数字。我在实际抓取中就遇到过"1.2万"这样的字符串。写个小函数处理:

def parse_count(value): if isinstance(value, (int, float)): return int(value) if "万" in str(value): return int(float(str(value).replace("万", "")) * 10000) if "亿" in str(value): return int(float(str(value).replace("亿", "")) * 100000000) return int(str(value).replace(",", "") or 0) for col in ["play_count", "like_count", "comment_count", "share_count"]: df[col] = df[col].apply(parse_count)

第三,去重。分页抓取时偶尔会有重复数据,用drop_duplicates处理掉,避免后续统计虚高。

df = df.drop_duplicates(subset=["title", "create_time"])

4. 数据分析与可视化:播放量数字背后藏着什么

4.1 播放量趋势图:一眼看出内容周期

数据抓回来只是第一步,真正有价值的是展示。我做的一个核心图表是播放量趋势折线图,横轴是发布日期,纵轴是播放量。这样可以直观看到哪些时间段发的内容普遍数据好,哪些时间段发的内容容易扑街。

import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"] = ["SimHei"] # 防止中文乱码 plt.rcParams["axes.unicode_minus"] = False df_sorted = df.sort_values("create_time") plt.figure(figsize=(12, 6)) plt.plot(df_sorted["create_time"], df_sorted["play_count"], marker="o", markersize=4, linewidth=1.5) plt.title("近30条视频播放量趋势") plt.xlabel("发布日期") plt.ylabel("播放量") plt.xticks(rotation=45) plt.tight_layout() plt.savefig("play_trend.png", dpi=150)

这段代码有几个坑你可以注意一下:plt.rcParams的中文字体设置必须放在绘图前,否则图上的标题全是方框;日期标签旋转45度防止重叠;tight_layout()解决保存时坐标轴被裁剪的问题。

4.2 发布时间与播放量的关系:找到黄金时段

我还会做一张散点图,横轴是发布小时(0到23点),纵轴是播放量,点的颜色表示点赞量。这样就能快速看出,自己这个账号,到底是晚上8点发效果好,还是中午12点发效果好。

这个分析的价值在于,它比“经验直觉”靠谱得多。我那个本地生活账号,之前一直习惯下午发视频,做了这个图之后发现,上午9点发的几条数据明显更好,后来调整了发布策略,两周内平均播放量涨了快三成。

4.3 一键导出Excel报告

最后一步,把所有数据和图表汇总成一个Excel文件,发给同事或者存档都方便。我直接用ExcelWriter把多个sheet写进一个文件:

with pd.ExcelWriter("douyin_report.xlsx", engine="openpyxl") as writer: df.to_excel(writer, sheet_name="原始数据", index=False) summary_df.to_excel(writer, sheet_name="汇总统计", index=False)

汇总统计里可以放总量、均值、最高播放量视频标题、各发布时间段的平均播放量等,具体看你需要什么。这样一份周报的数据部分就做完了,剩下就是写结论了。

5. 常见问题与排查技巧:实测踩坑汇总

5.1 登录态失效:明明昨天还行,今天就报302

原因就是抖音的登录态cookie有有效期。看我之前说的,重新运行登录脚本,扫码覆盖douyin_state.json。建议每周跑之前先检查一下登录态,或者写个脚本自动判断:如果页面跳转到登录页,就触发重新登录提醒。

5.2 Playwright渲染时找不到目标元素

平台页面是动态渲染的,有时候元素还没加载出来脚本就去找了,结果抛TimeoutError。解决方案是等一个关键元素出现再继续:

page.wait_for_selector("text=作品管理", timeout=10000)

但更好用的方式是直接监听接口,因为接口数据永远比页面渲染稳定。我就是从“找元素定位”改成“监听接口”之后,脚本的稳定性才真正提上来的。

5.3 播放量全部为0:先看原始JSON结构

有段时间我抓回来的数据播放量全是0,排查了很久,最后发现是接口返回的字段名变了,从play_count变成了play_count_old,我按旧字段解析,自然拿不到值。所以遇到异常数据,第一件事就是print(json.dumps(data, ensure_ascii=False, indent=2)[:2000]),看真实结构,别瞎猜。

5.4 请求太频繁导致触发风控

我有一次为了赶报告,把间隔时间改成1秒,结果跑到100多条的时候直接不返回数据了,页面提示“操作频繁”。后来老老实实把间隔调回5秒,并且单次任务限制在500条以内,就再没触发过。别贪快,稳定比速度重要。

5.5 常见问题速查表

症状大概率原因解决办法
浏览器弹出登录页storage_state过期重新扫码登录并覆盖文件
接口超时无返回网络不稳定或请求过频增加延时、重试3次
数据字段全空接口字段名变更打印JSON确认新字段名
中文图表乱码matplotlib缺中文字体设置font.sans-serif为SimHei
Excel打开报错pandas版本和openpyxl不兼容pip install -U openpyxl
视频列表只抓到第一页滚动触发加载失效改用点击“下一页”按钮替代滚轮

这个项目前前后后我改了三版,从第一版纯requests模拟请求,到第二版开始用Playwright,再到第三版加入数据分析和图表功能,踩过的坑都写在上面了。说实话,播放量抓取本身技术门槛不算高,真正花时间的是理解平台页面的运行逻辑,以及把数据转化成能指导运营决策的结论。

最后再分享一个小技巧:跑通脚本之后,建议你把采集、分析、导出三步封装成三个独立的函数,再建一个main.py统一调度,然后挂到Windows任务计划程序里,每周一早上8点自动跑一遍,打开邮箱就能看到上周的数据报告。从手工统计到全自动,体验完全不一样,这个自动化流程本身也是这套方案最出彩的地方。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询