原計劃繼續寫一下關於手機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已經成果獲取到,完成任務