Linux 用命令列方式進行網路下載(轉)

ba發表於2007-08-11
Linux 用命令列方式進行網路下載(轉)[@more@]這是一篇較老的文章了,大家參考下

A。使用wget工具

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

bash$ wget

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

bash$ wget -m

由於這個工具具有很將的下載能力,所以可以在伺服器上把它用作映象網站的工具.讓它按照"robots.txt"的規定來執行.
有很多引數用來控制它如何正確地做映象,可以限制連結的型別和下載檔案的型別等等.例如:只下載有聯絡的連結並且忽略GIF圖片:

bash$ wget -m -L --reject=gif

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

bash$ wget -c

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

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

bash$ wget -c --header="Pragma: no-cache"

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


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

D.下載要花很多時間?
當你需要下載大量的資料,而且你又沒有享有足夠的頻寬,這個時候你會經常發現在你安排的下載任務還沒有完成,一天的工作卻又要開始了。
作為一個好同事,你只能停掉了這些任務,而開始另外的工作。然後你又需要反覆地重複使用"wget -c"來完成你的下載。這樣肯定太繁瑣了,
所以最好是用crontab來自動執行。建立一個純文字檔案,叫做"crontab.txt",包含下面的內容:
0 23 * * 1-5 wget -c -N
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

我辦公室裡的網路條件經常很差,給我的下載帶了很大的麻煩,所以我寫了個簡單的指令碼來檢測動態頁面是否已經完全更新了.
#!/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

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來下載上的內容.當然,你要已經用這個瀏覽器在該網站上完成註冊.
w3m使用了一種不同的,更小巧的Cookie檔案格式:
bash$ cookie=$( grep nytimes ~/.w3m/cookie |awk {printf("%s=%s;",$2,$3)} )
現在就可以用這種方法來下載了:
bash$ wget --header="Cookie: $cookie"
或者用curl工具:
bash$ curl -v -b $cookie -o supercomp.html

G.如何建立地址列表?
到現在為止我們下載的都是單個檔案或者是整個網站.有的時候我們需要下載某個網頁上鍊接的大量檔案,但沒有必要把它整個網站
都映象下來.比如說我們想從一個依次排列的100首歌裡面下載前20首.注意,這裡"--accept"和"--reject"引數是不會
起作用的,因為他們只對檔案操作起作用.所以一定要用"lynx -dump"引數來代替.
bash$ lynx -dump |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網站(上的最新10個論題.



H.擴大使用的頻寬
如果你選擇下載一個受頻寬限制的檔案,那你的下載會因為伺服器端的限制而變得很慢.下面這個技巧會大大縮短下載的過程.但這個技巧
需要你使用curl並且遠端伺服器有多個映象可以供你下載.例如,假設你想從下面的三個地址下載Mandrake 8.0:
url1=
url2=
url3=
這個檔案的長度是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程式都有自己的視窗來顯示傳輸的過程.

結束語
不用擔心使用非互動式的下載方式會影響你的下載效果.無論網站設計者如何絞盡腦汁想阻止我們從他們的網站下載,我們都可以得到
免費的工具來自動完成下載任務.這會大大豐富我們的網路經歷.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-947222/,如需轉載,請註明出處,否則將追究法律責任。

相關文章