作者: Hu.Sir
CSDN个人主页: 高智商白痴
原文地址: https://blog.csdn.net/qq_44700693/article/details/108089085
日常跳转:
很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!??¤
QQ群:623406465
导入:
虽然目前有些软件还没适配,但是,我发了 Blink 后有一写人留言或者私信找我要源码,不过我还在增加适配的软件,所以还没有时间写这篇博客,今天呢,就先把我目前适配了的代码拿出来,后续还会继续适配的!
分平台解释:
皮皮虾的话,我之前就已经写过一个单独的博客了,这里就不再赘述:—> Python爬虫:皮皮虾短视频无水印下载
皮皮搞笑与皮皮虾很类似,也是先获取分享链接,在电脑端进行分析:
https://h5.ippzone.com/pp/post/350259149175?zy_to=copy_link&share_count=1&m=0cd13da8548a1bc85813d8c60d331e22&app=&type=post&did=d2bddf23159ae495&mid=1270840711117&pid=350259149175
一切准备工作做好后,开始编写代码:
结果:
接下来以 抖音 为例(抖音极速版的解析方式和抖音相同):
同样的思路,拿到分享链接到电脑浏览器中抓包分析:
https://aweme.snssdk.com/aweme/v1/playwm/?video_id=v0200f750000bsegsdpphaglno4mqd8g&ratio=720p&line=0
当我们删掉链接中的 wm 字段后:
当一切都分析完后,开始编写代码:
注意: 当我们去掉 wm 字段后,下载视频时,需要带上模拟手机端的请求头!
结果:由于抖音和抖音极速版的分享内容是一样的,无法分辨哪个平台,所以统一输出。
但是: 我发现抖音没事就爱搞幺蛾子,有时分享链接是上文所示:
有时又是一段原链接…所以我,做了一点小小的优化:
套路依旧,获取分享链接:
上不上班无所谓,主要是想蹦迪>>https://h5.weishi.qq.com/weishi/feed/6XSB277Nr1K5nIKb6/wsfeed?wxplay=1&id=6XSB277Nr1K5nIKb6&spid=8813798054214369280&qua=v1_and_weishi_8.0.6_588_312028000_d&chid=100081014&pkg=3670&attach=cp_reserves3_1000370011
注意: 这里是一个写爬虫的常用思路:将设备切换为手机,因为相对于电脑端,手机端的健壮性没有电脑端好,所以很多东西都可以通过这种方式来抓取,就如这个例子:
未切换:
https://h5.weishi.qq.com/weishi/feed/6XSB277Nr1K5nIKb6/wsfeed?wxplay=1&id=6XSB277Nr1K5nIKb6&spid=8813798054214369280&qua=v1_and_weishi_8.0.6_588_312028000_d&chid=100081014&pkg=3670&attach=cp_reserves3_1000370011
其他的参数默认就好,而至于请求链接,同一个视频刷新几次,参数 t 就有多少个值:
https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage?t=0.764612279656077&g_tk=
https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage?t=0.3168301677339891&g_tk=
https://h5.weishi.qq.com/webapp/json/weishi/WSH5GetPlayPage?t=0.8888910469548954&g_tk=
…
而且,有时候长度都不一样,这就把我吓到了!什么加密?这么复杂!
既然同一个视频每次刷新都不一样,是不是跟时间戳有关系???但是这明显不是啊!
正在我为这个参数发愁时,我也不知道我当时是怎么想的,无聊,随机修改了参数 t 的几个数字发现,仍然能够获取到视频!!!!!!!
然后我发现:所有的数全是在 0—1 之间变化,我用Python的 random 产生了一组随机数来看:
我都惊呆了!!就是这种数据啊!我用这个随机数去请求时,结果居然是可行的,这…
结果:
虽然 开眼 下载的视频,并没有水印,但是下载好的视频只能在软件内观看,但是我还是想让它下载到它该下载的地址:
套路,套路,还是套路:
https://www.eyepetizer.net/detail.html?vid=208234&utm_campaign=routine&utm_medium=share&utm_source=others&uid=0&resourceType=video&udid=c65aab71b05749d584eac4ee7944bb6274e17596&vc=6030061&vn=6.3.6&size=1080X2070&deviceModel=9&first_channel=xiaomi&last_channel=xiaomi&system_version_code=27
结果:
我们还是以快手为例(快手极速版的解析规则和快手一样):
依旧按照套路来,不过因为快手的限制,必须登录才能分享:
按照以前的套路,将链接粘贴到浏览器,F12 抓包,结果并没有获取到任何与当前视频链接相关的信息,既然不在 json文件中,难道在网页源码中???去挨个儿查看后,也不是,这该怎么爬取呢??
别忘了我前面提到的方法:更改设备。
当我把设备换成手机端后,json 数据中也还是没有相关数据,不过!!我在网页源码中找到了我们想要的链接:
结果:
同样的我们拿到用户首页的分享地址:
看了这么多快手,还是「贝贝兔很」最好玩了! https://v.kuaishou.com/69cjtE 复制此链接,打开【快手】直接观看!
还是一贯的套路,更改设备,模拟手机向下刷新发现:
- feeds :包含第19条到37条的视频信息(不是链接,而是一个中亚参数,我后面会提到怎么使用)。
- pcursor :请求某一部分视频的重要参数。
既然包含了第19条到37条的视频,那么第1到第18条的视频信息在哪里呢?
根据前面的教训,我直接查看了切换到移动设备时的源码发现:
我们从新加载的 json 文件中可以看到,这里面包含了很多信息,但是却没有视频的链接,但是,既然刷新又必须加载它,说明肯定有什么重要的东西:
后来我发现正则表达式提取出的链接都有像是之处,所以我拿出了几个用正则表达式提取出的链接。(默认前缀)
/fw/photo/3x3m9e644ep95qg?cc=share_copylink&fid=574031739&shareId=227013708994&shareToken=X8rcLJByeLfC10c_A&appType=21&kpn=KUAISHOU
/fw/photo/3xggwttf4kquza9?cc=share_copylink&fid=574031739&shareId=227013708994&shareToken=X8rcLJByeLfC10c_A&appType=21&kpn=KUAISHOU
…
我发现对于同一个用户,所有视频的基本形式除了黄色部分不一样以外,其余的都是固定的!这不就是一个参数的问题嘛, json 文件中那么多的数据,不信找不到:我一一尝试后终于找到了那个参数:
结果:
对于这两个软件的解析,其实我是偷懒了,嘿嘿嘿,我翻看以前别人的博客,细细研究后发现了一个快手视频解析的接口:
其实很抱歉我忘记了我在哪个地方看到的那片文章,通过那篇文章,我们可以获取到原火山小视频的视频加载api :
https://api-hl.huoshan.com/hotsoon/item/video/_source/?item_id=6859730122820291840 原火山小视频无水印接口
https://api.huoshan.com/hotsoon/item/video/_reflow/?item_id=6859730122820291840 抖音火山版水印接口
https://api.huoshan.com/hotsoon/item/video/_source/?item_id=6859730122820291840 抖音火山版无水印接口
现在,已经知道视频加载的 api 后,就只需获取视频的 item_id 参数了。这个参数在跳转链接中就可以找到。
所以我直接写出来解析代码:
结果:因为这个 api 无法获取其余信息,所以就以随机数来命名。
我们还是拿到用户首页的分享链接:
「天使航拍」也在抖音火山版,快来看 TA 的精彩作品吧!「天使航拍」上传了 173 个视频作品,一起来围观>>https://share.huoshan.com/hotsoon/s/FJ0C7M5rWa8/ 复制此链接,打开【抖音火山版】,直接找到TA~
- encrypted_id : 在请求跳转链接中以 to_user_id 的参数存在。
- count :请求数量。(但是最多只能请求40—50个??这是怎么回事,我目前还没弄清楚!)
https://share.huoshan.com/pages/user/index.html?to_user_id=MS4wLjABAAAA6iUfN2mZ0H4Z7iLtZQ73TYdXoyTUIjk6oDdVWuRtn_g×tamp=1597806131&share_ht_uid=0&did=67279005018&iid=3113420875114797&utm_medium=huoshan_android&tt_from=copy_link&app=live_stream&utm_source=copy_link&schema_url=sslocal%3A%2F%2Fprofile%3Fid%3D75014355319
结果:
依旧是通过拿到分享链接,然后抓包分析:
#最右#分享一条有趣的内容给你,不好看算我输。请戳链接>> https://share.izuiyou.com/hybrid/share/post?pid=191652885&zy_to=applink&share_count=1&m=ce86942098b72ec745e740e69ab9f6ec&d=fd238824d489ba3c1d65dfb74793074fd42ce27cafa76630b9eecfd7d657f50c&app=zuiyou&recommend=top_ctr&name=use_push_only&title_type=post
基本思路也还是不变,更改设备后查看源码,将部分源码提取出来:
随后,经过我的一番查找,终于找到了视频的无水印链接:
结果:
同样的,我们拿到某一话题的链接:
#最右#发现一个超给力的话题,快来围观!请戳链接>> https://share.izuiyou.com/topic/429972?m=ce86942098b72ec745e740e69ab9f6ec&d=fd238824d489ba3c1d65dfb74793074fd42ce27cafa76630b9eecfd7d657f50c&app=zuiyou
对于这一话题,我们在电脑抓包 XHR 选项中可以看到有一个 list 字段,里面就是关于该话题的视频信息:
备注: 因为此次都是用电脑浏览器抓的包,并没有去分析手机端的 APP 请求方式,所以对于话题下载。只能下载前 10个视频,后续有机会或者有需求的话,我会再抓包分析!
对与请求链接:https://share.izuiyou.com/api/topic/details ,并没有发生什么变化,但是传参就有点复杂了:
- app: 默认 “zuiyou” 就好!
- d、m、tid: 虽然不知道这个参数是干嘛的,不过我们可以在主页链接中找到。注意: 参数 tid 是 int 类型的参数。
- ua: 这个就很明显了啊,就是请求的 User-Agent。
于是我们就可以构建一下请求负载:
这里需要注意的是:请求负载是 JSON 类型的数据,而不是最常见的 DATA :
同样的我们发现,在 video 字段下,还有一个全是数字的字符串:
知道了视频链接保存的地方与请求方式,下面开始编写代码:
- 1、因为后来我发现在话题区可能有图片的动态,不是视频的话,可能会出错,所以我对可能会出错的地方进行了处理
- 2、当我在测试的过程中发现,有些视频的神评中也含有视频,所以我准备再加一点点代码,把那些也都下载下来:
先找到审评的保存地方:
结果:
vue平台虽然视频本身没有频台水印,但是却没有给我们提供下载功能,所以我才会编写这段代码:
同样拿到某一个视频的分享链接:
https://v.vuevideo.net/share/post/-5263687500195767823
结果:
对于话题区,我们也还是拿到分享链接:
https://v.vuevideo.net/share/topics/193
######## 抓包与分析
按照单个视频下载的方式,同样的能够获得我们所需要的所有信息,每一个 <li>…</li> 标签都包裹着每一个视频的信息,所以:
结果:
看看视频,是将一部电视剧的主要情节剪辑下来,让你在上厕所的时候追完一部剧。
按照我们以前的套路,我们肯定要先拿到视频的分享链接,不过,看看视频并没有给我们提供这样的功能,但是,我们直接分享到QQ时发现,这就是一个分享链接:
https://micro.kankan.com/index?productId=207063&setId=220133&productName=隐秘的角落&userId=-1&userid=-1&moviesId=207063
将链接放到浏览器抓包可以很快的找到视频信息的保存地址:
我们对结果进行梳理后,开始编写代码:
但是当我运行以上代码时发现在 ’Referer’: s_url 的地方出现了错误,时编码的问题:
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 73-77: ordinal not in range(256)
大致翻译为:UnicodeEncodeError:“ latin-1”编解码器无法对位置73-77中的字符进行编码:序数不在范围内(256)
原因是链接中含有中文。
结果: