1. 程式人生 > 其它 >eclipse安裝進度條不動_[Python]如何為爬蟲新增下載進度條

eclipse安裝進度條不動_[Python]如何為爬蟲新增下載進度條

技術標籤:eclipse安裝進度條不動python 獲取檔案大小python 進度條requests下載大檔案如何為wordpress欄目新增id

1.引言

(如果要直接看結果,請直接拉到文章末尾。)

之前寫過如何開發微博爬蟲的文章(後臺回覆‘微博爬蟲’獲取文章),並將微博爬蟲開源到了GitHub上(後臺回覆‘微博程式碼’獲取程式碼)。

傳統的視訊圖片的下載姿勢,如果使用requests包可以簡單到下面這樣的一句程式碼:

requests.get(img_url,stream=True).content

上述程式碼所完成的操作:

(1)開啟網路流;

(2)讀取返回的內容。

為了突出重點,這裡省略了代理(proxies)、Header、以及超時(timeout)的設定。

但這樣做不能分辨出假死的情況,尤其是微博這種視訊圖片居多的網站,很有可能卡在抓取視訊圖片的過程中一動不動。或者在下載大檔案的時候,雖然檔案一直在下載,但我們卻不知道檔案到底下載了多少,還要下載多少時間。

所以在實際爬蟲開發過程中,如果能動態的展示視訊或圖片的下載過程對於監控爬蟲執行是非常必要的。

b0d7653e550758be75fd7482f8b19c38.png

圖表 1迅雷下載中的進度條

2.正文

要做到為下載過程新增進度條,首先需要了解requests.get()方法和tqdm包。

2.1 tqdm包

tqdm來自阿拉伯文中taqaddum,意思是‘進度’,也是西班牙語中的tequiero demasiado縮寫,意思是‘我非常愛你’。tqdm提供一種簡單易用的方式用來顯示進度。

2.1.1 安裝

使用conda方式:

conda install -c conda-forge tqdm

使用pip方式:

pip install tqdm

2.1.2 使用

tqdm使用起來也非常方便,最簡單的用法如下:

from tqdm import tqdm#匯入相應的方法for i in tqdm(range(10000)):#tqdm()方法      pass

只需要引入tqdm方法,然後使用將可迭代(iterable)的物件傳入tqdm()方法即可。

複雜一點的用法如下:

with tqdm(total=100) as pbar:#tqdm方法設定進度條長度    for i inrange(10):        sleep(0.1)       pbar.update(10)#手動更新進度

相較於簡單的用法,複雜一點的方式需要手動的去更新進度。

2.2 requests

2.2.1 get方法

本文獲取檔案長度通過requests.get()方法。requests.get()方法中stream引數當stream=True的時候,get()方法只下載Header部分,如果要下載Body部分,需要讀取content屬性視訊圖片才會下載。所以我們可以利用這一點來完成對視訊圖片的下載進行動態監控。獲取檔案大小的方法如下:

response=requests.get(img_url,stream=True)file_size=response.headers['Content-length']

2.2.2 iter_content

iter_content方法用於分塊讀取get()方法返回的流,避免因一次性讀取消耗大量記憶體。

for chunk in response.iter_content(chunk_size=1024):  pass

3.為視訊圖片下載新增進度條

基於以上的分析,可以得出新增進度條的整個步驟如下:

(1)獲取Header,使用requests.get()方法;

(2)獲取檔案大小,使用response的‘Content-length’屬性;

(3)初始化tqdm;

(4)分塊讀取檔案並更新進度條,使用iter_content()方法;

(5)關閉進度條,使用close()方法。

完整的程式碼如下:

import requestsimport tqdmimg_url='http://122.51.50.206:8088/imgs/63943f53ly1gjgojmh9zaj222o0yi7wq.jpg'response=requests.get(img_url,stream=True)file_size=response.headers['Content-length']print(file_size)pbar=tqdm.tqdm(total=int(file_size),unit='B',unit_scale=True,desc=img_url.split('/')[-1])with(open('1.jpg','wb')) as f:    for chunk in response.iter_content(chunk_size=1024):        if  chunk:            f.write(chunk)            pbar.update(1024)pbar.close()

4.參考連結

[1]https://stackoverflow.com/questions/14270698/get-file-size-using-python-requests-while-only-getting-the-header

[2]https://pypi.org/project/tqdm/

最後,歡迎持續關注本公眾號。

b3fa78f97bcebca51c40457f727b2c37.png