| 參數 | 說明 |
|---|---|
| pn | 請求的頁碼 |
| rn | 每次請求返回的數據量 |
| _format | 請求返回的數據格式 |
| tab | 請求的標簽類型 |
那么,相應的代碼可以改為:
import requests page = 1 keyword = 'xxxxx' # xxxxx為搜索的關鍵字 url = 'https://haokan.baidu.com/videoui/page/search?pn=%drn=10_format=jsontab=videoquery=%s'%(page,keyword) res = requests.get(url) data = res.json()
至此,視頻搜索部分的分析算是告于段落了。
視頻下載的思路也很清晰,只需進入播放視頻的界面找到相應的視頻原文件地址即可。
小手一點,我們便進到了一個視頻的播放界面,我們可以發現其URL很有規律:它通過一個vid的參數來指向的相應視頻。

右鍵視頻播放頁面查看源碼(或者通過右鍵視頻檢查元素也可),我們可以找到視頻播放的src,其對應的正則表達式為:
p = 'video class="video" src=(.*?)>'
那么,我們可以定義一個函數來解析視頻的原文件地址:
def get_videoUrl(vid):
'''
提取視頻信息中的視頻源地址
'''
res = requests.get('https://haokan.baidu.com/v?vid=%s'%vid)
html = res.text
videoUrl = re.findall('video class="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 re
import os
import time
import queue
import requests
import threading
import pandas as pd
class Haokan:
def __init__(self):
self.url = 'https://haokan.baidu.com/videoui/page/search?pn=%drn=20_format=jsontab=videoquery=%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 class="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 制作視頻下載器的資料請關注腳本之家其它相關文章!