天天看點

wget下載下傳工具詳解

A。使用wget工具

linux是以的主要版本都自帶了wget這個下載下傳工具.

bash$ wget [url]http://place.your.url/here[/url]

它還能控制ftp來下載下傳整個web站點的各級目錄,當然,如果你不小心,可能會把整個網站以及其他和他做連結的網站全部下載下傳下來.

bash$ wget -m [url]http://target.web.site/subdirectory[/url]

由于這個工具具有很将的下載下傳能力,是以可以在伺服器上把它用作鏡像網站的工具.讓它按照"robots.txt"的規定來執行.

有很多參數用來控制它如何正确地做鏡像,可以限制連結的類型和下載下傳檔案的類型等等.例如:隻下載下傳有聯系的連結并且忽略GIF圖檔:

bash$ wget -m -L --reject=gif [url]http://target.web.site/subdirectory[/url]

wget也能夠實作端點續傳(-c參數),當然,這種操作是需要遠端伺服器支援的.

bash$ wget -c [url]http://the.url.of/incomplete/file[/url]

可以把端點續傳和鏡像功能結合起來,這樣可以在以前斷過多次的情況下繼續鏡像一個有大量選擇性檔案的站點.如何自動實作這個目的我們在後面會讨論得更多.

如果你覺得下載下傳時老是斷線會影響你辦公的話,你可以限制wget重試的次數.

bash$ wget -t 5 [url]http://place.your.url/here[/url]

這樣重試五次後就放棄了.用"-t inf"參數表示永遠不放棄.不停地重試.

B.那對于代理服務該怎麼辦呢?

可以使用http代理的參數或者在.wgetrc配置檔案裡指定一個如何通過代理去下載下傳的途徑.但是有這麼一個問題,

如果通過代理來進行端點續傳的話可能會有幾次失敗.如果有一次通過代理下載下傳的過程發生中斷,那麼代理伺服器上緩存裡儲存是那個完整的

檔案拷貝.是以當你用"wget -c"來下載下傳剩餘部分的時候代理伺服器檢視它的緩存,并錯誤地認為你已經下載下傳了整個檔案.于是就發出了錯誤的信号.

這個時候你可以用添加一個特定的請求參數來促使代理伺服器清除他們的緩存:

bash$ wget -c --header="Pragma: no-cache" [url]http://place.your.url/here[/url]

這個"--header"參數能夠以各種數字,各種方式添加。通過它我們可以更改

web伺服器或者代理伺服器的某些屬性。有些站點不提供外部連接配接的檔案服務,隻有通過同一個站點上其他的一些頁面時内容

才會被送出。這個時候你可以用加上"Referer:"

參數:

bash$ wget --header="Referer: [url]http://coming.from.this/page[/url]" [url]http://surfing.to.this/page[/url]

有些特殊的網站隻支援某種特定的浏覽器,這個時候可以用"User-Agent:"參數

bash$ wget --header="User-Agent: Mozilla/4.0 (compatible; MSIE 5.0;Windows NT; DigExt)" [url]http://msie.only.url/here[/url]

C.那我怎麼設定下載下傳時間呢?

如果你需要在你的辦公電腦上通過和其他同僚共享的一個連接配接來下載下傳一些很大的檔案,而且你希望你的同僚不會因為網絡速度的減慢而收到影響,

那你就應該盡量避開高峰時段。當然,不需要在辦公室裡等到是以人都走掉,也不需要在家裡用完晚飯後還惦記着要上網下載下傳一次。

用at來就可以很好的定制工作時間:

bash$ at 2300

warning: commands will be executed using /bin/sh

at> wget [url]http://place.your.url/here[/url]

at> press Ctrl-D

這樣,我們設定了下載下傳工作在晚上11點進行。為了使這個安排能夠正常進行,請确

認atd這個背景程式正在運作。

D.下載下傳要花很多時間?

當你需要下載下傳大量的資料,而且你又沒有享有足夠的帶寬,這個時候你會經常發現在你安排的下載下傳任務還沒有完成,一天的工作卻又要開始了。

作為一個好同僚,你隻能停掉了這些任務,而開始另外的工作。然後你又需要反複地重複使用"wget -c"來完成你的下載下傳。這樣肯定太繁瑣了,

是以最好是用crontab來自動執行。建立一個純文字檔案,叫做"crontab.txt",包含下面的内容:

0 23 * * 1-5 wget -c -N [url]http://place.your.url/here[/url]

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 [url]http://lwn.net/bigpage.php3[/url]

我辦公室裡的網絡條件經常很差,給我的下載下傳帶了很大的麻煩,是以我寫了個簡單的腳本來檢測動态頁面是否已經完全更新了.

#!/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 [url]http://lwn.net/bigpage.php3[/url]

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來下載下傳[url]http://www.nytimes.com[/url]上的内容.當然,你要已經用這個浏覽器在該網站上完成注冊.

w3m使用了一種不同的,更小巧的Cookie檔案格式:

bash$ cookie=$( grep nytimes ~/.w3m/cookie |awk {printf("%s=%s;",$2,$3)} )

現在就可以用這種方法來下載下傳了:

bash$ wget --header="Cookie: $cookie" [url]http://www.nytimes.com/reuters/technology/tech-tech-supercomput.html[/url]

或者用curl工具:

bash$ curl -v -b $cookie -o supercomp.html [url]http://www.nytimes.com/reuters/technology/tech-tech-supercomput.htm[/url]

G.如何建立位址清單?

到現在為止我們下載下傳的都是單個檔案或者是整個網站.有的時候我們需要下載下傳某個網頁上連結的大量檔案,但沒有必要把它整個網站

都鏡像下來.比如說我們想從一個依次排列的100首歌裡面下載下傳前20首.注意,這裡"--accept"和"--reject"參數是不會

起作用的,因為他們隻對檔案操作起作用.是以一定要用"lynx -dump"參數來代替.

bash$ lynx -dump [url]ftp://ftp.ssc.com/pub/lg/[/url] |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網站([url]ftp://ftp.ssc.com/pub/lg/[/url])上的最新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程序都有自己的視窗來顯示傳輸的過程.

結束語

不用擔心使用非互動式的下載下傳方式會影響你的下載下傳效果.無論網站設計者如何絞盡腦汁想阻止我們從他們的網站下載下傳,我們都可以得到

免費的工具來自動完成下載下傳任務.這會大大豐富我們的網絡經曆. 

繼續閱讀