用命令行方式進行網絡下載 作者:Adrian J Chung 翻譯:SuperStar 2001-11-26 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 2300 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進程都有自己的窗口來顯示傳輸的過程. 結束語 不用擔心使用非交互式的下載方式會影響你的下載效果.無論網站設計者如何絞盡腦汁想阻止我們從他們的網站下載,我們都可以得到 免費的工具來自動完成下載任務.這會大大豐富我們的網絡經歷. 原文出自http://www.linuxgazette.com/