国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

用python制作個(gè)視頻下載器

瀏覽:6日期:2022-06-28 15:45:26
前言

某個(gè)夜深人靜的夜晚,夜微涼風(fēng)微揚(yáng),月光照進(jìn)我的書(shū)房~當(dāng)我打開(kāi)文件夾以回顧往事之余,驚現(xiàn)許多看似雜亂的無(wú)聊代碼。我拍腿正坐,一個(gè)想法油然而生:“生活已然很無(wú)聊,不如再無(wú)聊些叭”。于是,我決定開(kāi)一個(gè)專題,便稱之為kimol君的無(wú)聊小發(fā)明。妙…啊~~~

眾所周知,視頻是一個(gè)學(xué)習(xí)新姿勢(shì)知識(shí)的良好媒介。那么,如何利用爬蟲(chóng)更加方便快捷地下載視頻呢?本文將從數(shù)據(jù)包分析到代碼實(shí)現(xiàn)來(lái)進(jìn)行一個(gè)相對(duì)完整的講解。

一、爬蟲(chóng)分析

本次選取的目標(biāo)視頻網(wǎng)站為某度旗下的好看視頻:

https://haokan.baidu.com1.視頻搜索

進(jìn)入主頁(yè)后,我們可以看到一個(gè)搜索框歷歷在目:

用python制作個(gè)視頻下載器

當(dāng)我們點(diǎn)擊搜索按鈕之后,會(huì)出現(xiàn)與關(guān)鍵字(ps.這里要考,大家仔細(xì)看😋)相匹配的視頻,我們需要做的便是抓包來(lái)分析其中的請(qǐng)求數(shù)據(jù)。

關(guān)于抓包工具,可以選擇三方工具(如Fiddler或者Burpsuit等),當(dāng)然也可以選擇瀏覽器自帶的調(diào)試工具(在瀏覽器中按F12即可打開(kāi))。在這里我選擇了后者,打開(kāi)F12調(diào)試工具,選擇網(wǎng)絡(luò):

用python制作個(gè)視頻下載器

在點(diǎn)擊搜索按鈕之后我們可以看到相應(yīng)的網(wǎng)絡(luò)請(qǐng)求出現(xiàn)在下面的工具框中:

用python制作個(gè)視頻下載器

通過(guò)簡(jiǎn)單的查找之后我們可以很容易地發(fā)現(xiàn)對(duì)應(yīng)的搜索請(qǐng)求(紅框標(biāo)出部分),其對(duì)應(yīng)的地址為:

https://haokan.baidu.com/videoui/page/search?query=kimol君666

那么,我們通過(guò)requests庫(kù)來(lái)模擬該請(qǐng)求,便可實(shí)現(xiàn)搜索視頻的功能:

import requestsres = requests.get(’https://haokan.baidu.com/videoui/page/search?query=xxxxx’)# xxxxx表示你需要搜索的關(guān)鍵字

注:這里不需要用到請(qǐng)求頭headers,但是不能一概而論。是否需要請(qǐng)求頭要根據(jù)具體網(wǎng)站分析哦~

你沒(méi)有看錯(cuò),我只用了2行代碼便實(shí)現(xiàn)了視頻網(wǎng)站的搜索功能。有時(shí)候,爬蟲(chóng)就是這么簡(jiǎn)單😉!在得到請(qǐng)求后,接下來(lái)我們要對(duì)這個(gè)請(qǐng)求返回的數(shù)據(jù)進(jìn)行分析,同樣是在F12調(diào)試工具中點(diǎn)擊右側(cè)的響應(yīng)便可以看到請(qǐng)求的響應(yīng):

用python制作個(gè)視頻下載器

很顯然,這里返回的是一個(gè)HTML格式的數(shù)據(jù),我們只需要通過(guò)re庫(kù)或是bs4庫(kù)等將我們需要的數(shù)據(jù)提取出來(lái)即可。至此,關(guān)于視頻搜索的分析基本算是完成了。然而!細(xì)心的小伙伴會(huì)發(fā)現(xiàn),我們現(xiàn)在可以獲得搜索結(jié)果,但是沒(méi)辦法選擇頁(yè)面呀。對(duì)嚯~那咋辦呀?

同樣,我們繼續(xù)抓包分析不就可以了嘛~ 我倒要看看你是怎么翻頁(yè)的。果然,下滑鼠標(biāo)之后我們得到了新的請(qǐng)求:

用python制作個(gè)視頻下載器

其請(qǐng)求地址變?yōu)榱耍?/p>

https://haokan.baidu.com/videoui/page/search?pn=2&rn=10&_format=json&tab=video&query=kimol君666

請(qǐng)求多了pn、rn、_format、tab等參數(shù),而且請(qǐng)求返回的格式也變?yōu)榱薐SON格式(豈不美哉?更方便提取想要的數(shù)據(jù)了)。通過(guò)簡(jiǎn)單測(cè)試可以知道,這些參數(shù)分別代表:

參數(shù) 說(shuō)明 pn 請(qǐng)求的頁(yè)碼 rn 每次請(qǐng)求返回的數(shù)據(jù)量 _format 請(qǐng)求返回的數(shù)據(jù)格式 tab 請(qǐng)求的標(biāo)簽類型

那么,相應(yīng)的代碼可以改為:

import requestspage = 1keyword = ’xxxxx’ # xxxxx為搜索的關(guān)鍵字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.視頻下載

視頻下載的思路也很清晰,只需進(jìn)入播放視頻的界面找到相應(yīng)的視頻原文件地址即可。小手一點(diǎn),我們便進(jìn)到了一個(gè)視頻的播放界面,我們可以發(fā)現(xiàn)其URL很有規(guī)律:它通過(guò)一個(gè)vid的參數(shù)來(lái)指向的相應(yīng)視頻。

用python制作個(gè)視頻下載器

右鍵視頻播放頁(yè)面查看源碼(或者通過(guò)右鍵視頻檢查元素也可),我們可以找到視頻播放的src,其對(duì)應(yīng)的正則表達(dá)式為:

p = ’<video src=(.*?)>’

那么,我們可以定義一個(gè)函數(shù)來(lái)解析視頻的原文件地址:

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參數(shù),將返回視頻的真正文件地址。有了視頻的地址,要下載視頻便是信手拈來(lái):

def download_video(vid): ’’’ 下載視頻文件 ’’’ savePath = ’xxxxx.mp4’ # 定義存儲(chǔ)的文件名 videoUrl = get_videoUrl(vid) # 獲取視頻下載地址 res = requests.get(videoUrl) with open(savePath,’wb’) as f: f.write(res.content)

至此,我們已經(jīng)可以根據(jù)關(guān)鍵字搜索相關(guān)的視頻,并且可以把視頻下載到本地了。這也意味著:關(guān)于本次視頻下載爬蟲(chóng)的介紹也就結(jié)束了,剩下的就是根據(jù)自己實(shí)際需求對(duì)代碼進(jìn)行包裝即可。

二、我的代碼

這里提供一個(gè)我自己的代碼,僅供參考:

# =============================================================================# 好看視頻_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’ # 視頻存儲(chǔ)路徑 def get_info(self,keywords,page): ’’’ 搜索關(guān)鍵字,獲取相關(guān)視頻信息 ’’’ self.result = [] # 相關(guān)視頻信息 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頁(yè)'爬取完成!’%(p+1)) self.result = pd.DataFrame(self.result) self.result.to_excel(’%s.xlsx’%keywords,index=False) # 定義隊(duì)列,用于多線程下載視頻 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): ’’’ 下載視頻文件 ’’’ # 如果視頻存儲(chǔ)目錄不存在則創(chuàng)建 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'下載完成!(用時(shí)%.2fs)’%(vid,t_e-t_s)) if __name__ == '__main__': keywords = ’多啦A夢(mèng)’ page = 1 # 爬取頁(yè)數(shù),每頁(yè)20條信息 t_s = time.time() haokan = Haokan() haokan.get_info(keywords,page) N_thread = 3 # 線程數(shù) 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(’任務(wù)完成!(用時(shí)%.2fs)’%(t_e-t_s))

運(yùn)行代碼,可以看到小頻頻全都來(lái)到我的碗里了😍~

用python制作個(gè)視頻下載器

寫(xiě)在最后

今天分享的視頻下載算是最基礎(chǔ)的了,它宛如一位慈祥的老奶奶,慈眉善目,面帶笑容。它沒(méi)有各種繁瑣的反爬機(jī)制(甚至連headers都不進(jìn)行驗(yàn)證),而且數(shù)據(jù)返回的格式也是極其友好的,就連視頻格式也顯得如此的溫柔。

我相信在“她”的陪伴下,我們可以走好學(xué)習(xí)爬蟲(chóng)的第一步。縱使日后我們還將面臨IP驗(yàn)證、參數(shù)驗(yàn)證、驗(yàn)證碼、行為檢測(cè)、瑞數(shù)系統(tǒng)等等諸多反爬考驗(yàn),也許還需應(yīng)對(duì)視頻格式轉(zhuǎn)換等挑戰(zhàn)。但是,請(qǐng)記住kimol君將始終陪伴在你們身邊~

最后,感謝各位大大的耐心閱讀,咋們下次再會(huì)~

以上就是用python制作個(gè)視頻下載器的詳細(xì)內(nèi)容,更多關(guān)于python 制作視頻下載器的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 资讯 | 醴陵市| 苏尼特左旗| 历史| 萨迦县| 盐城市| 惠来县| 南安市| 汉中市| 仙桃市| 措美县| 金秀| 富平县| 峨山| 辉县市| 慈溪市| 凌源市| 绥江县| 梁平县| 阜新市| 容城县| 紫金县| 台安县| 甘德县| 阳泉市| 邵阳市| 皮山县| 莱芜市| 白河县| 巴彦淖尔市| 湄潭县| 普格县| 曲麻莱县| 宣化县| 荃湾区| 民权县| 从化市| 恩施市| 贵南县| 洱源县| 海宁市|