今天接到任务需要抓取下我司抖音号里所有视频的:点赞数、评论数、转发数 数据。大概是因为临近年终了。。。
抓取流程解析
开启代理工具
手机添加代理
打开抖音App,进入对应抖音账号,开始抓取数据,重复通过手势向上滑动以加载更多数据,直至显示所有视频。
抓包完毕。
工具准备篇
1 | $ npm i -g whistle whistle.autosave mysql --registry=https://registry.npmmirror.com |
whistle
网络数据抓包。whistle.autosave
whistle 官方插件,默认将 response 数据记录到文件。对其改造(仅获取需要的字段数据)并存储至数据库。mysql
MySQL 数据库操作包,用于将数据存储到数据库。
抓包数据分析
通过 w2 run
启动 whistle
抓包工具。
在抓取数据之前需要找到对应数据 URL
和 response
字段。
视频列表
https://api3-core-c-hl.amemv.com/aweme/v1/aweme/post/
https://api5-core-c-hl.amemv.com/aweme/v1/aweme/post/
视频分享地址
https://www.iesdouyin.com/share/video/${aweme_id}
涉及字段
resBody
是JSON
格式的 body 数据。
resBody.aweme_list[i].statistics.digg_count
点赞数量resBody.aweme_list[i].aweme_id
视频IDresBody.aweme_list[i].desc
视频描述resBody.aweme_list[i].statistics.comment_count
评论数量resBody.aweme_list[i].statistics.share_count
转发数量resBody.aweme_list[i].create_time
发布时间resBody.aweme_list[i].duration
视频时长
添加匹配规则
通过 抓包数据分析
得知,host
是变动的,而剩下的 URI
是固定格式。
浏览器,打开 http://127.0.01:8899/#plugins
地址,添加过滤条件 /aweme\/v1\/aweme\/post/
,这时只有匹配到过滤条件的请求才会请求到 whistle.autosave
插件。
创建数据表
1 | CREATE TABLE `douyin` ( |
whistle.autosave 插件改造
1 | $ cd $(npm root -g)/whistle.autosave/lib |
编辑文件 resStatsServer.js
,代码修改如下:
1 | const fs = require('fs'); |
启动抓包程序
1 | $ w2 run |
蝉妈妈
我同事之前也做过类似的事情,但通过的是第三方平台再处理的数据。跟同事要来了一份数据,对比下第三方平台数据与原数据的差异:
- 确认蝉妈妈90天数据,有无丢失视频
1 | SELECT |
2. 计算差异
1 | -- select count(*) from dylist where name = 'xxx' and `publish_time` > 1602604800; |
总结
- 第三方平台并不只是抓取 90 天之内的视频,有可能只是记录了,并显示出对应视频数据,在同事抓取时仅做了更新操作,并未对有差异的再做更新。
- 第三方平台视频数据缺少。
- 第三方平台可能对历史视频数据不再处理了,导致点赞数、评论数等数据统计不准确。
后记
部分视频可以直接通过 URL
获取,有时限(过一段时间后将无法获取数据)。
https://api3-core-c-hl.amemv.com/aweme/v1/aweme/post/?page_from=1&user_id=3293759164133159&publish_video_strategy_type=2
https://api3-core-c-hl.amemv.com/aweme/v1/aweme/post/?page_from=2&user_id=68310389333&publish_video_strategy_type=2
https://api3-core-c-hl.amemv.com/aweme/v1/aweme/post/?count=21&publish_video_strategy_type=2&page_from=2&user_id=566969479994331