這裡介紹如何在 Linux 中使用 wget
指令,自動從網路上下載各種的網頁、檔案或目錄。
wget
是一個功能強大的自動檔案下載工具,在大部份的 Linux 系統上都會內建這個指令,其支援各式各樣的下載方式,以下將介紹 wget
的使用方式,以及各式各樣的指令稿範例。
基本下載檔案
若要下載網路上的檔案,可執行 wget
加上檔案的網址即可立即下載:
wget http://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz
wget
也支援 FTP 協定:
wget ftp://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz
若要一次下載多個檔案,就把所有的網址都放在 wget
的參數中即可:
wget http://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz http://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz.sig
指定儲存的檔名
若要指定下載檔案儲存在硬碟中的檔名,可以使用 -O
參數:
wget -O wget.tar.gz http://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz
從檔案中讀取網址
如果要下載的檔案非常多,我們可以將所有的網址放在文字檔中(一行一個網址),讓 wget
直接從檔案中讀取網址來下載檔案。
假設存放網址的 url.txt
檔案內容如下:
http://ftp.gnu.org/gnu/wget/wget-1.18.tar.gz http://ftp.gnu.org/gnu/wget/wget-1.18.tar.gz.sig http://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz http://ftp.gnu.org/gnu/wget/wget-1.19.tar.gz.sig
使用 wget
一次下載所有的檔案:
wget -i url.txt
檔案續傳
如果下載大型檔案中途斷線,檔案只下載了一部分,這時候可以使用 wget
的 -c
參數從上次中斷的地方繼續下載,例如續傳 Ubuntu Linux 的 iso 檔:
wget -c http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
進行續傳的時候,進度列中會以加號表示之前下載的部分:
如果斷線後重新下載檔案,但沒有加上 -c
參數的話,wget
會自動將後來下載檔案的檔名加上 .1
、.2
等數字,分開儲存同一個檔案下載多次的結果。
背景下載
如果下載的檔案很大,要等很久的話,可以使用 -b
參數讓 wget
在背景慢慢下載,並指定一個紀錄輸出訊息用的記錄檔:
wget -b wget_log.txt http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
這樣 wget
就會自動在背景下載檔案,將所有的訊息寫在 wget_log.txt
這個檔案中。
限制檔案下載速度
如果不想讓 wget
在下載檔案時,佔用了全部的網路頻寬,可以使用 --limit-rate
參數指定檔案下載的速度上限值:
wget --limit-rate=100k http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
這個例子會把檔案下載速度限制在每秒 100KB 以內:
HTTP 與 FTP 的帳號與密碼
wget
也可以從需要帳號與密碼的伺服器下載檔案,若是 http 的網頁伺服器則使用:
wget --http-user=my_user --http-password=my_password http://www.example.com/my_file
若是 FTP 的伺服器,則使用:
wget --ftp-user=my_user --ftp-password=my_password ftp://ftp.example.com/my_file
重新嘗試次數
在網路很不穩定時,可以嘗試使用 --tries
增加重新嘗試次數,讓 wget
持續嘗試下載檔案:
wget --tries=50 http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
進階用法
以下是一些比較進階的 wget
用法與範例,適合比較有經驗的程式設計者或系統管理者使用。
偽裝瀏覽器
正常使用 wget
時下載檔案時,其 user agent 會顯示 wget
的版本資訊:
wget https://blog.gtwang.org/gtwang-url-128.png
這個資訊會記錄在網頁伺服器的紀錄檔中:
66.249.79.20 - - [25/Aug/2017:09:42:44 +0800] "GET /gtwang-url-128.png HTTP/1.1" 200 5289 "-" "Wget/1.14 (linux-gnu)"
網頁伺服器可以很容易靠著 user agent 辨識出這個連線是由 wget
所發出來的。
如果想要將 wget
偽裝成一般的瀏覽器,可以修改 user agent 的設定:
wget --user-agent="Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko" https://blog.gtwang.org/gtwang-url-128.png
這樣其所發出的 http 請求就會跟一般的瀏覽器幾乎相同:
66.249.79.20 - - [25/Aug/2017:09:44:53 +0800] "GET /gtwang-url-128.png HTTP/1.1" 200 5289 "-" "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"
模仿 Spider
wget
的 --spider
功能可以模仿網路的 spider,只檢查指定的檔案字否存在,但是不下載任何資料:
wget --spider http://releases.ubuntu.com/16.04.3/ubuntu-16.04.3-desktop-amd64.iso
輸出為:
下載整個網站
如果要把整個網站都下載下來(砍站),可以使用 --mirror
參數:
wget --mirror -p --convert-links -P ./my_folder http://edition.cnn.com/
這樣就會將 http://edition.cnn.com/
整個網站的內容全部下載下來,放在 ./my_folder
目錄下。以下是這裡使用到的參數意義:
--mirror
:下載整個網站。-p
:自動下載顯示網頁所需要的所有相關檔案。--convert-links
:自動將下載網頁中的超連結,轉換為本地的連結。-P ./my_folder
:將下載的檔案放在./my_folder
目錄下。
設定下載資料大小上限
如果在使用 wget
下載很多個檔案時,會有硬碟空間不足的疑慮,可以使用 -Q
參數來指定累積下載資料的大小上限,如果下載資料的大小總和超過這個值的時候,就會停止下載:
wget -Q5m -i url.txt
這個例子會下載 url.txt
檔案中所列的檔案,若下載的資料超過 5MB 時,就會停止下載動作。
遞迴下載特定類型檔案
如果要從網站上下載特定類型的檔案,可以使用 -r
遞迴下載,並且配合 -A
指定下載的檔案類型,例如從網站上下載所有的 PDF 檔:
wget -r -A.pdf http://www.example.com/
代理伺服器(Proxy)
若要讓 wget
透過代理伺服器抓取資料,可以在 ~/.wgetrc
這個設定檔中加入代理伺服器的設定:
use_proxy=yes http_proxy=http://proxy.yoyodyne.com:18023/
這樣在使用 wget
就會自動使用這裡的代理伺服器了。
如果不想更改 ~/.wgetrc
設定檔,也可以直接在執行 wget
時用 -e
參數來指定代理伺服器:
wget -e use_proxy=yes -e http_proxy=http://proxy.yoyodyne.com:18023/ http://www.example.com/
以下是各種代理伺服器的設定方式,以及帳號與密碼的寫法:
use_proxy=on http_proxy=http://username:password@proxy.server.address:port/ https_proxy=http://username:password@proxy.server.address:port/ ftp_proxy=http://username:password@proxy.server.address:port/
參考資料:The Geek Stuff、Tecmint、Tecmint、HTG、nixCraft