原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器老是卡死,比较懒,不想找缘由了,哈哈,因此接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操做,也就是用Python3经过爬虫实现一些小工具。html
这种软件或者网站满天都是了,就是在线观看收费网站的VIP视频,你只要会玩搜索引擎或者是一个程序员基本都知道,虽然说一直在被封杀,可是能赚钱的地方就必定有人钻漏洞。今天要实现的就是经过别人的API在Python中下载ts视频到本地,本身去百度一下TS视频是什么吧。 python
我随便搜索了一下,那是很是多的,版权问题,就不放相关的地址了,固然在代码中仍是会出现一下的。程序员
我找到这个接口应该是目前相对比较稳定的,而且还在更新的正则表达式
我看了一下,他中间主要经过三个API总体实现的页面逻辑json
首先你先去优酷啊,腾讯啊,爱奇艺啊找个VIP视频的地址,这个随意啦api
我找了一个《叶问外传》浏览器
http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5
在浏览器测试播放地址,获得线路播放数据python爬虫
http://y.mt2t.com/lines?url=https://v.qq.com/x/cover/5a3aweewodeclku/b0024j13g3b.html
在页面的源码中,请注意,打开开发者工具直接按
快捷键F12
便可,右键已经被锁定。 在源码中,发现真实的调用地址ide
因此,你须要先匹配出来key来,很是简单,使用正则表达式便可函数
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
那么只须要编写一下便可
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()
上面的代码能够获得以下的数据集
这个数据集须要解析一下,用来获取播放地址,请注意还有一个接口咱们须要打通
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 |
因此编写的代码以下
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=
是否在字符串中而后截取便可。
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
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已经成果获取到,完成任务