来源:<em>Python</em>爬虫与数据挖掘 作者:<em>Python</em>进阶者 大家好,我是<em>Python</em>进阶者,今天给大家整点好玩的,一起来看看吧~【一、项目背景】平时宅在家的我们最爱做的事莫过于追剧了,但是有时候了,网络原因,可
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
相關文章
来源:<em>Python</em>爬虫与数据挖掘 作者:<em>Python</em>进阶者 大家好,我是<em>Python</em>进阶者,今天给大家整点好玩的,一起来看看吧~【一、项目背景】平时宅在家的我们最爱做的事莫过于追剧了,但是有时候了,网络原因,可
2021-05-27 21:00:07
华为MateBook 16笔记本其它主要硬件,配双通道16GB 3200MHz高频率内存,搭配512GB 高速<em>SSD</em>固态盘。 华为MateBook 16笔记本采用75mm+电竞级双风扇+2mm加厚双大热管组成的鲨鱼麟散热系统。确保华为MateBook 16
2021-05-27 20:33:18
至于未来,从实际产品来看,希捷显然已经搞定了双磁臂的电机体积和功耗问题,随着进一步发展,更多的独立电机、更多的磁臂也是一定能实现的;数据流处理方面,现在的芯片连高速<em>SSD</em>的7GB/s读写都能搞定,问题也不大;至于接
2021-05-27 20:33:08
不知道大家有没有发现,现在的电脑硬件市场,除了CPU之外,其它的硬件都会有不同幅度的涨价。而且<em>固态硬盘</em>的价格,也是在飞速的上涨。有不少人都在纠结,电脑各个硬件都涨价了,就算是想买个<em>固态硬盘</em>,也不知道
2021-05-27 20:33:06
相当于新能源车的“<em>CPU</em>”。 “难搞”则体现在发展IGBT的国内外市场环境上。 我们发现:在全球“芯片荒”的大背景下,目前国内外IGBT市场仍主要由外资主导。业内人士就预测:2024年中国IGBT行业产量将达到近800
2021-05-27 20:33:00
高通最强的处理器骁龙888的<em>CPU</em>性能跟A13相比,多核心比A13强,单核心不如A13。GPU性能不如A13。综合性能跟A13相比有差距。 A13强大至此。 所以说,A13在2021年也是完全够用。 2、的屏幕是OLED材质,iPhone11的
2021-05-27 20:32:54