Python爬蟲實現vip電影下載的示例程式碼
爬蟲目的
實現對各大視訊網站vip電影的下載,因為第三方解析網站並沒有提供下載的渠道,因此想要實現電影的下載。
實現思路
1.選擇一個合適的vip解析網站,這裡選擇了無名小站的介面,因為嘗試了很多網站,有些網站想要爬取很困難,無名小站相對簡單,介面為www.wmxz.wang/video.php?url=[vip電影的連結]
2.利用Fiddler進行抓包,模擬瀏覽器傳送post請求,獲取電影實際下載地址。
3.使用PyQt5進行包裝,實現多樣化的功能。(可選)
頁面分析
我使用Fiddler抓包,首先,瀏覽器進入介面,這裡隨便加一個vip電影的連結,然後來看post請求:
我們已經知道了提交post請求的url,箭頭所指的地方是提交的表單,裡面的url就是我們要下載vip電影的ur,出現%3F這些是因為將url編碼為了ASCII碼,這裡可能使用urllib對其進行解析,很簡單;vkey需要我們獲取,其實它就藏在Post請求之前get請求返回的頁面中,vkey是動態變化的,每一次都不一樣。紅線部分是伺服器返回的資訊,前幾天我爬取的時候裡面的url還是電影的下載連結,現在變成了一個m3u8檔案,裡面的網址也是編碼後的,我們需要用urllib進行解碼,我們手動開啟https://youku.cdn2-okzy.com/20200408/8808_23a9c669/index.m3u8看看裡面的內容,下載後開啟
發現裡面並沒有我們想要的ts檔案,但是在檔案中有一行1000k/hls/index.m3u8,也是以m3u8為字尾的,使用前面的url與檔案中的部分地址拼接,結果為: https://youku.cdn2-okzy.com/20200408/8808_23a9c669/1000k/hls/index.m3u8,再次用瀏覽器手動開啟,下載內容後發現裡面是一個個ts檔案,最後將ts檔案下載後拼接即可(因為我爬的時候還是電影連結,寫部落格時發現改了,所以拼接方法我也不會,網上應該容易找到)。
下面我們只要獲取vkey就可以得到這些ts檔案地址了,我們向前看,找返回內容有vkey的get請求:
對比發現和post請求中的vkey一樣,接下來就可以開始編寫程式碼了。
程式碼實現
獲取vkey,從上面的分析我們可以知道,get請求的網址為
https://www.administratorm.com/WANG.WANG/index.php?url=[要下載的vip電影]
我採用輸入連結的方式來拼接get請求要訪問的url,順便使用urllib庫將輸入連結編碼,方便後面的post請求使用
headers1 = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/79.0.3945.88 Safari/537.36','Referer':'https://www.administratorm.com/index.php?url=https://v.qq.com/x/cover/mzc00200q06w7zx/j0033kbdjsv.html' } headers2 = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/79.0.3945.88 Safari/537.36'} #定義介面連結 api_url = 'https://www.administratorm.com/WANG.WANG/Api.php' input_url = input("請輸入電影url連結:") print("請稍等!") get_key_url = 'https://www.administratorm.com/WANG.WANG/index.php?url='+input_url parsed_url = parse.quote(input_url,safe='')
這裡建立一個會話,會話是用於伺服器記錄使用者身份的,然後就是傳送get請求,獲取網頁原始碼,然後使用re匹配到vkey的內容,這裡要注意的是get請求中的verify=False引數,其實我也不太明白,是一些網站有SSl認證,加了這個引數就可以跳過認證,加了此引數可能會有很多警告,使用 logging.captureWarnings(True) 設定不顯示警告。
sess = requests.session() vkey = get_key(sess,get_key_url) def get_key(sess,get_key_url): logging.captureWarnings(True) response = sess.get(get_key_url,headers=headers1,verify=False) response.encoding=response.apparent_encoding content = response.text vkey = re.findall('vkey.*?\'(.*?)\'',content)[0] return vkey
2.製作表單,獲取了vkey後,我們就可以製作提交post請求的表單了,程式碼很簡單,就不做介紹了。
datas = make_dataform(parsed_url,vkey) def make_dataform(parsed_url,vkey): datas = { 'url':parsed_url,'wap':'0','ios':'0','vkey':vkey,'type':'' } return datas
3.傳送post請求,這裡再次說明,由於我原來post請求返回的資訊是電影下載地址,所以我獲得的url是下載地址,現在再提交post請求獲得的是m3u8檔案。
download_url = post(sess,datas) def post(sess,datas): response = sess.post(api_url,headers=headers2,data=datas) response.encoding=response.apparent_encoding u = json.loads(response.text) return u['url']
4.下載電影,由於連結不同,我就把我下載電影的程式碼放到這裡,做個參考。
down_load(sess,download_url) def down_load(sess,download_url): print("正在準備下載電影") response = requests.get(download_url,verify=False) total_size = response.headers['Content-Length'] print("將要下載的電影大小:{}MB".format(round(int(total_size)/1024/1024,2))) batch_size = int(total_size)//100 #返回迭代器:是將二進位制流按大小分割之後的 k = input("請輸入檔案路徑(C/D):") filename = input("請輸入儲存檔名:") with open(r"{}:/電影/".format(k)+filename+".mp4",'wb') as f: i = 0 for content in response.iter_content(chunk_size=batch_size): f.write(content) print('\r','#'*i+' 已下載{}%'.format(i),end='\r',flush=True) i += 1 print("下載成功")
程式介面
使用PyQt5將上面的程式碼包裝起來,使其更加美觀,並新增一些功能,由於WebEngineView已經不能播放flash了,並且有些需要新建標籤的連結打不開,所以中間的瀏覽器很雞肋,就圖個好看吧。
這裡就不詳細講了,PyQt5也比較簡單,容易上手,如果需要的話聯絡我吧。
總結
這是我第一次寫部落格,如果哪裡有問題請及時指出來,歡迎大家指正錯誤,此爬蟲專案只用於入門,請不要用其盈利。否則,後果自負!
到此這篇關於Python爬蟲實現vip電影下載的示例程式碼的文章就介紹到這了,更多相關Python爬蟲vip電影下載內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!