Python爬蟲入門教程 50-100 Python3爬蟲爬取VIP視訊-Python爬蟲6操作

夢想橡皮擦發表於2019-02-14

爬蟲背景

原計劃繼續寫一下關於手機APP的爬蟲,結果發現夜神模擬器總是卡死,比較懶,不想找原因了,哈哈,所以接著寫後面的部落格了,從50篇開始要寫幾篇python爬蟲的騷操作,也就是用Python3通過爬蟲實現一些小工具。

Python3 VIP視訊下載器

這種軟體或者網站滿天都是了,就是線上觀看收費網站的VIP視訊,你只要會玩搜尋引擎或者是一個程式設計師基本都知道,雖說一直在被封殺,但是能賺錢的地方就一定有人鑽漏洞。今天要實現的就是通過別人的API在Python中下載ts視訊到本地,自己去百度一下TS視訊是什麼吧。
python3圖片爬蟲

找相關的介面

我隨便搜尋了一下,那是非常多的,版權問題,就不放相關的地址了,當然在程式碼中還是會出現一下的。

我找到這個介面應該是目前相對比較穩定的,並且還在更新的

我看了一下,他中間主要通過三個API整體實現的頁面邏輯

首先你先去優酷啊,騰訊啊,愛奇藝啊找個VIP視訊的地址,這個隨意啦

我找了一個《葉問外傳》

http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5  

python3圖片爬蟲

編寫程式碼幾個步驟

在瀏覽器測試播放地址,得到線路播放資料

http://y.mt2t.com/lines?url=https://v.qq.com/x/cover/5a3aweewodeclku/b0024j13g3b.html  

在這裡插入圖片描述
在頁面的原始碼中,請注意,開啟開發者工具直接按快捷鍵F12即可,右鍵已經被鎖定。
在原始碼中,發現真實的呼叫地址

python3圖片爬蟲

所以,你需要先匹配出來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()

上面的程式碼可以得到如下的資料集

python3圖片爬蟲
這個資料集需要解析一下,用來獲取播放地址,請注意還有一個介面我們需要打通

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=是否在字串中然後擷取即可。

url擷取的程式碼如下

    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函式,最終的程式碼如下

    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圖片爬蟲
python3圖片爬蟲

相關文章