爬虫初级 - 抖音视频无水印批量下载

最近接到了一个朋友的软件定制需求,需要爬取指定用户的所有抖音视频(无水印),确定接受这个任务之后,首先理一下实现的思路,计划实现的方案,实现的思路分三步走:

  • 解析用户首页数据,拿到视频信息
  • 一般数据都是分页展示,需要找到分页的标示,循环读取视频数据到结束标记
  • 拿到视频数据,拼接解析视频地址,实现无水印下载

在确定了这个思路之后,按照个人经验,读取视频数据应该不算太难,难点是怎么实现无水印解析,网上有各种各样的无水印解析工具下载使用,必定有无水印的解析方法,不过网上的工具是没有源码给我们参考的。不过幸好在精易论坛找到了无水印的解析方法,如下图(来源:精易论坛 -> https://bbs.125.la/thread-14560713-1-1.html):

在认真的看了前人的解析方法之后,我个人觉得第一种方法比较简单方便,有了解析方法,那就先进行解析的测试,从抖音极速版分享一个链接出来(测试链接:https://v.douyin.com/J1DWHbK/),注意这里需要调整为手机模式浏览,使用火狐自带的插件User-Agent Switcher,将浏览器设置为手机模式,并且调整浏览器界面为手机大小并访问测试链接,显示的结果如下图所示:

可以看到访问了测试链接之后,链接经过了一个跳转,这个我们后面在分析里面具体的参数,看到手机端的显示界面之后,我们右键查看源代码,在源代码里面搜索“playwm”(为什么搜索这个关键字,请认真看图一),发现并没有对应的文本,如下图所示:

居然找不到对应的文本,难道是这个方法失效了?其实并没有,在切换回了桌面模式之后,刷新页面,在右键查看源代码,查找相应的文本,这回找到了,如下图:

找打了对应的文本,复制下来再浏览器打开,能成功的播放的视频,但是是有水印的,如下图:

能成功读取到视频,说明连接有效,按照提醒,把playwm改为play,再次访问链接,结果一片空白。。。

最后经过测试是发现要把UA设置成手机模式(一定要认真阅读文档··),再次访问,得到了无水印的播放地址:

OK,测试方法一能成功拿到无水印的解析地址,剩下的就是想办法拿到用户首页的视频数据了,从抖音上分享出这个用户的个人主页地址(https://v.douyin.com/J1UuQ6X/),将UA改为手机模式,打开开发者选项,监听网络请求:

在用户主页里面,发现了抖音是通过API接口形式获取用户的视频数据,这就好办了,有一定开发经验的同学应该都知道要怎么做了,经过测试,我总结了这个接口的参数的具体意义:

  • sec_uid:用户的ID加密之后的字符串 必传
  • count:每次读取的视频数量
  • max_cursor:当前的页标,用来读取下一页数据的
  • aid:不详,照着传就好
  • _signature:验证签名,这个签名不好处理,我们可以直接使用webview来拿到
  • dytk:顾名思义抖音token,经测试传不传都可以

接口的返回数据如下图所示:

抖音毕竟也是国民级的APP,安全校验技术,服务器反爬虫技术也是TOP1级别的,所以在测试这个接口的时候有不少的坑,这里也要说一下,主要就是UA问题,打开一个无痕浏览器(无法设置UA,无cookies)直接访问连接,返回空数据:

使用POST接口,设置UA,对同一个链接提交请求(仅需要设置UA):

这里我们就能得到结论:在传入的参数正确的情况下,此接口仅在意UA,Cookies不影响此接口,UA必须设置手机端,否则无数据返回。

到这一步,实现抖音无水印批量下载的理论体系已经完善,并且合理可行,读取用户首页数据以及下一页的数据的方法,无水印下载的方法都已找到,剩下的就是实现具体的代码,这里我用易语言以及PHP实现(至于为什么需要用到PHP,下面会有详细的解释),这里我只贴主要的核心代码。

首先是第一步,我们要通过接口拿到数据,前面我们也说了,_signature参数的生产方法我没研究透,但是它是直接贴死在url里面,我们用精易web浏览器就能监听url变化,从而拿到这个url,具体代码如下:

细心的同学会发现我把url里面的secuid等参数分解了出来,这是因为我们直接用易语言精易模块的网页_访问_对象是读不出这个接口数据的,具体的原因未知,因为时间问题也没有深入去研究,既然易语言不行,那就试一下使用PHP的curl方法,这也是为什么我们用到PHP的原因(遇到这种问题,在充分考虑各种因素之后我认为多语言配合不失为一个好的解决方法,没必要死磕)我们把读接口数据部分放在PHP,做一个中继,易语言程序直接读此接口并传入分解后的参数(不能直接传URL,因为URL里面有&字符,会影响解析),就能拿到数据,PHP的代码并不难理解,curl的小知识而已,代码如下:

到这里基本上遇到的问题都给解决了,剩下的就是实现循环读取视频数据,通过接口拼接得到无水印的下载地址,易语言实现代码如下:

好啦,核心的代码就这么多,总结的话就不想写了,感觉也不是很难,就是在调试的时候需要细心认真,多试验几次,发现关键的地方,新手写文章,如果有表达不完善的地方,望包涵~

猜你喜欢

转载自blog.csdn.net/oyo775881/article/details/106322072