用python制作個視頻下載器
某個夜深人靜的夜晚,夜微涼風微揚,月光照進我的書房~當我打開文件夾以回顧往事之余,驚現許多看似雜亂的無聊代碼。我拍腿正坐,一個想法油然而生:“生活已然很無聊,不如再無聊些叭”。于是,我決定開一個專題,便稱之為kimol君的無聊小發明。妙…啊~~~
眾所周知,視頻是一個學習新姿勢知識的良好媒介。那么,如何利用爬蟲更加方便快捷地下載視頻呢?本文將從數據包分析到代碼實現來進行一個相對完整的講解。
一、爬蟲分析本次選取的目標視頻網站為某度旗下的好看視頻:
https://haokan.baidu.com1.視頻搜索
進入主頁后,我們可以看到一個搜索框歷歷在目:
當我們點擊搜索按鈕之后,會出現與關鍵字(ps.這里要考,大家仔細看😋)相匹配的視頻,我們需要做的便是抓包來分析其中的請求數據。
關于抓包工具,可以選擇三方工具(如Fiddler或者Burpsuit等),當然也可以選擇瀏覽器自帶的調試工具(在瀏覽器中按F12即可打開)。在這里我選擇了后者,打開F12調試工具,選擇網絡:
在點擊搜索按鈕之后我們可以看到相應的網絡請求出現在下面的工具框中:
通過簡單的查找之后我們可以很容易地發現對應的搜索請求(紅框標出部分),其對應的地址為:
https://haokan.baidu.com/videoui/page/search?query=kimol君666
那么,我們通過requests庫來模擬該請求,便可實現搜索視頻的功能:
import requestsres = requests.get(’https://haokan.baidu.com/videoui/page/search?query=xxxxx’)# xxxxx表示你需要搜索的關鍵字
注:這里不需要用到請求頭headers,但是不能一概而論。是否需要請求頭要根據具體網站分析哦~
你沒有看錯,我只用了2行代碼便實現了視頻網站的搜索功能。有時候,爬蟲就是這么簡單😉!在得到請求后,接下來我們要對這個請求返回的數據進行分析,同樣是在F12調試工具中點擊右側的響應便可以看到請求的響應:
很顯然,這里返回的是一個HTML格式的數據,我們只需要通過re庫或是bs4庫等將我們需要的數據提取出來即可。至此,關于視頻搜索的分析基本算是完成了。然而!細心的小伙伴會發現,我們現在可以獲得搜索結果,但是沒辦法選擇頁面呀。對嚯~那咋辦呀?
同樣,我們繼續抓包分析不就可以了嘛~ 我倒要看看你是怎么翻頁的。果然,下滑鼠標之后我們得到了新的請求:
其請求地址變為了:
https://haokan.baidu.com/videoui/page/search?pn=2&rn=10&_format=json&tab=video&query=kimol君666
請求多了pn、rn、_format、tab等參數,而且請求返回的格式也變為了JSON格式(豈不美哉?更方便提取想要的數據了)。通過簡單測試可以知道,這些參數分別代表:
參數 說明 pn 請求的頁碼 rn 每次請求返回的數據量 _format 請求返回的數據格式 tab 請求的標簽類型
那么,相應的代碼可以改為:
import requestspage = 1keyword = ’xxxxx’ # xxxxx為搜索的關鍵字url = ’https://haokan.baidu.com/videoui/page/search?pn=%d&rn=10&_format=json&tab=video&query=%s’%(page,keyword)res = requests.get(url)data = res.json()
至此,視頻搜索部分的分析算是告于段落了。
2.視頻下載視頻下載的思路也很清晰,只需進入播放視頻的界面找到相應的視頻原文件地址即可。小手一點,我們便進到了一個視頻的播放界面,我們可以發現其URL很有規律:它通過一個vid的參數來指向的相應視頻。
右鍵視頻播放頁面查看源碼(或者通過右鍵視頻檢查元素也可),我們可以找到視頻播放的src,其對應的正則表達式為:
p = ’<video src=(.*?)>’
那么,我們可以定義一個函數來解析視頻的原文件地址:
def get_videoUrl(vid): ’’’ 提取視頻信息中的視頻源地址 ’’’ res = requests.get(’https://haokan.baidu.com/v?vid=%s’%vid) html = res.text videoUrl = re.findall(’<video src=(.*?)>’,html)[0] return videoUrl
輸入視頻的id參數,將返回視頻的真正文件地址。有了視頻的地址,要下載視頻便是信手拈來:
def download_video(vid): ’’’ 下載視頻文件 ’’’ savePath = ’xxxxx.mp4’ # 定義存儲的文件名 videoUrl = get_videoUrl(vid) # 獲取視頻下載地址 res = requests.get(videoUrl) with open(savePath,’wb’) as f: f.write(res.content)
至此,我們已經可以根據關鍵字搜索相關的視頻,并且可以把視頻下載到本地了。這也意味著:關于本次視頻下載爬蟲的介紹也就結束了,剩下的就是根據自己實際需求對代碼進行包裝即可。
二、我的代碼這里提供一個我自己的代碼,僅供參考:
# =============================================================================# 好看視頻_v0.1# =============================================================================import reimport osimport timeimport queueimport requestsimport threadingimport pandas as pdclass Haokan: def __init__(self): self.url = ’https://haokan.baidu.com/videoui/page/search?pn=%d&rn=20&_format=json&tab=video&query=%s’ self.headers = { ’User-Agent’: ’Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0’, ’Accept’: ’text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8’, ’Accept-Language’: ’zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2’, ’Connection’: ’keep-alive’, ’Upgrade-Insecure-Requests’: ’1’, ’TE’: ’Trailers’, } self.savaPath = ’./videos’ # 視頻存儲路徑 def get_info(self,keywords,page): ’’’ 搜索關鍵字,獲取相關視頻信息 ’’’ self.result = [] # 相關視頻信息 for p in range(1,page+1): res = requests.get(self.url%(p,keywords),headers=self.headers) data = res.json()[’data’][’response’] videos = data[’list’] self.result.extend(videos) print(’'第%d頁'爬取完成!’%(p+1)) self.result = pd.DataFrame(self.result) self.result.to_excel(’%s.xlsx’%keywords,index=False) # 定義隊列,用于多線程下載視頻 self.url_queue = queue.Queue() for vid,url in zip(self.result[’vid’],self.result[’url’]): self.url_queue.put((vid,url)) def get_videoUrl(self,url): ’’’ 提取視頻信息中的視頻源地址 ’’’ res = requests.get(url,headers=self.headers) html = res.text videoUrl = re.findall(’<video src=(.*?)>’,html)[0] return videoUrl def download_video(self,videoId,videoUrl): ’’’ 下載視頻文件 ’’’ # 如果視頻存儲目錄不存在則創建 if not os.path.exists(self.savaPath): os.mkdir(self.savaPath) res = requests.get(videoUrl,headers=self.headers) with open(’%s/%s.mp4’%(self.savaPath,videoId),’wb’) as f: f.write(res.content) def run(self): while not self.url_queue.empty(): t_s = time.time() vid,url = self.url_queue.get() try: video_url = self.get_videoUrl(url) self.download_video(vid,video_url) except: print(’'%s.mp4'下載失敗!’%vid) continue t_e = time.time() print(’'%s.mp4'下載完成!(用時%.2fs)’%(vid,t_e-t_s)) if __name__ == '__main__': keywords = ’多啦A夢’ page = 1 # 爬取頁數,每頁20條信息 t_s = time.time() haokan = Haokan() haokan.get_info(keywords,page) N_thread = 3 # 線程數 thread_list = [] for i in range(N_thread): thread_list.append(threading.Thread(target=haokan.run)) for t in thread_list: t.start() for t in thread_list: t.join() t_e = time.time() print(’任務完成!(用時%.2fs)’%(t_e-t_s))
運行代碼,可以看到小頻頻全都來到我的碗里了😍~
今天分享的視頻下載算是最基礎的了,它宛如一位慈祥的老奶奶,慈眉善目,面帶笑容。它沒有各種繁瑣的反爬機制(甚至連headers都不進行驗證),而且數據返回的格式也是極其友好的,就連視頻格式也顯得如此的溫柔。
我相信在“她”的陪伴下,我們可以走好學習爬蟲的第一步。縱使日后我們還將面臨IP驗證、參數驗證、驗證碼、行為檢測、瑞數系統等等諸多反爬考驗,也許還需應對視頻格式轉換等挑戰。但是,請記住kimol君將始終陪伴在你們身邊~
最后,感謝各位大大的耐心閱讀,咋們下次再會~
以上就是用python制作個視頻下載器的詳細內容,更多關于python 制作視頻下載器的資料請關注好吧啦網其它相關文章!
相關文章: