創作內容

1 GP

urlretrieve

作者:Yotsuba│2020-05-31 11:05:12│巴幣:2│人氣:202
Copy a network object denoted by a URL to a local file .

urlretrieve 的文件解釋是從網址複製一個網路上的物件到本地檔案

如果以 Context Manager 下載檔案,幾乎也是一模一樣的行為

就是把請求來的檔案,也寫入 (複製) 一份到本地

不過 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 做的事情還有很多啦,主要是一些例外處理等等

不過以爬蟲應用來說,知道這些就算是足夠
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4800729
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 3 篇留言

朝輝夕嵐
這個download的路徑可以設定嗎?
不知道為甚麼我把照抄 然後他下載下來的路徑會在資料夾外面

06-09 19:56

Yotsuba
當然可以

無論你是用 Python 原生的 open 或是 urlretrieve,路徑和檔名都是寫在一起

比如說這樣的格式 -> C:\example\file.jpg06-09 20:25
朝輝夕嵐
通常路徑是不是不要有中文比較好啊?
可能因為有中文的關係,照著做他會報錯
File "c:/Users/XXXXX/Documents/python_file/爬蟲練習/urlretrieve/urlretrieve.py", line 16
SyntaxError: Non-UTF-8 code starting with '\xaa' in file c:/Users/XXXXX/Documents/python_file/爬蟲練習/urlretrieve/urlretrieve.py on line 16, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
我把它放到爬蟲練習前的上一個資料夾就沒問題ㄌ

06-09 21:00

朝輝夕嵐
喔喔 我剛剛找到問題了
好像是因為VScode的關係
他會直接載在我開啟的資料夾,而不是.py檔所在的那個資料夾
如果用Visual Studio就不會有這個問題ㄌ

06-09 21:04

我要留言提醒:您尚未登入,請先登入再留言

1喜歡★happy819tw 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:累 ...... 後一篇:cookie...

追蹤私訊切換新版閱覽

作品資料夾

pjfl20180818新楓之谷
說要好好處理搶圖事宜,然後對方會長直接先到人家的會地鬧,然後直接含血噴人,好噁心喔看更多我要大聲說6小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】