這裡介紹如何在 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

輸出為:

模仿 Spider

下載整個網站

如果要把整個網站都下載下來(砍站),可以使用 --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 StuffTecmintTecmintHTG