文章來自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,轉載請註明。