Python爬蟲實(shí)現(xiàn)vip電影下載的示例代碼
爬蟲目的
實(shí)現(xiàn)對(duì)各大視頻網(wǎng)站vip電影的下載,因?yàn)榈谌浇馕鼍W(wǎng)站并沒有提供下載的渠道,因此想要實(shí)現(xiàn)電影的下載。
實(shí)現(xiàn)思路
1.選擇一個(gè)合適的vip解析網(wǎng)站,這里選擇了無(wú)名小站的接口,因?yàn)閲L試了很多網(wǎng)站,有些網(wǎng)站想要爬取很困難,無(wú)名小站相對(duì)簡(jiǎn)單,接口為www.wmxz.wang/video.php?url=[vip電影的鏈接]
2.利用Fiddler進(jìn)行抓包,模擬瀏覽器發(fā)送post請(qǐng)求,獲取電影實(shí)際下載地址。
3.使用PyQt5進(jìn)行包裝,實(shí)現(xiàn)多樣化的功能。(可選)
頁(yè)面分析
我使用Fiddler抓包,首先,瀏覽器進(jìn)入接口,這里隨便加一個(gè)vip電影的鏈接,然后來(lái)看post請(qǐng)求:
我們已經(jīng)知道了提交post請(qǐng)求的url,箭頭所指的地方是提交的表單,里面的url就是我們要下載vip電影的ur,出現(xiàn)%3F這些是因?yàn)閷rl編碼為了ASCII碼,這里可能使用urllib對(duì)其進(jìn)行解析,很簡(jiǎn)單;vkey需要我們獲取,其實(shí)它就藏在Post請(qǐng)求之前get請(qǐng)求返回的頁(yè)面中,vkey是動(dòng)態(tài)變化的,每一次都不一樣。紅線部分是服務(wù)器返回的信息,前幾天我爬取的時(shí)候里面的url還是電影的下載鏈接,現(xiàn)在變成了一個(gè)m3u8文件,里面的網(wǎng)址也是編碼后的,我們需要用urllib進(jìn)行解碼,我們手動(dòng)打開https://youku.cdn2-okzy.com/20200408/8808_23a9c669/index.m3u8看看里面的內(nèi)容,下載后打開
發(fā)現(xiàn)里面并沒有我們想要的ts文件,但是在文件中有一行1000k/hls/index.m3u8,也是以m3u8為后綴的,使用前面的url與文件中的部分地址拼接,結(jié)果為: https://youku.cdn2-okzy.com/20200408/8808_23a9c669/1000k/hls/index.m3u8,再次用瀏覽器手動(dòng)打開,下載內(nèi)容后發(fā)現(xiàn)里面是一個(gè)個(gè)ts文件,最后將ts文件下載后拼接即可(因?yàn)槲遗赖臅r(shí)候還是電影鏈接,寫博客時(shí)發(fā)現(xiàn)改了,所以拼接方法我也不會(huì),網(wǎng)上應(yīng)該容易找到)。
下面我們只要獲取vkey就可以得到這些ts文件地址了,我們向前看,找返回內(nèi)容有vkey的get請(qǐng)求:
對(duì)比發(fā)現(xiàn)和post請(qǐng)求中的vkey一樣,接下來(lái)就可以開始編寫代碼了。
代碼實(shí)現(xiàn)
獲取vkey,從上面的分析我們可以知道,get請(qǐng)求的網(wǎng)址為
https://www.administratorm.com/WANG.WANG/index.php?url=[要下載的vip電影]
我采用輸入鏈接的方式來(lái)拼接get請(qǐng)求要訪問(wèn)的url,順便使用urllib庫(kù)將輸入鏈接編碼,方便后面的post請(qǐng)求使用
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("請(qǐng)輸入電影url鏈接:") print("請(qǐng)稍等!") get_key_url = 'https://www.administratorm.com/WANG.WANG/index.php?url='+input_url parsed_url = parse.quote(input_url,safe='')
這里創(chuàng)建一個(gè)會(huì)話,會(huì)話是用于服務(wù)器記錄用戶身份的,然后就是發(fā)送get請(qǐng)求,獲取網(wǎng)頁(yè)源碼,然后使用re匹配到vkey的內(nèi)容,這里要注意的是get請(qǐng)求中的verify=False參數(shù),其實(shí)我也不太明白,是一些網(wǎng)站有SSl認(rèn)證,加了這個(gè)參數(shù)就可以跳過(guò)認(rèn)證,加了此參數(shù)可能會(huì)有很多警告,使用 logging.captureWarnings(True) 設(shè)置不顯示警告。
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請(qǐng)求的表單了,代碼很簡(jiǎn)單,就不做介紹了。
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.發(fā)送post請(qǐng)求,這里再次說(shuō)明,由于我原來(lái)post請(qǐng)求返回的信息是電影下載地址,所以我獲得的url是下載地址,現(xiàn)在再提交post請(qǐng)求獲得的是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.下載電影,由于鏈接不同,我就把我下載電影的代碼放到這里,做個(gè)參考。
down_load(sess,download_url) def down_load(sess,download_url): print("正在準(zhǔn)備下載電影") 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 #返回迭代器:是將二進(jìn)制流按大小分割之后的 k = input("請(qǐng)輸入文件路徑(C/D):") filename = input("請(qǐng)輸入保存文件名:") 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將上面的代碼包裝起來(lái),使其更加美觀,并添加一些功能,由于WebEngineView已經(jīng)不能播放flash了,并且有些需要新建標(biāo)簽的鏈接打不開,所以中間的瀏覽器很雞肋,就圖個(gè)好看吧。
這里就不詳細(xì)講了,PyQt5也比較簡(jiǎn)單,容易上手,如果需要的話聯(lián)系我吧。
總結(jié)
這是我第一次寫博客,如果哪里有問(wèn)題請(qǐng)及時(shí)指出來(lái),歡迎大家指正錯(cuò)誤,此爬蟲項(xiàng)目只用于入門,請(qǐng)不要用其盈利。否則,后果自負(fù)!
到此這篇關(guān)于Python爬蟲實(shí)現(xiàn)vip電影下載的示例代碼的文章就介紹到這了,更多相關(guān)Python爬蟲vip電影下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)去除Excel重復(fù)數(shù)據(jù)并統(tǒng)計(jì)重復(fù)次數(shù)
這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言實(shí)現(xiàn)文本數(shù)據(jù)去重,創(chuàng)建包含唯一值的新列,并統(tǒng)計(jì)文本數(shù)據(jù)出現(xiàn)的次數(shù),需要的可以參考下2023-08-08python神經(jīng)網(wǎng)絡(luò)ShuffleNetV2模型復(fù)現(xiàn)詳解
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)ShuffleNetV2模型復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Jupyter notebook遠(yuǎn)程訪問(wèn)服務(wù)器的方法
今天小編就為大家分享一篇Jupyter notebook遠(yuǎn)程訪問(wèn)服務(wù)器的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05詳解MySQL數(shù)據(jù)類型int(M)中M的含義
int(M)拆分來(lái)說(shuō),int是代表整型數(shù)據(jù)那,么中間的M應(yīng)該是代表多少位了,后來(lái)查mysql手冊(cè)也得知了我的理解是正確的,下面這篇文章小編就來(lái)舉例詳細(xì)說(shuō)明。 文中介紹的很詳細(xì),相信對(duì)大家的理解和學(xué)習(xí)很有幫助,有需要的朋友們下面就來(lái)學(xué)習(xí)學(xué)習(xí)吧。2016-11-11Python代碼庫(kù)之Tuple如何append添加元素問(wèn)題
這篇文章主要介紹了Python代碼庫(kù)之Tuple如何append添加元素問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01Python調(diào)用C++,通過(guò)Pybind11制作Python接口
今天小編就為大家分享一篇關(guān)于Python調(diào)用C++,通過(guò)Pybind11制作Python接口,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10解決PDF 轉(zhuǎn)圖片時(shí)丟文字的一種可能方式
這篇文章主要介紹了解決PDF 轉(zhuǎn)圖片時(shí)丟字的一種可能方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03