1. 程式人生 > >wget命令詳解

wget命令詳解

wget -m -k (-H) http://www.example.com/

三 引數
程式碼:
  $ wget --help

  GNU Wget 1.9.1,非互動式的網路檔案下載工具。
  用法: wget [選項]... [URL]...

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

啟動:
  -V, --version 顯示 Wget 的版本並且退出。
  -h, --help 列印此幫助。
  -b, -background 啟動後進入後臺操作。
  -e, -execute=COMMAND 執行‘.wgetrc’形式的命令。

日誌記錄及輸入檔案:
  -o, --output-file=檔案 將日誌訊息寫入到指定檔案中。
  -a, --append-output=檔案 將日誌訊息追加到指定檔案的末端。
  -d, --debug 列印除錯輸出。
  -q, --quiet 安靜模式(不輸出資訊)。
  -v, --verbose 詳細輸出模式(預設)。
  -nv, --non-verbose 關閉詳細輸出模式,但不進入安靜模式。
  -i, --input-file=檔案 下載從指定檔案中找到的 URL。
  -F, --force-html 以 HTML 方式處理輸入檔案。
  -B, --base=URL 使用 -F -i 檔案選項時,在相對連結前新增指定的 URL。

下載:
  -t, --tries=次數 配置重試次數(0 表示無限)。
  --retry-connrefused 即使拒絕連線也重試。
  -O --output-document=檔案 將資料寫入此檔案中。
  -nc, --no-clobber 不更改已經存在的檔案,也不使用在檔名後新增 .#(# 為數字)的方法寫入新的檔案。
  -c, --continue 繼續接收已下載了一部分的檔案。
  --progress=方式 選擇下載進度的表示方式。
  -N, --timestamping 除非遠端檔案較新,否則不再取回。
  -S, --server-response 顯示伺服器迴應訊息。
  --spider 不下載任何資料。
  -T, --timeout=秒數 配置讀取資料的超時時間 (秒數)。
  -w, --wait=秒數 接收不同檔案之間等待的秒數。
  --waitretry=秒數 在每次重試之間稍等一段時間 (由 1 秒至指定的 秒數不等)。
  --random-wait 接收不同檔案之間稍等一段時間(由 0 秒至 2*WAIT 秒不等)。
  -Y, --proxy=on/off 開啟或關閉代理伺服器。
  -Q, --quota=大小 配置接收資料的限額大小。
  --bind-address=地址 使用本機的指定地址 (主機名稱或 IP) 進行連線。
  --limit-rate=速率 限制下載的速率。
  --dns-cache=off 禁止查詢存於快取記憶體中的 DNS。
  --restrict-file-names=OS 限制檔名中的字元為指定的 OS (作業系統) 所允許的字元。

目錄:
  -nd --no-directories 不建立目錄。
  -x, --force-directories 強制建立目錄。
  -nH, --no-host-directories 不建立含有遠端主機名稱的目錄。
  -P, --directory-prefix=名稱 儲存檔案前先建立指定名稱的目錄。
  --cut-dirs=數目 忽略遠端目錄中指定數目的目錄層。

HTTP 選項:
  --http-user=使用者 配置 http 使用者名稱。
  --http-passwd=密碼 配置 http 使用者密碼。
  -C, --cache=on/off (不)使用伺服器中的快取記憶體中的資料 (預設是使用的)。
  -E, --html-extension 將所有 MIME 型別為 text/html 的檔案都加上 .html 擴充套件檔名。
  --ignore-length 忽略“Content-Length”檔案頭欄位。
  --header=字串 在檔案頭中新增指定字串。
  --proxy-user=使用者 配置代理伺服器使用者名稱。
  --proxy-passwd=密碼 配置代理伺服器使用者密碼。
  --referer=URL 在 HTTP 請求中包含“Referer:URL”頭。
  -s, --save-headers 將 HTTP 頭存入檔案。
  -U, --user-agent=AGENT 標誌為 AGENT 而不是 Wget/VERSION。
  --no-http-keep-alive 禁用 HTTP keep-alive(永續性連線)。
  --cookies=off 禁用 cookie。
  --load-cookies=檔案 會話開始前由指定檔案載入 cookie。
  --save-cookies=檔案 會話結束後將 cookie 儲存至指定檔案。
  --post-data=字串 使用 POST 方法,傳送指定字串。
  --post-file=檔案 使用 POST 方法,傳送指定檔案中的內容。

HTTPS (SSL) 選項:
  --sslcertfile=檔案 可選的客戶段端證書。
  --sslcertkey=金鑰檔案 對此證書可選的“金鑰檔案”。
  --egd-file=檔案 EGD socket 檔名。
  --sslcadir=目錄 CA 散列表所在的目錄。
  --sslcafile=檔案 包含 CA 的檔案。
  --sslcerttype=0/1 Client-Cert 型別 0=PEM (預設) / 1=ASN1 (DER)
  --sslcheckcert=0/1 根據提供的 CA 檢查伺服器的證書
  --sslprotocol=0-3 選擇 SSL 協議;0=自動選擇,
  1=SSLv2 2=SSLv3 3=TLSv1

FTP 選項:
  -nr, --dont-remove-listing 不刪除“.listing”檔案。
  -g, --glob=on/off 設定是否展開有萬用字元的檔名。
  --passive-ftp 使用“被動”傳輸模式。
  --retr-symlinks 在遞迴模式中,下載連結所指示的檔案(連至目錄則例外)。

遞迴下載:
  -r, --recursive 遞迴下載。
  -l, --level=數字 最大遞迴深度(inf 或 0 表示無限)。
  --delete-after 刪除下載後的檔案。
  -k, --convert-links 將絕對連結轉換為相對連結。
  -K, --backup-converted 轉換檔案 X 前先將其備份為 X.orig。
  -m, --mirror 等效於 -r -N -l inf -nr 的選項。
  -p, --page-requisites 下載所有顯示完整網頁所需的檔案,例如影象。
  --strict-comments 開啟對 HTML 備註的嚴格(SGML)處理選項。

遞迴下載時有關接受/拒絕的選項:
  -A, --accept=列表 接受的檔案樣式列表,以逗號分隔。
  -R, --reject=列表 排除的檔案樣式列表,以逗號分隔。
  -D, --domains=列表 接受的域列表,以逗號分隔。
  --exclude-domains=列表 排除的域列表,以逗號分隔。
  --follow-ftp 跟隨 HTML 檔案中的 FTP 連結。
  --follow-tags=列表 要跟隨的 HTML 標記,以逗號分隔。
  -G, --ignore-tags=列表 要忽略的 HTML 標記,以逗號分隔。
  -H, --span-hosts 遞迴時可進入其它主機。
  -L, --relative 只跟隨相對連結。
  -I, --include-directories=列表 要下載的目錄列表。
  -X, --exclude-directories=列表 要排除的目錄列表。
  -np, --no-parent 不搜尋上層目錄。

四 FQA
A.使用wget工具
linux所以的主要版本都自帶了wget這個下載工具.
bash$ wget http://place.your.url/here

它還能控制ftp來下載整個web站點的各級目錄,當然,如果你不小心,可能會把整個網站以及其他和他做連結的網站全部下載下來.
bash$ wget -m http://target.web.site/subdirectory

由於這個工具具有很強的下載能力,所以可以在伺服器上把它用作映象網站的工具.讓它按照”robots.txt”的規定來執行.
有很多引數用來控制它如何正確地做映象,可以限制連結的型別和下載檔案的型別等等.例如:只下載有聯絡的連結並且忽略GIF圖片:
bash$ wget -m -L –reject=gif http://target.web.site/subdirectory

wget也能夠實現斷點續傳(-c引數),當然,這種操作是需要遠端伺服器支援的.
bash$ wget -c http://the.url.of/incomplete/file

可以把斷點續傳和映象功能結合起來,這樣可以在以前斷過多次的情況下繼續映象一個有大量選擇性檔案的站點.如何自動實現這個目的我們在後面會討論得更多.
如果你覺得下載時老是斷線會影響你辦公的話,你可以限制wget重試的次數.
bash$ wget -t 5 http://place.your.url/here
這樣重試五次後就放棄了.用”-t inf”引數表示永遠不放棄.不停地重試.

B.那對於代理服務該怎麼辦呢?
可以使用http代理的引數或者在.wgetrc配置檔案裡指定一個如何通過代理去下載的途徑.但是有這麼一個問題,如果通過代理來進行斷點續傳的話可能會有幾次失敗.如果有一次通過代理下載的過程發生中斷,那麼代理伺服器上快取裡儲存是那個完整的檔案拷貝. 所以當你用”wget -c”來下載剩餘部分的時候代理伺服器檢視它的快取,並錯誤地認為你已經下載了整個檔案.於是就發出了錯誤的訊號.這個時候你可以用新增一個特定的請求引數來促使代理伺服器清除他們的快取:
bash$ wget -c –header=”Pragma: no-cache” http://place.your.url/here

這個”–header”引數能夠以各種數字,各種方式新增。通過它我們可以更改web伺服器或者代理伺服器的某些屬性。有些站點不提供外部連線的檔案服務,只有通過同一個站點上其他的一些頁面時內容才會被提交。這個時候你可以用加上”Referer:”引數:
bash$ wget –header=”Referer: http://coming.from.this/page” http://surfing.to.this/page
有些特殊的網站只支援某種特定的瀏覽器,這個時候可以用”User-Agent:”引數
bash$ wget –header=”User-Agent: Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)” http://msie.only.url/here

C.那我怎麼設定下載時間呢?
如果你需要在你的辦公電腦上通過和其他同事共享的一個連線來下載一些很大的檔案,而且你希望你的同事不會因為網路速度的減慢而收到影響,那你就應該儘量避開高峰時段。當然,不需要在辦公室裡等到所以人都走掉,也不需要在家裡用完晚飯後還惦記著要上網下載一次。
用at來就可以很好的定製工作時間:
bash$ at 23:00
warning: commands will be executed using /bin/sh
at> wget http://place.your.url/here
at> press Ctrl-D
這樣,我們設定了下載工作在晚上11點進行。為了使這個安排能夠正常進行,請確
認atd這個後臺程式正在執行。

D.下載要花很多時間?
當你需要下載大量的資料,而且你又沒有享有足夠的頻寬,這個時候你會經常發現在你安排的下載任務還沒有完成,一天的工作卻又要開始了。
作為一個好同事,你只能停掉了這些任務,而開始另外的工作。然後你又需要反覆地重複使用”wget -c”來完成你的下載。這樣肯定太繁瑣了,所以最好是用crontab來自動執行。建立一個純文字檔案,叫做”crontab.txt”,包含下面的內容:
0 23 * * 1-5 wget -c -N http://place.your.url/here
0 6 * * 1-5 killall wget
這個crontab檔案指定某些任務定期地執行。前五列宣告是什麼時候執行這個命令,而每行的剩餘部分則告訴crontab執行什麼內容。
前兩列指定了每天一到晚上11點就開始用wget下載,一到早上6點就停止一切wget下載。第三四列的*表示每個月的每一天都執行這個任務。第五列則指定了一個星期的哪幾天來執行這個程式。 –”1-5″表示從星期一到星期五。

這樣在每個工作日的晚上11點,下載工作開始,到了上午的6點,任何的wget任務就被停掉了。你可以用下面的命令來執行crontab:bash$ crontab crontab.txt
wget的這個”-N”引數將會檢查目標檔案的時間戳,如果匹配了,下載程式就會停止,因為它說明整個檔案已經下載完全了。
用”crontab -r”可以刪除這個計劃安排。我已經多次採用這種方法,通過共享的電話撥號來下載過很多的ISO映象檔案,還是比較實用的。

E.如何下載動態變化的網頁
有些網頁每天都要根據要求變化好幾次.所以從技術上講,目標不再是一個檔案,它沒有檔案長度.因此”-c”這個引數也就失去了意義.
例如:一個PHP寫的並且經常變動的linux週末新聞網頁:
bash$ wget http://lwn.net/bigpage.php3

我辦公室裡的網路條件經常很差,給我的下載帶了很大的麻煩,所以我寫了個簡單的指令碼來檢測動態頁面是否已經完全更新了.
#!/bin/bash
#create it if absent
touch bigpage.php3
#check if we got the whole thing
while ! grep -qi bigpage.php3
do
rm -f bigpage.php3
#download LWN in one big page
wget http://lwn.net/bigpage.php3
done
這個指令碼能夠保證持續的下載該網頁,直到網頁裡面出現了" ",這就表示該檔案已經完全更新了.

F.對於ssl和Cookies怎麼辦?
如果你要通過ssl來上網,那麼網站地址應該是以”https://”來開頭的.在這樣的情況下你就需要另外一種下載工具,叫做curl,它能夠很容易獲得.有些網站迫使網友在瀏覽的時候必須使用cookie.所以你必須從在網站上得到的那個 Cookie裡面得到”Cookie:”這個引數.這樣才
能保證下載的引數正確.對於lynx和Mozilla的Cookie的檔案格式,用下面的:
bash$ cookie=$( grep nytimes ~/.lynx_cookies |awk {printf(”%s=%s;”,$6,$7)} )
就可以構造一個請求Cookie來下載http://www.nytimes.com上的內容.當然,你要已經用這個瀏覽器在該網站上完成註冊.
w3m使用了一種不同的,更小巧的Cookie檔案格式:
bash$ cookie=$( grep nytimes ~/.w3m/cookie |awk {printf(”%s=%s;”,$2,$3)} )
現在就可以用這種方法來下載了:
bash$ wget –header=”Cookie: $cookie” http://www.nytimes.com/reuters/technology/tech-tech-supercomput.html
或者用curl工具:
bash$ curl -v -b $cookie -o supercomp.html http://www.nytimes.com/reuters/technology/tech-tech-supercomput.htm

G.如何建立地址列表?
到現在為止我們下載的都是單個檔案或者是整個網站.有的時候我們需要下載某個網頁上鍊接的大量檔案,但沒有必要把它整個網站都映象下來.比如說我們想從一個依次排列的100首歌裡面下載前20首.注意,這裡”–accept”和”–reject”引數是不會起作用的, 因為他們只對檔案操作起作用.所以一定要用”lynx -dump”引數來代替.
bash$ lynx -dump ftp://ftp.ssc.com/pub/lg/ |grep gz$ |tail -10 |awk {print $2} > urllist.txt
lynx的輸出結果可以被各種GNU文字處理工具過慮.在上面的例子裡,我們的連結地址是以”gz”結尾的,並且把最後10個檔案地址放到urllist.txt檔案裡.然後我們可以寫一個簡單的bash指令碼來自動下載這個檔案裡的目標檔案:
bash$ for x in $(cat urllist.txt)
> do
> wget $x
> done
這樣我們就能夠成功下載Linux Gazette網站(ftp://ftp.ssc.com/pub/lg/)上的最新10個論題.

H.擴大使用的頻寬
如果你選擇下載一個受頻寬限制的檔案,那你的下載會因為伺服器端的限制而變得很慢.下面這個技巧會大大縮短下載的過程.但這個技巧需要你使用curl並且遠端伺服器有多個映象可以供你下載.例如,假設你想從下面的三個地址下載Mandrake 8.0:
url1=http://ftp.eecs.umich.edu/pub/linux/mandrake/iso/Mandrake80-inst.iso
url2=http://ftp.rpmfind.net/linux/Mandrake/iso/Mandrake80-inst.iso
url3=http://ftp.wayne.edu/linux/mandrake/iso/Mandrake80-inst.iso
這個檔案的長度是677281792個位元組,所以用curl程式加”–range”引數來建立三個同時進行的下載:
bash$ curl -r 0-199999999 -o mdk-iso.part1 $url1 &
bash$ curl -r 200000000-399999999 -o mdk-iso.part2 $url2 &
bash$ curl -r 400000000- -o mdk-iso.part3 $url3 &
這樣就建立了三個後臺程序.每個程序從不同的伺服器傳輸這個ISO檔案的不同部分.這個”-r”引數指定目標檔案的位元組範圍.當這三個
程序結束後,用一個簡單的cat命令來把這三個檔案銜接起來– cat mdk-iso.part? > mdk-80.iso.(強烈建議在刻盤之前先檢查md5)
你也可以用”–verbose”引數來使每個curl程序都有自己的視窗來顯示傳輸的過程.