首頁 > 軟體

用Python打造批量下載視訊並能視覺化下載進度的炫酷下載器

2021-05-27 21:00:07

來源:Python爬蟲與資料探勘

作者:Python進階者

大家好,我是Python進階者,今天給大家整點好玩的,一起來看看吧~

【一、項目背景】

平時宅在家的我們最愛做的事莫過於追劇了,但是有時候了,網路原因,可能會讓你無網可上,這個時候那些好看的電視劇和電影自然是無法觀看了,本期我們要講的就是怎樣下載這些視訊。

【二、項目目標】

通過Python程式對所感興趣的視訊進行批量下載,正好小編近期看到一些不錯的視訊,因為想往安卓方向走,但又苦於重新學習太複雜,有沒有簡單點的,之前好像有什麼e4a但是要學易語言就放棄了,於是乎在茫茫網路發現了一個小眾的程式語言---裕語言。好傢伙,不說了,趕緊下載,盤它。

【三、項目實施】

採用sublime text 3 編寫程式,先看看效果:

C:UsersAdministratorDesktop232.jpg

接下來,由小編我為大家展現程式的具體實現步驟。

【四、實現步驟】

1.分析網頁結構

老樣子,審查元素定位,如下圖:

C:UsersAdministratorDesktop1212.jpg

發現視訊全都在a標籤裡面,因為這個頁面的視訊比較多,所以我們繼續分析頁面,發現一個神奇的事情。哈哈,原來所有的視訊都在class為videoDown的a標籤裡,有了這個重要的資訊就什麼都好辦了。

#解析頁面

def parser():

ab=[]

rep=requests.get('http://v.u00.cn:93/iappce.htm#sp',timeout=5,headers=headers)

rep.encoding='utf-8'

soup=BeautifulSoup(rep.text,'html.parser')

res=soup.find_all('a',class_='videoDown')#尋找所有class為videoDown的a標籤

for y in res:

ab.append('http://v.u00.cn:93'+y.attrs['href'])

#將獲取到的視訊URL地址新增到列表中

return ab #返回所有視訊地址的列表

這樣就輕輕鬆鬆拿到了頁面所有的視訊地址,怎麼樣,是不是超級簡單了。

2.下載檔案

因為我們講的是批量下載,所以在此之前需要先了解單個下載,當然,單個下載是很耗費時間,而且系統資源利用率太低。

我們來看看這個下載函數如何實現:

#下載函數

def down(y,x):

print('------下載第',str(x),'課-------')

ss=str(y.split('.')[3:4]) #擷取檔名

sa=ss.replace('[','').replace(']','')#替換檔名中的特殊符號

ree=requests.get(y)

with open('%d.%s.mp4'%(x,sa),'wb') as f:

f.write(ree.content) #儲存檔案

無非就是一些常用的字元串分隔以及檔案操作罷了,不過此種因為比較單一,下載多個檔案就行不通了,所以一般只要不是大批量下載,這種方法就夠了。

然後在給他套一個函數用來簡化他的啟動之路。

def main():

for y in range(len(parser())):

down(parser()[y],y) #下載

main()

最後呼叫主函數main,輕輕鬆鬆完成單個檔案下載。

3.獲取檔案大小並給下載檔案新增緩衝

在下載視訊的時候如果我們一下子把所有的資源你都拿出來放進CPU讀取,那麼很快就會崩潰,所以我們需要設定一個緩衝,等他緩衝區滿了然後拿出來讀取,聽起來好像挺抽象,讓我們一起來看一下吧。

C:UsersAdministratorDesktop4343.jpg

圖中所示即為視訊大小值和請求範圍的值。

1.獲取視訊大小

def download(url, file_name): #下載視訊

urllib3.disable_warnings()

rep=requests.get(url,headers=headers)

head=rep.headers

rep=requests.get(url,headers=headers)

head=rep.headers #獲取請求頭字典

length=head.get('Content-Length') #獲取到視訊的大小,單位是位元組

若想讓他以MB為單位,則需除以兩個1024

file_size = int(length) #視訊大小用int轉換

if os.path.exists(file_name): #判斷檔名是否存在

first_byte = os.path.getsize(file_name) #獲取檔名大小

else:

first_byte = 0

if first_byte >= file_size:

return file_size #返回檔案大小

header = {"Range": "bytes=%s-%s" % (first_byte, file_size),

'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36

(KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'

} #設定請求頭,標明請求範圍

2.配置進度條

pbar = tqdm( #配置進度條模組,設定檔案大小,檔案位元組數,檔案的進度

total=file_size, initial=first_byte,

unit='B', unit_scale=True, desc=url.split('/')[-1])

#關於tqdm 具體用法大家可以百度tqdm模組。

3.新增緩衝

with closing(requests.get(url, headers=header, stream=True)) as req:

#關閉連線

with open(file_name,'wb') as f: #開啟檔案

for chunk in req.iter_content(chunk_size=1024*2): #設定緩衝

if chunk:

pbar.set_description("【正在下載視訊 %s】"%str(f.name))

f.write(chunk) #寫入檔案

pbar.update(1024) #更新當前進度條 pbar.close() #關閉進度條

return file_size #返回檔案大小

4.構建下載視訊並顯示進度條函數

def fd(): #下載並顯示進度條

global x

x=1

for y in parser():

print('----正在下載',x,'課-----')

ss=str(y.split('.')[3:4])

sa=ss.replace('[','').replace(']','') #檔名

download(y, "{}.{}.mp4".format(str(x),sa)) #下載

print('----完成下載',x,'課-----')

x+=1

5.啟動程式

Fd()

【五.總結】

批量下載視訊檔案是一個不可多得的技術,程式寫的並不夠好,比如程式沒有新增多執行緒,多程序,協程,也沒有非同步操作,可能是因為自己比較懶吧,哈哈哈。

不過也挺簡單,多執行緒就是threading.Thread 順便加鎖 Lock,也可以用多程序multiprocessing中的Process或者程序池Pool,或者協程genvent,或者非同步asyn


IT145.com E-mail:sddin#qq.com