2011年11月10日 星期四

Wget 精隨教學

[正文開始]
wget用英語定義就是the non-interactive network downloader,翻譯過來就是非交互的網絡下載器。
1 wget都支持什麼協議的下載?
wget支持HTTPHTTPSFTP協議的下載,其中也包括通過HTTP代理的下載。看起來支持的協議沒有你想想的多,但其實這已足夠,我相信你很少使用除這些協議之外的協議來進行下載吧。
2 wget有哪些特色之處?簡單介紹一下。
wget能夠跟踪HTML文件和XHTML文件,從而使得你可以下載整個站點的文件,然後離線閱讀。當然這個功能並不是特別常用,因為幾乎所有站點都會包含外鏈,一旦你用wget進行整站的下載,它也會傻傻的去下載外鏈站點的內容,這樣一來,子子孫孫無窮盡也。
wget是個非常遵守Robot Exclusion Standardrobots.txt)標準的工具。
wget支持慢速網絡下載和不穩定網絡的下載。當因為網絡不穩定而導致下載失敗時,wget會重試直到把目標文件下載下來為止。
wget支持斷點續傳功能,當你下載的很大的文件在中途失敗時,這項功能會很有用處。
3 對於使用wget選項,有什麼建議?
由於wget是使用getopt函數來處理選項和參數的,因此wget既支持長格式的選項,也支持短格式的選項,他們大部分是一一對應的關係。但是我不建議大家使用短選項。
當某個選項有參數時,你甚至可以在短選項和參數之間不加空格。比如-o log可以寫成-olog。但是,你知道的,這也是不建議的。
如果你連續使用了多個短選項,且這些短選項不需要加參數,那麼可以將他們組合在一起。比如-d -r -c可以寫成-drc。恩,這是被建議的。呵呵
4 wget有什麼潛規則不?
當你使用wget時,請務必查看/etc/wgetrc文件和家目錄下的.wgetrc文件,先搞清楚裡面都設置了什麼,再來使用wget命令不遲,否則,你早晚會吃大虧的。不是危言聳聽哦。
某些選項還可以接受用逗號隔開的參數。比如-X(大寫的x)選項,它是用來設定不希望下載的目錄列表。你可以用逗號把不希望下載的目錄一個一個寫上。比如“wget -X wukong , bajie”,這樣wget心裡就有數了,他知道wukong目錄和bajie目錄都是不用下載的。其實你也可以在.wgetrc文件中設置不希望下載的目錄列表,格式是這樣的:
exclude_directories=wukong,bajie
於是,你不必在wget命令上設置,就可以實現不下載”wukongbajie目錄。
當然,如果某天你下載東西時,發現總有幾個目錄下載不下來,你可要想到,有可能是其他人設置了.wgetrc造成的哦!當然你還要再去/etc/wgetrc文件中再查看一下,那裡也是一個可疑的地方。
還有一個小技巧,也可以避免這種誤會(別人設置了exclude_directories,而你卻不知道),那就是在你使用wget時,這樣寫:
wget -r -X ” -X wukong,bajie ftp://localhost
使用-X ”的目的就是去除.wgetrc/etc/wgetrc的作用,然後再用-X wukong,bajie設置,就可以踏踏實實的保證不下載wukongbajie目錄,而其他目錄絕不會受影響。
小總結一下:.wgetrc-X/etc/wgetrc的設置都是屬於平等關係,三者在使用時會進行並集。而在設置了-X ”時,就完全去掉了.wgetrc/etc/wgetrc對於目錄限制的作用。
5 wget不是只能下單個文件麼?怎麼能下目錄呢?
你也太小看wget了。加上-r選項你試試,這就是傳說中的遞歸下載。呵呵
6 wget命令的版本是多少?
使用wget -V(注意是大寫的v哦)就可以查看了,或者是–version。我的是1.11.4Red Hat Modified
7 我怎麼能讓wget進入後台執行呢?
使用–background!啟動的wget會立即進入後台執行。如果沒有使用-o選項設置日誌文件的話,缺省是記錄在當前目錄的wget-log文件中,其實這個日誌就是當初輸出到屏幕上的那些東東。更重要的一點是,即使你的遠程終端連接被ctrl-Dexit了,也不會影響wget的後台執行。
有人會問,我使用wget -r ftp://localhost/a &是不是也可以進入後台阿。你可以試試看,這樣寫不行的。你會發現即使瞬間看到命令提示符了,但也會瞬間被刷新了的進度條所重新覆蓋。而且你使用ctrl-c還無法終止。只能kill進程來殺掉。所以說,如果你想進入後台執行,還是老老實實的使用–background吧!
8 wget在下載網站時如果遇到robots.txt全禁怎麼辦?
這時候,你可以使用“–execute 選項加參數,它和把參數放到.wgetrc裡的效果是一樣的。你使用–execute robots=off就可以躲開robots.txt的追捕嘍!
[正文開始]
上次提到了wget可以避免robots.txt的事情。這篇文章就做個試驗,讓大家親身體驗。跟著我的思路來走。
1 我們搭建了一個臨時的apache-1.3.41服務器,端口號設置成了61212。網頁文件所在路徑為/home/rocrocket/program/apache-1.3.41-all/htdocs,我們簡稱為htdocs目錄。
2 htdocs目錄中,我們建立一個index.html文件,內容大致如下:
$ cat -n index.html
1 <html>
2 <head>
3 <title>rocrocket</title>
4 </head>
5 <body>
6 <ul>
7 <li><a href=rocrocket-1.html>rocrocket-1</li>
8 <li><a href=rocrocket-2.html>rocrocket-2</li>
9 </ul>
10 </body>
11 </html>
通過網頁方式訪問的話,效果是這樣的:
描述: wget-html
3 類似的建立如下文件:
$ ls -1
index.html
robots.txt
roc.html
rocrocket-1-1.html
rocrocket-1-2.html
rocrocket-1.html
rocrocket-2-1.html
rocrocket-2-2.html
rocrocket-2.html
根據文件編號,你應該能看出他們之間的調用關係。
4 建立簡單的robots.txt文件:
$ cat robots.txt
User-agent: *
Disallow: rocrocket-2.html
這個文件的內容就是要屏蔽rocrocket-2文件的下載和spider
5 我們用wget來下載這個測試站點:
wget -r http://my-test.cn:61212/

$ ls -1
index.html
robots.txt
rocrocket-1-1.html
rocrocket-1-2.html
rocrocket-1.html
看!下載到的包含了robots.txt文件,但沒有包含rocrocket-2及其相關的文件。
可見,robots.txt生效了,wget遵守了robots.txt的規則!
6 我如何突破robots.txt的限制呢?
使用–execute選項就可以,這個選項的作用是將其後的參數模擬放到.wgetrc中的執行效果
$ wget -r --execute robots=off http://jx-nsop-test0.jx:61212/

$ ls -1
index.html
rocrocket-1-1.html
rocrocket-1-2.html
rocrocket-1.html
rocrocket-2-1.html
rocrocket-2-2.html
rocrocket-2.html
看,rocrocket-2系列的文件也都順利的下載下來了:D
【未完待續】
[正文開始]
當你深入學習wget時,你會發現它的選項實在是太多了,錯綜複雜亂如麻。今天,我們就針對常用的目錄選項展開討論。
1 -r選項
這個選項用於下載遠程的文件夾,但是情況沒有那麼簡單,對於ftp協議下載來講,你如果使用如下命令下載
wget -r ftp://my.test.server:/home/wupengchong/img
那麼,實際在當前目錄下會生成my.test.server/home/wupengchong/img目錄結構,可見直接使用-r選項,默認會創建一域名和絕對路徑組成的目錄結構的。這或許不是我們的初衷,繼續向下看。
2 -nd選項
–no-directories。當我們下載遠程的數據時,可以要求wget只下載文件,不下載文件夾,所有下載的文件都平鋪在當前目錄下。
描述: http://roclinux.cn/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif這時,敏銳的讀者會問:如果下載到不同路徑的同名文件的話,那用-nd豈不是會造成同名文件覆蓋的問題?。答案是不會的,因為wget在下載文件時,如果當前目錄下有同名文件,則會默認在新下載的文件後加上“.1”“.2” …等標識,以示區別。
3 -x選項
–force-directories。這個選項和–no-directories是完全相反的。–no-directories是要求絕對不能下載和創建任何文件夾,同時所有文件都平鋪在當前目錄中。而–force-directories選項則要求處處都要有文件夾,即使是wget 
-x http://fly.srk.fer.hr/home/robots.txt這樣下載單獨普通文件的命令,也會在當前目錄下創建fly.srk.fer.hr/home目錄結構,然後將robots.txt文件下載到fly.srk.fer.hr/home裡面。
4 -nH選項
–no-host-directories。大家已經知道了在使用wget -r命令下載目錄時,默認會創建一個my.test.server文件夾的。使用-nH選項就是來禁止這種默認行為。
所以,當你用wget -r -nH ftp://my.test.server:/home/wupengchong/img命令下載數據時,會在當前目錄下創建home/wupengchong/img目錄結構,看,my.test .server文件夾已經不見了。
5 –protocol-directories選項
它的作用是先創建一個以協議名為名稱的文件夾,例如:
wget -r –protocol-directories ftp://my.test.server:/home/wupengchong/img
則會創建如下目錄結構ftp/my.test.server/home/wupengchong/img
這個選項,對於那些希望通過協議類型​​來區分數據的同學比較有用。
6 –cut-dirs= number選項
這個選項比較常用,它表示下載數據時,在本地創建目錄時,忽略多少層目錄結構。
我們拿ftp://ftp.xemacs.org/pub/xemacs/為例,如果只使用-r選項,那麼本地會創建ftp.xemacs.org /pub/xemacs/目錄結構,如果再加上-nH選項,則留下來的目錄結構是pub/xemacs/。此處就是–cut-dirs選項起作用的地方了。我們看一個表格吧:
只用-r選項 -> ftp.xemacs.org/pub/xemacs/
-nH -> pub/xemacs/
-nH –cut-dirs=1 -> xemacs/
-nH –cut-dirs=2 -> .
–cut-dirs=1 -> ftp.xemacs.org/xemacs/
7 -P選項
–directory-prefix= prefix,所設置的這個prefix路徑,則是用來代替當前目錄的,所有本應下載到當前目錄的數據都會被下載到prefix所設置的目錄中去。
[未完待續]

[正文開始]
使用wget時,會遇到各種突發事件。今天來講一個。
一個800MB的大文件,在遠程用wget下載,到一半時,文件被更名、被刪除、被移動了,wget會發現麼?它會如何抱怨?還是傻傻地順序讀下去,直到讀完800MB為止?(你可以隨便猜,但真相只有一個呵呵)
第一步:創建大文件
$ dd if=/dev/zero of=roc-big-file bs=8192 count=100000
其中if是數據輸入源,of是數據輸出目標,bs表示每次讀寫的緩衝區字節數,count是要讀取多少次bs
這條命令就是用來生成一個大小接近800MB的文件,命名為roc-big-file
第二步:從另一台機器使用wget進行下載,限速在20k吧,要是不限速,刷刷幾下就下完了,都來不及測試了該。呵呵
$ wget –limit-rate=20k ftp://yourdomain:/home/wupengchong/test/wgettest/roc-big-file
第三步:這步就是要搞點惡作劇了。我們先更名!
$ mv roc-big-file roc-big-file1
結果沒問題,wget繼續穩定運行。
第四步:繼續惡作劇。我們移動它。
$ mkdir tmpdir
$ mv roc-big-file1 tmpdir/
沒問題,穩定運行。
第五步:我們刪除它!(拼了,真不信wget能這麼魯棒)
$ cd tmpdir/
$ rm -f roc-big-file1
繼續穩定運行…. 只是你看不到這個文件了,從文件所在文件夾的大小也看不到變化了。
結論:
只要不是網絡故障、遠程文件系統故障或硬件故障,wget的魯棒性是值得相信的。
其實,真正理解Linux文件系統的同學會知道,這並不是wget的魯棒性,而是Linux文件系統的魯棒性保證的。
over~

上篇文章,給了大家不少誤會,對於明白原理的朋友,不說自明;但對於不太精通Linux系統原理的朋友,上一篇的表述方法剛剛好。
今天我們繼續了解wget的心,看看還有哪些體貼的功能,我們平時沒有接觸到的。
1 -t選項
–tries= number,用於設置wget下載時重試的次數,當設置為0(數字零)或inf時表示無限次重試。默認的重試次數是20次。
不過wget也不是在什麼情況下都會傻傻的重試的,例如在發生“connection refused”“not found”時,wget會立即退出,不會進行重試。
2 -o選項
–output-file= logfilewget運行過程中輸出到標準輸出的內容都會被寫到所設置的logfile文件中。
3 -O選項
–output-document- file,表示wget下載的所有文件的內容會被依次追加寫到所設置的file文件中,而不會創建原本的文件。在下載單獨文件時使用-O選項,可以避免wget下載同名文件時默認寫到“.1”後綴文件中的問題。
4 -N選項
–timestamping,表示開啟時間戳機制,wget會下載遠程時間戳更新的文件。
5 -nc選項
–no-clobber選項。
在同一個目錄中,如果一個文件被多次下載,那麼wget的處理方式會取決於幾個重要選項,這其中就包括了-nc選項。
當多次下載同一個文件時,本次文件會被覆蓋,或者被重寫,或者被保護,這都是有可能的。
當使用wget多次下載同一個文件,且不使用-N-nc-r時,那麼wget會默認在第二次下載時自動在文件名後加上“.1”後綴,第三次下載時加上“.2”後綴,以此類推。
但當我們使用了-nc選項時,wget不會使用“.1/.2”的策略,而是拒絕下載同一文件(即使文件內容是更新的了)。這個功能用於有的網頁被同時指向了很多遍,那麼使用-nc可以避免多次下載。
當使用wget且使用-r選項,但不使用-N選項或-nc選項時,重新下載同名文件時,當遠程文件的修改時間是更新的了,那麼wget會選擇覆蓋當前目錄已有的老文件,此時使用-nc可以禁止wget這樣做。(但當遠程文件的修改時間並不新,那麼wget就會拒絕下載。)
當使用wget且使用-N選項時,是否下載同名文件,完全取決於遠程文件和本地文件的時間戳以及文件大小。-nc選項是不允許和-N選項同時設置的。如果你同時使用了-N-nc選項,會得到這樣的錯誤提示“Can't timestamp and not clobber old files at the same time.”
6 -c選項
–continue選項,這就是大名鼎鼎的斷點續傳。無論你之前使用哪個下載工具下載了一半的文件,都可以用wget來繼續下載此文件。比如:
wget -c ftp://sunsite.doc.ic.ac.uk/ls-lR.Z
當前目錄已有一個ls-lR.Z文件存在,wget將假定這是一個下載了一半的文件,然後提取本地文件的文件大小,並根據此值請求從遠程文件的相應文件大小處開始繼續下載。
你會發現,其實wget的此斷點續傳策略是有隱患的,因為如果遠程文件的開頭部分被進行了修改,wget在進行斷點續傳時是意識不到這一點的,它只會傻傻的從已傳文件大小之後的部分繼續下載。所以使用-c選項斷點續傳之後,務必進行md5校驗。
7 –limit-rate= amount選項
此選項適用於限速的,將速度限制在amount bytes/second, 當然也可以用單位k/m來表示,例如–limit-rate=20k將會限制速度在20KB/s
請注意,wget實現限速的原理是在一次網絡讀取動作之後sleep一個特定時間段,以讓平均的網絡讀速度降到限制值,這個策略最終會使TCP傳輸速度降到限制值左右。所以在傳輸超小文件時,可能無法達到限速的作用。
8 -w選項
–wait= seconds選項,用於設置wget每兩個請求之間間隔的秒數。這個選項很有用處,可以降低遠程服務器的負載。你除了可以直接設置秒數,還可以加上m表示分鐘、h表示小時、d表示天。
9 –waitretry= seconds選項
用於設置請求重試秒數。wget採用的是線性遞增等待的方式,如果你設置的是10秒,那麼第一次請求失敗後,會等待1秒;第二次請求失敗會等待2秒;直到最後達到10秒等待時間為止。所以當到達最後一次時,時間已經過了1+2+…+10=55秒。