03.06 Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

1. 前言

還在為在線看小視頻緩存慢發愁嗎?還在為想重新回味優秀作品但找不到資源而憂慮嗎?莫要慌,讓python來幫你解決,40行代碼教你爬遍小視頻網站,先批量下載後仔細觀看,豈不美哉!

2. 整理思路

這類網站一般大同小異,本文就以鳳凰網新聞視頻網站為例,採用倒推的方式,給大家介紹如何通過流量分析獲得視頻下載的url,進而批量下載。


3. 操作步驟

3.1 分析網站,找出網頁變化規律

1、首先找到網頁,網頁詳情如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

2、該視頻網站分為人物、娛樂、藝術等不同類型,本文以體育版塊為例,下拉到底端,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

3、根據上圖的結果,我們可以發現該網站是動態網頁,打開瀏覽器自帶流量分析器,點擊加載更多,找出網頁變化規律,第一個就是,請求網址和返回結果如下圖。標記處為頁碼,此時是第3頁。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

4、返回結果包含視頻的title、網頁url、guid(相當於每個視頻的標誌,後續有用)等信息,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

5、每個網頁裡邊包含24個視頻,打印出來是這樣的,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

3.2 尋找視頻網頁地址規律

1、先打開流量分析器,播放視頻進行抓包,找到幾個mp2t文件,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

2、它們的網址我依次找了出來,放到文本文件中存放起來,以發現它們之間的規律,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

3、大家發現規律了嗎?網址中的p26275262-102-9987636-172625參數就是視頻的guid(上述已經得到),只有range_bytes參數是變化的,而且是從0到6767623,很顯然這是視頻的大小,而且視頻是分段合成的。找到這些規律之後,接下來我們需要繼續進行細挖視頻地址的出處。


3.3 尋找視頻的下載原始地址

1、先考慮一個問題,視頻的地址是從哪來的呢?一般情況下,先在視頻網頁裡看看有沒有,如果沒有,我們就在流量分析器裡,沿著第一個分段視頻往上找,肯定是有某個網址返回了這些信息,很快,我在1個vdn.apple.mpegurl文件裡發現了下圖這個。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

2、太驚喜了,這不就是我們要找的信息麼,再看看它的url參數,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

3、上圖參數看起來很多的樣子,不過不用怕。還是利用老辦法,先在網頁裡看看有沒有,沒有的話還在流量分析器裡往上找,功夫不負有心人,我找到了下圖這個。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

4、它的url如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

5、仔細找找規律,我們發現唯一需要變化的就是每個視頻的guid了,這個第一步已經得到了。另外,返回結果包含了上述除了vkey的所有參數,而且這個參數最長,那該怎麼辦呢?

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

6、不要慌,萬一這個參數沒有用呢,先把vkey去掉試一試。果不其然,果然沒有什麼用,現在整個過程已經捋順了,現在可以擼代碼了。

3.4 代碼實現

1、在代碼裡邊,設置多線程下載,如下圖所示,其中頁碼可以自己進行修改哈。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

2、解析返回參數,json格式的,使用json庫進行處理,如下圖所示。通過解析,我們可以得到每個視頻的title、網頁url、和guid。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

3、模擬請求,獲得除Vkey外的參數,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

4、利用上一步中的參數,進行模擬請求,獲得包含分段視頻的信息,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

5、將分段視頻合併,保存在1個視頻文件,並以title命名,如下圖所示。

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

3.5 效果呈現

1、當程序運行之後,我們便可以看到網頁中的視頻嘩啦嘩啦的在本地文件夾中進行呈現,如下圖所示。接下來,媽媽再也不用擔心我喜歡的視頻找不著了,真香!

Python:40行代碼教你利用Python網絡爬蟲批量抓取小視頻

當然了,如果想更加直觀的話,可以在代碼中加入維測信息,這個大家可以自己手動設置一下。

4. 總結

本文主要基於Python網絡爬蟲,利用40行代碼,針對小視頻網頁,進行批量獲取網頁視頻到本地。方法簡單易行,而且行之有效,歡迎大家踴躍嘗試。完整代碼如下:

<code> # -*- coding: utf-8 -*- 
import requests
from bs
import BeautifulSoup 4import re 5import json 6import threading 7 8header = { 9 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0'10 }1112def get_href(url): # 提取每個視頻所在網頁的href,交給get_video_url()函數13 response = requests.get(url, headers=header)14 items=json.loads(response.text)15 for item in items['data']['data']:16 title=item['title']17 VideoHtmlUrl='http:'+item['url']18 Guid=item['guid']19 print(title,url,Guid)20 down_load_video(title, VideoHtmlUrl, Guid)2122def down_load_video(title, VideoHtmlUrl, Guid): # 下載視頻23 url='https://shankapi.ifeng.com/feedflow/getVideoAuthUrl/{0}/getVideoAuthPath_1'.format(Guid)24 response=requests.get(url, headers=header)25 results=json.loads(response.text.replace('getVideoAuthPath_1(','').replace(')', ''))26 results=results['data']27 vid = results['authUrl'] # 得到除Vkey外的參數28 video_url='https://60-28-123-129.ksyungslb.com/video19.ifeng.com/video09/2020/01/08/p26275262-102-9987636-172625/index.m3u8?reqtype=tsl&'+vid29 response=requests.get(video_url, headers=header)30 IndexTs=response.text.split('\\n')[5:][::2]31 for i in IndexTs:32 TsUrl='https://60-28-123-129.ksyungslb.com/video19.ifeng.com/video09/2020/01/08/p26275262-102-9987636-172625/'+i33 res = requests.get(TsUrl, stream=True, headers=header) # 根據視頻原始地址獲得視頻數據流34 with open('{0}.mp4'.format(title.replace('|', '')), 'ab')as f: # 保存數據流為MP4格式35 f.write(res.content)36 f.flush()3738def main():39 pagenum=340 for i in range(1, pagenum):41 url='https://shankapi.ifeng.com/shanklist/getVideoStream/{0}/24/27-95288-/1'.format(i)42 t=threading.Thread(target=get_href, args=(url,))43 t.start()4445if __name__=='__main__':46 main()/<code>


分享到:


相關文章: