【Linux入門系列】wget 使用探索

文章來自LearnShare,轉載請註明。


概述


Wget 是Linux下的命令行工具,用來下載文件或鏡像網站,支持HTTP/HTTPS/FTP協議。大部分Linux發行版中均包含Wget工具。Wget也有Windows上的移植版(輕功走起,或直接下載)。

(本文的試驗環境:LinuxMint 14 中文版,GNU Wget 1.13.4 中文版)


Wget的參數格式


Wget的參數格式爲:

wget [選項]... [URL]...

Wget的參數手冊


打開終端,輸入:

wget -h
可查看Wget的使用幫助(爲方便使用英文版的同學,提供如下):

GNU Wget 1.13.4,非交互式的網絡文件下載工具。
用法: wget [選項]... [URL]...

長選項所必須的參數在使用短選項時也是必須的。

啓動:
  -V,  --version           顯示 Wget 的版本信息並退出。
  -h,  --help              打印此幫助。
  -b,  --background        啓動後轉入後臺。
  -e,  --execute=COMMAND   運行一個“.wgetrc”風格的命令。

日誌和輸入文件:
  -o,  --output-file=FILE    將日誌信息寫入 FILE。
  -a,  --append-output=FILE  將信息添加至 FILE。
  -d,  --debug               打印大量調試信息。
  -q,  --quiet               安靜模式 (無信息輸出)。
  -v,  --verbose             詳盡的輸出 (此爲默認值)。
  -nv, --no-verbose          關閉詳盡輸出,但不進入安靜模式。
  -i,  --input-file=FILE     下載本地或外部 FILE 中的 URLs。
  -F,  --force-html          把輸入文件當成 HTML 文件。
  -B,  --base=URL            解析與 URL 相關的
                             HTML 輸入文件 (由 -i -F 選項指定)。
       --config=FILE         Specify config file to use.

下載:
  -t,  --tries=NUMBER            設置重試次數爲 NUMBER (0 代表無限制)。
       --retry-connrefused       即使拒絕連接也是重試。
  -O,  --output-document=FILE    將文檔寫入 FILE。
  -nc, --no-clobber              skip downloads that would download to
                                 existing files (overwriting them).
  -c,  --continue                斷點續傳下載文件。
       --progress=TYPE           選擇進度條類型。
  -N,  --timestamping            只獲取比本地文件新的文件。
  --no-use-server-timestamps     不用服務器上的時間戳來設置本地文件。
  -S,  --server-response         打印服務器響應。
       --spider                  不下載任何文件。
  -T,  --timeout=SECONDS         將所有超時設爲 SECONDS 秒。
       --dns-timeout=SECS        設置 DNS 查尋超時爲 SECS 秒。
       --connect-timeout=SECS    設置連接超時爲 SECS 秒。
       --read-timeout=SECS       設置讀取超時爲 SECS 秒。
  -w,  --wait=SECONDS            等待間隔爲 SECONDS 秒。
       --waitretry=SECONDS       在獲取文件的重試期間等待 1..SECONDS 秒。
       --random-wait             獲取多個文件時,每次隨機等待間隔
                                 0.5*WAIT...1.5*WAIT 秒。
       --no-proxy                禁止使用代理。
  -Q,  --quota=NUMBER            設置獲取配額爲 NUMBER 字節。
       --bind-address=ADDRESS    綁定至本地主機上的 ADDRESS (主機名或是 IP)。
       --limit-rate=RATE         限制下載速率爲 RATE。
       --no-dns-cache            關閉 DNS 查尋緩存。
       --restrict-file-names=OS  限定文件名中的字符爲 OS 允許的字符。
       --ignore-case             匹配文件/目錄時忽略大小寫。
  -4,  --inet4-only              僅連接至 IPv4 地址。
  -6,  --inet6-only              僅連接至 IPv6 地址。
       --prefer-family=FAMILY    首先連接至指定協議的地址
                                 FAMILY 爲 IPv6,IPv4 或是 none。
       --user=USER               將 ftp 和 http 的用戶名均設置爲 USER。
       --password=PASS           將 ftp 和 http 的密碼均設置爲 PASS。
       --ask-password            提示輸入密碼。
       --no-iri                  關閉 IRI 支持。
       --local-encoding=ENC      IRI (國際化資源標識符) 使用 ENC 作爲本地編碼。
       --remote-encoding=ENC     使用 ENC 作爲默認遠程編碼。
       --unlink                  remove file before clobber.

目錄:
  -nd, --no-directories           不創建目錄。
  -x,  --force-directories        強制創建目錄。
  -nH, --no-host-directories      不要創建主目錄。
       --protocol-directories     在目錄中使用協議名稱。
  -P,  --directory-prefix=PREFIX  以 PREFIX/... 保存文件
       --cut-dirs=NUMBER          忽略遠程目錄中 NUMBER 個目錄層。

HTTP 選項:
       --http-user=USER        設置 http 用戶名爲 USER。
       --http-password=PASS    設置 http 密碼爲 PASS。
       --no-cache              不在服務器上緩存數據。
       --default-page=NAME     改變默認頁
                               (默認頁通常是“index.html”)。
  -E,  --adjust-extension      以合適的擴展名保存 HTML/CSS 文檔。
       --ignore-length         忽略頭部的‘Content-Length’區域。
       --header=STRING         在頭部插入 STRING。
       --max-redirect          每頁所允許的最大重定向。
       --proxy-user=USER       使用 USER 作爲代理用戶名。
       --proxy-password=PASS   使用 PASS 作爲代理密碼。
       --referer=URL           在 HTTP 請求頭包含‘Referer: URL’。
       --save-headers          將 HTTP 頭保存至文件。
  -U,  --user-agent=AGENT      標識爲 AGENT 而不是 Wget/VERSION。
       --no-http-keep-alive    禁用 HTTP keep-alive (永久連接)。
       --no-cookies            不使用 cookies。
       --load-cookies=FILE     會話開始前從 FILE 中載入 cookies。
       --save-cookies=FILE     會話結束後保存 cookies 至 FILE。
       --keep-session-cookies  載入並保存會話 (非永久) cookies。
       --post-data=STRING      使用 POST 方式;把 STRING 作爲數據發送。
       --post-file=FILE        使用 POST 方式;發送 FILE 內容。
       --content-disposition   當選中本地文件名時
                               允許 Content-Disposition 頭部 (尚在實驗)。
       --auth-no-challenge     發送不含服務器詢問的首次等待
                               的基本 HTTP 驗證信息。

HTTPS (SSL/TLS) 選項:
       --secure-protocol=PR     選擇安全協議,可以是 auto、SSLv2、
                                SSLv3 或是 TLSv1 中的一個。
       --no-check-certificate   不要驗證服務器的證書。
       --certificate=FILE       客戶端證書文件。
       --certificate-type=TYPE  客戶端證書類型,PEM 或 DER。
       --private-key=FILE       私鑰文件。
       --private-key-type=TYPE  私鑰文件類型,PEM 或 DER。
       --ca-certificate=FILE    帶有一組 CA 認證的文件。
       --ca-directory=DIR       保存 CA 認證的哈希列表的目錄。
       --random-file=FILE       帶有生成 SSL PRNG 的隨機數據的文件。
       --egd-file=FILE          用於命名帶有隨機數據的 EGD 套接字的文件。

FTP 選項:
       --ftp-user=USER         設置 ftp 用戶名爲 USER。
       --ftp-password=PASS     設置 ftp 密碼爲 PASS。
       --no-remove-listing     不要刪除‘.listing’文件。
       --no-glob               不在 FTP 文件名中使用通配符展開。
       --no-passive-ftp        禁用“passive”傳輸模式。
       --retr-symlinks         遞歸目錄時,獲取鏈接的文件 (而非目錄)。

遞歸下載:
  -r,  --recursive          指定遞歸下載。
  -l,  --level=NUMBER       最大遞歸深度 (inf 或 0 代表無限制,即全部下載)。
       --delete-after       下載完成後刪除本地文件。
  -k,  --convert-links      讓下載得到的 HTML 或 CSS 中的鏈接指向本地文件。
  -K,  --backup-converted   在轉換文件 X 前先將它備份爲 X.orig。
  -m,  --mirror             -N -r -l inf --no-remove-listing 的縮寫形式。
  -p,  --page-requisites    下載所有用於顯示 HTML 頁面的圖片之類的元素。
       --strict-comments    用嚴格方式 (SGML) 處理 HTML 註釋。

遞歸接受/拒絕:
  -A,  --accept=LIST               逗號分隔的可接受的擴展名列表。
  -R,  --reject=LIST               逗號分隔的要拒絕的擴展名列表。
  -D,  --domains=LIST              逗號分隔的可接受的域列表。
       --exclude-domains=LIST      逗號分隔的要拒絕的域列表。
       --follow-ftp                跟蹤 HTML 文檔中的 FTP 鏈接。
       --follow-tags=LIST          逗號分隔的跟蹤的 HTML 標識列表。
       --ignore-tags=LIST          逗號分隔的忽略的 HTML 標識列表。
  -H,  --span-hosts                遞歸時轉向外部主機。
  -L,  --relative                  只跟蹤有關係的鏈接。
  -I,  --include-directories=LIST  允許目錄的列表。
  --trust-server-names             use the name specified by the redirection
                                   url last component.
  -X,  --exclude-directories=LIST  排除目錄的列表。
  -np, --no-parent                 不追溯至父目錄。

請將錯誤報告或建議寄給 <[email protected]>。


建立實驗環境


繼續執行命令,建立 下載/temp 作爲實驗的臨時目錄:

cd 下載
mkdir temp
cd temp
實驗用的文件來自我 11 年編寫的HTML/CSS教程(課件)。


單文件下載

下載單個文件

首先,來下載單個HTML文件:

wget http://learnshare.duapp.com/web/pages/css/2.3-1.html
文件 2.3-1.html 就被下載到 temp/目錄裏了。

這是Wget最簡單的用法,僅提供文件URL,不使用任何附加參數。主要用來下載單個文件。

清空 temp/ 目錄。


將日誌輸出到文件

執行上面的命令時,Wget將輸出若干行[日誌](記錄)信息。如果下載的文件較多,輸出的日誌信息也會很多,不方便瀏覽,我們可以將日誌信息輸出到指定的文件中:

wget http://learnshare.duapp.com/web/pages/css/2.3-1.html -o log.txt
日誌信息將全部輸出到 log.txt 文件中。

清空 temp/ 目錄。


隱藏日誌輸出(安靜模式)

如果不想看到任何日誌信息,可以啓用安靜模式:

wget -q http://learnshare.duapp.com/web/pages/css/2.3-1.html

將不會看到任何日誌信息輸出到屏幕中。

清空 temp/ 目錄。


指定下載文件的文件名

下載文件時,我們會需要將文件重命名:

wget http://learnshare.duapp.com/web/pages/css/2.3-1.html -O load.html
文件將被保存爲 load.html 。

清空 temp/ 目錄。


後臺運行

下載大文件或多個文件時,可以讓Wget運行在後臺:

wget -b http://ftp.gnu.org/gnu/gettext/gettext-0.18.2.tar.gz
Wget將繼續在後臺下載文件(pid爲4183,你的可能不同),並將日誌輸出到 wget-log 文件中。


續傳未完成的下載

大文件下載經常會因爲網絡問題而失敗,不過Wget支持斷點續傳,可以繼續下載:

(此處直接結束後臺進程,來人工製造下載失敗)

kill 4183
進程結束後,文件下載中止,我們再次開啓Wget來續傳文件:

wget -c http://ftp.gnu.org/gnu/gettext/gettext-0.18.2.tar.gz
由於速度較慢,我們不再等待完成,Ctrl+z 結束進程。

清空 temp/ 目錄。


導入URL列表進行下載

當我們需要下載多個文件時,批量下載就變得尤爲重要。Wget可以下載本地或外部的文件中所有的URL,一種可用的列表格式是每個URL獨佔一行。

我們來下載下面一個列表文件 filelist.txt :

http://learnshare.duapp.com/web/pages/css/2.3-1.html
http://learnshare.duapp.com/web/pages/css/2.3-2.html
http://learnshare.duapp.com/web/pages/css/2.3-3.html
http://learnshare.duapp.com/web/pages/css/2.3-4.html
執行命令:

wget -i filelist.txt
四個文件將被保存到 temp/ 目錄中。

清空 temp/ 目錄。


網頁單頁面下載


使用HTML文件作爲文件列表

有時候,我們需要保存單個網頁及其關聯地CSS和圖片等文件,可以將HTML文件作爲輸入文件:

wget -i http://learnshare.duapp.com/web/pages/css/2.3-1.html -F
文件 2.3-1.html 和 2.3-1.css 將被保存到 temp/ 目錄中。

清空 temp/ 目錄。


建立鏡像目錄

上一步雖然能夠下載與HTML文件相關聯的文件,但本地的存儲目錄與服務器上的不同,會影響我們離線瀏覽,所以我們來指定創建與服務器相同地鏡像目錄:

wget -i http://learnshare.duapp.com/web/pages/css/2.3-1.html -F -x

Wget在 temp/ 目錄中建立了 learnshare.duapp.com/web/pages/css 目錄,並按照服務器上的目錄保存在本地。

清空 temp/ 目錄。

與上面的命令等價的另一個命令:

wget http://learnshare.duapp.com/web/pages/css/2.3-1.html --page-requisites

清空 temp/ 目錄。

我們下載的 2.3-1.html 文件,只有一個關聯的CSS文件,但如果下載的關聯文件較多時,比如 baidu.com 的首頁,會是下面的樣子:

wget -i http://www.baidu.com/ -F -x
這個操作將會下載到與 baidu.com/index.html 相關聯的所有文件,包括其他的HTML,在 temp/ 目錄生成了20個文件夾,這不是我們想要的。

清空 temp/ 目錄。


忽略個別HTML tags

如果不想下載到某些關聯文件,我們可以通過參數控制下載的文件格式:

wget -i http://www.baidu.com/ -F -x --ignore-tags=a
其中的 --ignore-tags= 後面可以寫一個或多個禁止跟蹤的 HTML tags(使用“,”分隔多個值),來屏蔽相關的超鏈接。

該操作會在 temp/ 目錄生成兩個文件夾,一個存放了 index.html ,另一個存放了相關的JS和圖片。(前面的等價命令並不適用該頁面,可能是因爲 robots.txt ?)

我們可以在斷開網絡後,在瀏覽器中打開下載的百度首頁,查看離線的效果如何。結果是,雖然我們下載了所有的相關文件,但頁面的圖片和樣式均不正常,這是因爲 index.html 中的URL未和本地的文件關聯。

清空 temp/ 目錄,並連接到網絡。


關聯本地文件(URL轉換)

如何解決這個問題,手動修改嗎?NO!Wget給我們提供了URL轉換功能:

wget -i http://www.baidu.com/ -F -x --ignore-tags=a -k
-k 選項將指示Wget轉換 index.html 中的URL指向本地文件(已設置忽略 a 標籤),可以再次斷開網絡測試離線效果(非常完美)。

清空 temp/ 目錄。


網站下載和網站目錄下載


前面探索了使用Wget下載單文件和單頁面地用法,後面再來探索一下我個人比較期待的網站離線功能(多頁面下載).


下載網站目錄(遞歸下載)

下面來下載我的HTML/CSS教程全部文件,也就是 learnshare.duapp.com/web/ 目錄:

wget -r http://learnshare.duapp.com/web/
該命令會按照網站原目錄格式保存URL指定頁面的所有相關文件,也就是遞歸下載。

瞭解Web結構的同學會知道,網站就是許多個相互連接的頁面和文件構成的。(猜測)Wget會根據URL參數搜索指定的文件內容,下載與其關聯的文件,並繼續搜索這些文件,下載與其相關的其他文件,直到所有關聯的文件都被下載到本地。

聽起來是很不錯的,一個命令就可以下載整個網站。不過這種想法是錯誤的。

清空 temp/ 目錄。

爲了演示這個想法錯在那裏,我們來下載Wget分頁版的幫助文檔

wget -r http://www.gnu.org/software/wget/manual/html_node/index.html
我們僅僅是想下載 .../wget/manual/html_note/ 目錄下的所有頁面及相關文件,但是Wget幾乎要將 www.gnu.org/ 下的所有也面都下載到本地了,所以我們用 Ctrl+z 中止下載。

清空 temp/ 目錄。


禁止跟蹤父目錄

我們的實際需求是僅限於 manual/html_node/ 目錄下的 *.html 文件,而且它們是純HTML文檔,沒有關聯的CSS、JS或圖片,執行以下命令:

wget -r http://www.gnu.org/software/wget/manual/html_node/index.html -np
參數 -np 指定了Wget不跟蹤至父目錄中的頁面。

清空 temp/ 目錄。

我們再來實驗另一個網站的下載效果:

wget -r http://api.jquery.com/category/version/1.9/ -np
該命令將下載 .../version/1.9/ 目錄下的所有頁面,但是因爲設置了不跟蹤父目錄(-np),所以沒有下載關聯的CSS、JS和圖片。

清空 temp/ 目錄。


確保頁面的完整性

我們還有一個 -p 參數來修正這個問題:

wget -r http://api.jquery.com/category/version/1.9/ -np -p
這樣, .../version/1.9/ 目錄中的兩個頁面及其關聯的文件都被下載下來了。

清空 temp/ 目錄。

當然,我們還可以使用 -k 參數,使文件中的URL指向本地文件,來保證其離線瀏覽的完整性:

wget -r http://api.jquery.com/category/version/1.9/ -np -p -k
文件下載完畢後,我們打開 .../1.9/index.html 查看一下。出現了兩個問題:

1.base.css無法關聯到:因爲文件名爲 base.css?v=1 ,導致瀏覽器將 ? 後的參數通過GET方式發送出去了……可以手動修改文件名,並修改 index.html 中的URL。(出現這個問題,應該歸結於Wget的非文件URL轉換存在缺陷);

2.頁面中部分圖標無法顯示,部分文字字體與原網頁不同:這個問題是由於頁面使用的自定義字體未下載到本地,可以手動下載(Wget可能還不能分析並下載CSS中定義的 @font-face 文件)。

【補充:字體文件已經下載到本地,僅僅是文件關聯問題】

解決完這兩個問題後,這個頁面就非常完美了。

【補充:

        這兩個問題同樣可以使用下邊介紹的 --adjust-extension 參數解決。該參數至少有三個功能:

        1.使用正確的擴展名保存文件;

        2.會同時修改文件相關的URL,使之指向該文件;

        3.會將URL中的特殊字符編碼(如 ? 編碼爲 %3F),使之表現爲單純的路徑名。

清空 temp/ 目錄。


自動判斷文件類型(擴展名)

我們再下載另一個網站,來檢驗以下Wget的整站下載效果如何。這個網站是PHP擴展開發及內核應用,一本剛剛翻譯完成的書:

wget -r http://www.walu.cc/phpbook/ -np -p -k
下載完成後,我們在 .../phpbook/ 目錄發現許多 .md 文件,用瀏覽器(我使用的是Chrome)打開,發現被解析爲了純文本,這是因爲網站頁面採用了Markdown編寫並輸出的,瀏覽器無法識別 .md 擴展名。

清空 temp/ 目錄。

我們給命令增加一個 --adjust-extension 參數,使Wget通過Mime信息自動判斷文件的擴展名:

wget -r http://www.walu.cc/phpbook/ -np -p -k --adjust-extension

這樣,所有的 .md 文件會保存爲 .md.html ,而且頁面中的URL也會自動指向新的文件,同樣完美。

清空 temp/ 目錄。


驗證下載效果

爲了進一步驗證Wget整站下載,我們來嘗試一個稍複雜的網站,QtNetwork 5.0 的文檔

wget -r http://qt-project.org/doc/qt-5.0/qtnetwork/qtnetwork-index.html -np -p -k --adjust-extension

速度較慢,需要多等一會。下載完成後,總共有169個文件。經過斷網測試,除了頁面底部的內容顯示錯誤(可能是因爲JS未執行),其他的都是可以接受的。


經過以上的幾十次探索和測試,我們掌握了Wget的基本和部分高級使用方法。

本文可以當作學習和參考的資料來使用,稍候將整理爲PDF文檔,供大家下載收藏。


PDF版下載

【Linux入門系列】wget 使用探索.LearnShare.v 1.0.pdf



文章來自LearnShare,轉載請註明。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章