網(wǎng)站首頁 編程語言 正文
如何實(shí)現(xiàn)python爬蟲爬取視頻時(shí)實(shí)現(xiàn)實(shí)時(shí)進(jìn)度條顯示_python
作者:knighthood2001 ? 更新時(shí)間: 2022-08-12 編程語言前言:
在爬取并下載網(wǎng)頁上的視頻的時(shí)候,我們需要實(shí)時(shí)進(jìn)度條,這可以幫助我們更直觀的看到視頻的下載進(jìn)度。
一、全部代碼展示
from contextlib import closing from requests import get url = 'https://v26-web.douyinvod.com/57cdd29ee3a718825bf7b1b14d63955b/615d475f/video/tos/cn/tos-cn-ve-15/72c47fb481464cfda3d415b9759aade7/?a=6383&br=2192&bt=2192&cd=0%7C0%7C0&ch=26&cr=0&cs=0&cv=1&dr=0&ds=4&er=&ft=jal9wj--bz7ThWG4S1ct&l=021633499366600fdbddc0200fff0030a92169a000000490f5507&lr=all&mime_type=video_mp4&net=0&pl=0&qs=0&rc=ank7OzU6ZnRkNjMzNGkzM0ApNmY4aGU8MzwzNzo3ZjNpZWdiYXBtcjQwLXNgLS1kLTBzczYtNS0tMmE1Xi82Yy9gLTE6Yw%3D%3D&vl=&vr=' with closing(get(url, stream=True)) as response: chunk_size = 1024 # 單次請求最大值 # response.headers['content-length']得到的數(shù)據(jù)類型是str而不是int content_size = int(response.headers['content-length']) # 文件總大小 data_count = 0 # 當(dāng)前已傳輸?shù)拇笮? with open('文件名.mp4', "wb") as file: for data in response.iter_content(chunk_size=chunk_size): file.write(data) done_block = int((data_count / content_size) * 50) # 已經(jīng)下載的文件大小 data_count = data_count + len(data) # 實(shí)時(shí)進(jìn)度條進(jìn)度 now_jd = (data_count / content_size) * 100 # %% 表示% print("\r [%s%s] %d%% " % (done_block * '█', ' ' * (50 - 1 - done_block), now_jd), end=" ")
注:上面的url已過期,需要各位自己去找網(wǎng)頁上的視頻url
二、解釋
1.with closing
我們在日常讀取文件資源時(shí),經(jīng)常會(huì)用到with open() as f:的句子。
但是使用with語句的時(shí)候是需要條件的,任何對(duì)象,只要正確實(shí)現(xiàn)了上下文管理,就可以使用with語句,實(shí)現(xiàn)上下文管理是通過__enter__
和__exit__
這兩個(gè)方法實(shí)現(xiàn)的。
with用法(沒有實(shí)現(xiàn)上下文管理)
class Door(): def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close()
?結(jié)果報(bào)錯(cuò)了:
with用法(實(shí)現(xiàn)上下文管理)
用__enter__
和__exit__實(shí)現(xiàn)了上下文管理
class Door(): def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close()
?結(jié)果沒報(bào)錯(cuò):
closing用法(完美解決上述問題)
一個(gè)對(duì)象沒有實(shí)現(xiàn)上下文,我們就不能把它用于with
語句。這個(gè)時(shí)候,可以用contextlib中的
closing()
來把該對(duì)象變?yōu)樯舷挛膶?duì)象。
class Door(): def __enter__(self): print('Begin') return self def __exit__(self, exc_type, exc_value, traceback): if exc_type: print('Error') else: print('End') def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close()
例如:用with語句使用requests中的get(url)
也就是本文中的案例,使用with closing()下載視頻(在網(wǎng)頁中)
2.文件流stream
想象一下,如果把文件讀取比作向池子里抽水,同步會(huì)阻塞程序,異步會(huì)等待結(jié)果,如果池子非常大呢?
因此有了文件流,它就好比你一邊抽一邊取,不用等池子滿了再用,
所以對(duì)于一些大型文件(幾個(gè)G的視頻)一般會(huì)用到這個(gè)參數(shù)。(對(duì)小型文件也可以使用)
3.response.headers['content-length']
這表示獲取文件的總大小,但是它得到的結(jié)果的數(shù)據(jù)類型是str而不是int,因此需要進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換。
4.response.iter_content()
該方法一般用于從網(wǎng)上下載文件和網(wǎng)頁(需要用到requests.get(url))
其中chunk_size表示單次請求最大值。
5.\r和%
\r表示回車(回到行首)
%是一種占位符
而對(duì)于%%,第一個(gè)%起到了轉(zhuǎn)義的作用,使結(jié)果輸出為百分號(hào)%
三、結(jié)果展示
四、總結(jié)
我之前看了許多的進(jìn)度條,這些進(jìn)度條都能動(dòng),但是滿足不了根據(jù)文件內(nèi)容進(jìn)行加載(里面的參數(shù)要么都定死了,要么就與文件大小無關(guān)),不能做到真正的交互功能,這次的進(jìn)度條就很好的展示了,大家可以去試試!!
這次下載視頻展示進(jìn)度條是爭對(duì)一個(gè)url,大家可以將它加到你的爬蟲的循環(huán)中,這樣就能在爬每個(gè)視頻的時(shí)候展示實(shí)時(shí)進(jìn)度條了!!
原文鏈接:https://blog.csdn.net/knighthood2001/article/details/120624571
相關(guān)推薦
- 2022-05-24 淺談C#中Action和Func回調(diào)的常用方式_C#教程
- 2022-04-15 C#的并發(fā)機(jī)制優(yōu)秀在哪你知道么_C#教程
- 2022-04-20 Flutter如何輕松實(shí)現(xiàn)動(dòng)態(tài)更新ListView淺析_Android
- 2022-09-13 Go語言實(shí)現(xiàn)超時(shí)的三種方法實(shí)例_Golang
- 2022-05-13 ERROR org.apache.hadoop.hdfs.server.datanode.DataN
- 2022-12-15 python中的閉包和裝飾器的使用示例_python
- 2022-05-28 C語言數(shù)據(jù)結(jié)構(gòu)深入探索順序表_C 語言
- 2023-06-19 阿里低代碼框架lowcode-engine設(shè)置默認(rèn)容器詳解_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支