Copy a network object denoted by a URL to a local file .
urlretrieve 的文件解釋是從網址複製一個網路上的物件到本地檔案
就是把請求來的檔案,也寫入 (複製) 一份到本地
不過 urlretrieve 提供了額外的功能
總之先上一段 Code :
import sys from urllib.request import urlretrieve
def progress(block_num, block_size, total_size): # block_num : A count of blocks transferred so far # block_size : A block size in bytes # total_size : The total size of the file
sys.stdout.write('\rDownloading %s %.1f%%' % (filename, float(block_num * block_size) / float(total_size) * 100.0)) sys.stdout.flush()
url = 'https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz' filename = 'Python-3.8.3.tgz'
urlretrieve(url, filename, progress) print()
|
實際上 urlretrieve 的函數宣告是 :
urllib.request.urlretrieve(url, filename = None, reporthook = None, data = None)
參數分別是網址、檔案名稱、一個 Callback Function 還有 data ... ?
我查資料查了很久,都沒有看到 data 的使用方式,查詢標準的文件也沒看到相關說明
所以我也不知道那參數是幹嘛的 ...
直接說 Callback Function 的部分,Callback Function 裡面又需要三個參數
根據文件解釋,第一個參數回傳有幾個 block
第二個參數回傳一個 block 的 bytes 大小
第三個參數回傳檔案總大小,也是 bytes 計算
由此可得一個公式 : block_num * block_size / total_size * 100 就是下載百分比
Code 的部分是去下載 Python 3.8.3 的壓縮檔,總共 22.9 MB
你可以執行一次,這樣就可以看到 Callback Function 實現的進度條效果
一般來說下載檔案使用 Context Manager 就很夠用了
而我覺得 urlretrieve 的優勢就在於多一個 Callback Function 可以使用
大部分時候就會用來寫進度條,讓自己知道下載進度
適合用在檔案較大的情境
當然 urlretrieve 做的事情還有很多啦,主要是一些例外處理等等
不過以爬蟲應用來說,知道這些就算是足夠