兴趣使然,想要尝试爬取抖音视频
技术
- 基础语言:
JAVA
- 爬虫框架:
Webmagic
(ps:感觉还是没有python的Scrapy好用) - 视频下载:
ffmpeg
- WEB自动化工具:
Selenium
1 | <dependency> |
签名
其他的操作过于简单,这里就不赘述了,此篇博客详细说明是如何获得_signature
参数的值
目前版本想要获取抖音的视频列表,需要提供_signature
值,正确才能返回视频列表
视频列表格式:https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=MS4wLjABAAAA2JmxeROm5PsNNZ7H1_1U5ek97hQAXxZzbYWUxWMheVs&count=21&max_cursor=0&aid=1128&_signature=1q5zugAAtualWHnVPS-u4Nauc6&dytk=
在一系列参数调适之后,我发现只有3个参数必传(sec_uid、max_cursor、_signature),很好理解,sec_uid为用户的唯一id,max_cursor为视频列表的后缀参数,即想要获取完整的列表需要不断取max_cursor的值进行url更新,_signature为签名
视频列表url精简之后格式:https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=MS4wLjABAAAA2JmxeROm5PsNNZ7H1_1U5ek97hQAXxZzbYWUxWMheVs&max_cursor=0&_signature=cKvA4QAAEN-OIhCGGWpCeXCrwP
第一步:刷新浏览器获取视频列表
第二步:搜索
_signature
字段
- 点击之后显示
- 发现是
signature
赋值给了_signature
,所以继续搜索signature
字段,发现下面这一行
- 继续搜索
_bytedAcrawler
字段,发现
- 继续搜索
9bd2804c7e68ac461d65
,发现了疑似签名的函数,将它全部复制下来
- 得到结果
1 | (function (module, exports) { |
- 此时我们回到刚才
signature = (0, _bytedAcrawler.sign)(nonce);
打断点,看他的值 - Step之后进入了
VM1175
文件,显示如下
1 | (function anonymous( |
- 将两者整合,生成最终的
sign.js
1 | function getSignature() { |
这里比较坑的地方出现了,当js引用在html中,console显示出的sign值是正确的,如果直接用java直接调用js生成的sign值则是错误的,所以猜测抖音用了什么技术使签名的生成必须通过浏览器,所以最终我采取了用selenium来模拟浏览器生成sign
1 | /** |
最终结果
1 | /** |
缺点
- 现在是通过手机端抖音APP找到想要下载的对象,分享之后,设置domain,比较麻烦
- 一些翻转的视频没有办法识别出来利用ffmpeg去旋转(尝试过
ws.schild
包,他的逻辑是根据视频的长宽来进行判断,比如宽大于长则说明视频是横着的,反之则是竖着的,但是抖音视频不适用,不管横竖尺寸一样)