2011/03/22

wget

GNU Wget is a free software package for retrieving files using HTTP, HTTPS and FTP, the most widely-used Internet protocols. It is a non-interactive commandline tool, so it may easily be called from scripts, cron jobs, terminals without X-Windows support, etc.

wget 是開放原始碼的下載工具,它可以透過 HTTP、HTTPS、FTP 協議擷取指定的檔案。
wget 并不是一個可以互動的指令工具,不過它可以輕易地套在 shell script 中。
wget 不需要圖形環境支援,只要有文字終端機就可以使用了。

可以把 wget 想成平常在網頁上點了一個連結的效果,不同的地方在於:
當你點了一個連結,瀏覽器會把你導向該連結的網頁,并把該網頁畫出來,呈現給你看;
當你給定一個連結給 wget,wget 會幫你把該連結的檔案給抓下來,放到你的硬碟。

例如:
wget www.google.com

wget 會把 Google 的首頁抓下來,你會得到一個 Google 首頁的 index.html 檔案。
你可能會疑惑,Google 首頁那些圖片呢?那些首頁引用的 Javascript 檔呢?

wget 預設只針對使用者給的 URL 做處理。
至于該 URL 的內容所含的其他 URL 資源,wget 不會去抽取它們。

不過 wget 有許多參數跟選項,適當地調整跟啟動它們,就會有非常驚人的能力。
它們就像是 wget 的魔法按鈕,按下去就會達成你的願望。
它們很多,很繁復。

例如:
wget -r www.google.com

r 就是 recursive 的意思,遞迴處理。
這個動作就是網路上經常聽到“砍站”,意思就是把整個網站完整的復制下來。

這個選項要非常小心使用!
通常會使用 --level 參數限制遞迴的層數,
否則網站的 URL 如果連到另一個網站,另一個網站又連到 ...
搞不好你會把整個 Internet 抓下來 :-)

不過 wget 在做 recursive 下載時,會嚴謹恪守 Robot Exclusion 的規範。
robots.txt 內規定不能動、不能挖取的檔案,wget 是不會去觸犯的。
可以嘗試一下,看看效果:
wget -r http://en.wikipedia.org



[1]

目標:把 OEC SPACE(http://www.hsiu28.net)網站整個抓到 /tmp 資料夾下。

指令:
wget --mirror --wait=2 --html-extension --convert-links --directory-prefix=/tmp http://www.hsiu28.net
--mirror:映射網站,遞迴網站的所有連結,搜尋必要之檔案。
--wait=2:等待兩秒才送下一個 request,可用 --random-wait 取代。
--html-extension:在 .cgi 或 .php 或 .jsp 等等的副檔名最後再加上 .html。
--covert-links:把網頁上所有絕對位置連結轉成本地端的相對位置連結。
--directory-prefix=路徑:本地端儲存的路徑,可簡寫成“-P 路徑”。

--mirror 其實是好幾個選項的合體(-r -N -l inf -nr):
-r,--recursive:遞迴下載。
-l,--level:遞迴下載的層數,inf 表示無限。
-N,--timestamping:檢查遠端文件的時間是否較本地端的新,再決定是否下載。
-nr,--dont-remove-listing:保留 .listing 檔案。

[2]

目標:續傳一個大檔案。

指令:
wget -c http://URL/the_big_file
-c,--continue:檔案續傳

[3]

目標:將 http://apt.sw.be/redhat/ 的 rpm 通通鏡像下來。

指令:
wget --mirror --reject=gif,bmp,html --accept=rpm,RPM http://apt.sw.be/redhat/
-A,--accept=副檔名:要下載的檔案類型
-R,--reject=副檔名:不要下載的檔案類型

[4]

目標:使用 wildcard 遮罩(*.rpm)下載 FTP 上的一大堆 rpm 檔案。

注意,此處并沒有使用 --mirror,而是使用通用字元告訴 wget 下載符合規則的檔案。
這樣的用法,在 wget 中,僅限於 FTP 協議才可以。

指令:
# FTP ONLY!
wget ftp://apt.sw.be/mirrors/redhat/rhel/beta/6/i386/os/Packages/*.rpm

[5]

目標:透過 HTTP 下載 apt.sw.be 上 EPEL 5 i386 所有的 .rpm 檔案。

wget 并沒有辦法透過 HTTP 使用 wildcard 遮罩下載檔案。
在 HTTP 中,必須指定檔名,wget 才有辦法處理。
要達成類似 wildcard 的效果,必須繞個彎想法子,
所以改成指定 wget 下載這層目錄下副檔名為 rpm 的檔案,
不過,前提是該 Web Server 必須開放該層目錄的 file list,wget 才有辦法解析。

指令:
wget --accept=rpm --level=1 --recursive --no-parent -N http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/
-np,--no-parent:不要追溯回父目錄

Reference:
01. http://blog.dayuer.com/freebsd-tooltips/wget_help
02. http://redhat.ecenter.idv.tw/bbs/showthread.php?threadid=39222
03. http://ubuntuforums.org/showthread.php?t=638362