Python爬蟲實作vip電影下載
爬蟲目的
實作對各大視頻網站vip電影的下載,因為第三方決議網站并沒有提供下載的渠道,因此想要實作電影的下載,
很多人學習python,不知道從何學起,
很多人學習python,掌握了基本語法過后,不知道在哪里尋找案例上手,
很多已經做案例的人,卻不知道如何去學習更加高深的知識,
那么針對這三類人,我給大家提供一個好的學習平臺,免費領取視頻教程,電子書籍,以及課程的源代碼!??¤
QQ群:623406465
實作思路
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=https://www.cnblogs.com/sn8888/archive/2020/10/16/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,headers=headers2,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也比較簡單,容易上手,如果需要的話聯系我吧,
總結
這是我第一次寫博客,如果哪里有問題請及時指出來,歡迎大家指正錯誤,此爬蟲專案只用于入門,請不要用其盈利,否則,后果自負!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/174405.html
標籤:其他
