From eb2859a1238ff96fca15f88d9efe60ad6b4b0e81 Mon Sep 17 00:00:00 2001 From: hihell Date: Thu, 16 Sep 2021 15:24:25 +0800 Subject: [PATCH] =?UTF-8?q?python=20=E9=87=87=E9=9B=86VIP=E8=A7=86?= =?UTF-8?q?=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\350\231\2536\346\223\215\344\275\234.md" | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 "\346\227\240\346\263\225\350\277\207\345\256\241\347\232\204\346\226\207\347\253\240\345\244\207\344\273\275/Python\347\210\254\350\231\253\345\205\245\351\227\250\346\225\231\347\250\213 50-100 Python3\347\210\254\350\231\253\347\210\254\345\217\226VIP\350\247\206\351\242\221-Python\347\210\254\350\231\2536\346\223\215\344\275\234.md" diff --git "a/\346\227\240\346\263\225\350\277\207\345\256\241\347\232\204\346\226\207\347\253\240\345\244\207\344\273\275/Python\347\210\254\350\231\253\345\205\245\351\227\250\346\225\231\347\250\213 50-100 Python3\347\210\254\350\231\253\347\210\254\345\217\226VIP\350\247\206\351\242\221-Python\347\210\254\350\231\2536\346\223\215\344\275\234.md" "b/\346\227\240\346\263\225\350\277\207\345\256\241\347\232\204\346\226\207\347\253\240\345\244\207\344\273\275/Python\347\210\254\350\231\253\345\205\245\351\227\250\346\225\231\347\250\213 50-100 Python3\347\210\254\350\231\253\347\210\254\345\217\226VIP\350\247\206\351\242\221-Python\347\210\254\350\231\2536\346\223\215\344\275\234.md" new file mode 100644 index 0000000..62eb1bb --- /dev/null +++ "b/\346\227\240\346\263\225\350\277\207\345\256\241\347\232\204\346\226\207\347\253\240\345\244\207\344\273\275/Python\347\210\254\350\231\253\345\205\245\351\227\250\346\225\231\347\250\213 50-100 Python3\347\210\254\350\231\253\347\210\254\345\217\226VIP\350\247\206\351\242\221-Python\347\210\254\350\231\2536\346\223\215\344\275\234.md" @@ -0,0 +1,188 @@ +## 爬虫背景 +原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过爬虫实现一些小工具。 + +## Python3 视频下载器 +这种软件或者网站满天都是了,就是在线观看收费网站的VIP视频,你只要会玩搜索引擎或者是一个程序员基本都知道,虽说一直在被封杀,但是能赚钱的地方就一定有人钻漏洞。今天要实现的就是通过别人的API在Python中下载ts视频到本地,自己去百度一下TS视频是什么吧。 +![python3图片爬虫](https://img-blog.csdnimg.cn/20190214094234749.png#pic_center) + +## 找相关的接口 +我随便搜索了一下,那是非常多的,版权问题,就不放相关的地址了,当然在代码中还是会出现一下的。 + +我找到这个接口应该是目前相对比较稳定的,并且还在更新的 + +我看了一下,他中间主要通过三个API整体实现的页面逻辑 + +首先你先去优酷啊,腾讯啊,爱奇艺啊找个VIP视频的地址,这个随意啦 + +我找了一个《叶问外传》 + + http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5 + +![python3图片爬虫](https://img-blog.csdnimg.cn/20190214095126851.png#pic_center) + +### 编写代码几个步骤 +在浏览器测试播放地址,得到线路播放数据 + + http://y.mt2t.com/lines?url=https://v.qq.com/x/cover/5a3aweewodeclku/b0024j13g3b.html + +![在这里插入图片描述](https://img-blog.csdnimg.cn/20190214095617399.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hpaGVsbA==,size_16,color_FFFFFF,t_70) +在页面的源码中,请注意,打开开发者工具直接按`快捷键F12`即可,右键已经被锁定。 +在源码中,发现真实的调用地址 + +![python3图片爬虫](https://img-blog.csdnimg.cn/20190214100538557.png) + +所以,你需要先匹配出来key来,非常简单,使用正则表达式即可 +```py +import requests +import re +class VIP(object): + def __init__(self): + self.api = "http://y.mt2t.com/lines?url=" + self.url = "http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5" + + def run(self): + res = requests.get(self.api+self.url) + html = res.text + + key = re.search(r'key:"(.*?)"',html).group(1) + print(key) + +if __name__ == '__main__': + vip = VIP() + vip.run() +``` + +得到key之后,就可以进行获取播放地址了,经过分析也可以知道接口为 + + Request URL: http://y.mt2t.com/lines/getdata + Request Method: POST + +那么只需要编写一下即可 + +```py +import requests +import re +import json + +class VIP(object): + def __init__(self): + self.api = "http://y.mt2t.com/lines?url=" + self.post_url = "http://y.mt2t.com/lines/getdata" + self.url = "http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5" + + def run(self): + res = requests.get(self.api+self.url) + html = res.text + + key = re.search(r'key:"(.*?)"',html).group(1) + return key + + def get_playlist(self): + + key = self.run() + + data = { + "url":self.url, + "key":key + } + html = requests.post(self.post_url,data=data).text + dic = json.loads(html) + print(dic) + +if __name__ == '__main__': + vip = VIP() + vip.get_playlist() +``` + +上面的代码可以得到如下的数据集 + +![python3图片爬虫](https://img-blog.csdnimg.cn/2019021410145125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hpaGVsbA==,size_16,color_FFFFFF,t_70) +这个数据集需要解析一下,用来获取播放地址,请注意还有一个接口我们需要打通 + + Request URL: http://y2.mt2t.com:91/ifr/api + Request Method: POST + +参数如下 + + url: +bvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk+SpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6+LAY= + type: m3u8 + from: mt2t.com + device: + up: 0 + +这个API的所有参数都是从刚才获得的数据集分解出来的 +提取上面结果集中的URL + + http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8 + +对这个URL进行分解,这个地方你需要了解一般情况下URL进行哪些符号的特殊编码 + +**大小写都有可能** + +|符号 |特殊编码 | +|--|--| +| +| %2d | +| /| %2f | +| %| %25 | +| =| %3d | +| ?| %3F | +| #| %23 | +| &| %26 | + +所以编写的代码如下 + +```py + def url_spilt(self): + url = "http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8" + url = url.split("?url=")[1].split("&")[0].replace("%2b","+").replace("%3d","=").replace("%2f","/") + print(url) +``` +接下来获取`type` 这个比较容易 +只需要判断以下`type=`是否在字符串中然后截取即可。 + +#### url截取的代码如下 +```py + def url_spilt(self,url): + #url = "http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8" + url_param = url.split("?url=")[1].split("&")[0].replace("%2b","+").replace("%3d","=").replace("%2f","/") + if "type=" in url: + type = url.split("type=")[1] + else: + type = "" + return url_param,type +``` + +#### 完善get_playlist函数,最终的代码如下 +```py + def get_playlist(self): + + key = self.run() + + data = { + "url":self.url, + "key":key + } + html = requests.post(self.post_url,data=data).text + dic = json.loads(html) + + for item in dic: + url_param, type = self.url_spilt(item["Url"]) + res = requests.post(self.get_videourl,data={ + "url":url_param, + "type":type, + "from": "mt2t.com", + "device":"", + "up":"0" + }) + play = json.loads(res.text) + print(play) +``` + +运行之后得到下面的提示,其中最重要的m3u8已经成果获取到,完成任务 +![python3图片爬虫](https://img-blog.csdnimg.cn/20190214104001399.png) +![python3图片爬虫](https://img-blog.csdnimg.cn/2019021410414111.png#pic_center) + + + + + -- GitLab