2008年8月19日 星期二

不需使用瀏覽器的網頁存取程式--curl

用過 wget 的人一定很高興可以一個指令就把網站上的資料下載回來而不用開瀏覽器
可是 curl 更好用, 更有彈性, 不僅可以續傳、分割抓檔, 還可以自動連號抓檔, 還可以......
以下資料參考
http://yllan.org/mac/Terminal/curl/
如有引用請以原始作者資料為準, 此處僅供個人操作參考

一、基本抓檔:


% curl -O "http://blueapple.infor.org/curl/1.txt"

敲入這行指令以後,會出現代表抓檔進度以及速度的文字(圖1)。


等到100%都抓完了以後,curl會自動結束,您可以打 open 1.txt 來看看您抓下了什麼東西。這就是curl抓檔案最基本的用法,curl -O (大寫的英文字母O,非數字0)後面接上要抓的檔案位址即可。參數 -O 代表將抓下來的檔案命名成網址裡面的檔名,也就是說您若是想要抓一個叫做aaa.sit的檔案,用參數 -O 就會把抓下來的檔案命名為aaa.sit。要是想要自己取名字該怎麼辦?把大寫的O換成小寫的o就可以嘍!例如:

% curl -o "nothing.txt" "http://blueapple.infor.org/curl/1.txt"

就可以把抓下來的檔案命名為nothing.txt。

二、連續抓檔:


一定有人有過這種經驗:網頁上有許多按照編號命名的檔案(圖2),每次都要一個一個點選以後再儲存,實在很煩!要是只有十個二十個那還好,可是要是遇上了好幾百個、好幾千個檔案呢?curl提供了連續抓檔案的功能:

% curl -O "http://blueapple.infor.org/curl/mac/[1-10].jpg"

這樣子就可以自動把1.jpg、2.jpg、…10.jpg一共十個檔案給抓下來了!只要在URL裡面用中括號括起來的範圍,curl就會自動把這個範圍 的東西都給抓下來。那有些網頁命名是用001.txt、002.txt這樣子該怎麼辦?沒關係,只要把範圍這樣子寫:[001-023]就可以產生以零為 開頭的數字嘍!除此之外,範圍也可以是英文字母,例如[a-z]。接下來我們看看下面的應用:

% curl "http://blueapple.infor.org/curl/{mac,bsd}/[1-10].jpg" -o "#1_#2.jpg"

這一行的結果是會去抓
http://blueapple.infor.org/curl/mac/[1-10].jpg
http://blueapple.infor.org/curl/bsd/[1-10].jpg
一共20個檔案。眼尖的讀者應該看出來了,用中括號括起來並且用逗號分隔的字串,會被分別代入URL裡面。至於 -o 後面的應該是自定檔名,怎麼會變成 "#1_#2.jpg" 這種怪里怪氣的東西呢?那是因為這邊的#1、#2會用目前正在抓的URL裡面的變數給代換進去(圖3)。


#1就是從前面數過來第一個變數,#2就是第二個,以此類推。所以,上面的那一行指令除了會抓二十個檔案以外,還會將他們分別命名為mac_1.jpg~mac_10.jpg、bsd_1.jpg~bsd_10.jpg。

三、續傳檔案:

有的時候抓檔抓到一半就斷線是不是很令人洩氣呢?沒關係,curl支援續傳,若是有一個傳到一半的檔案叫做brokenfile,只要加一個參數 -c (小寫英文字母c):

% curl -c -o "brokenfile" "ftp://ftp.server.com/path/file"

就可以續傳了!不過curl沒有辦法續傳別的軟體傳到一半的檔案。這是因為通常別的軟體(如NetFinder)會把一些有關下載的資訊加入斷掉的檔案 中,包括URL、Login、Password等。但是curl不認帳,會把這些資訊也當成下載檔案的一部份,因此就會造成從錯誤的地方繼續下載檔 案。(圖4)

圖4說明:NetFinder下載後的檔案會多出一些資訊,用來儲存使用者名稱、密碼以及網址等。若是交給curl續傳,會把這些東西也當成檔案的一部份,因此最後整個檔案就不對了。

四、分割下載:

PC上有個著名的軟體叫做FlashGet,可以把一個檔案分割成很多份同時下載。這有什麼好處呢?有些伺服器會限制每個人抓檔案的速度,而把一個檔案分 割成很多份同時下載就好像有很多個人幫您抓一樣,甲抓一部份,乙抓一部份,丙抓一部份。這樣子就可以讓您下載的速度增加。

% curl -r 0-40960 -o "rose.part1" "http://blueapple.infor.org/rose.jpg" & \
curl -r 40961-81920 -o "rose.part2" "http://blueapple.infor.org/rose.jpg" & \
curl -r 81921-125068 -o "rose.part3" "http://blueapple.infor.org/rose.jpg" &

以上的指令就將rose.jpg拆成三個小檔案分別下載。後面的 "&" 代表把這個程式丟到背景執行,而 "\" 則代表一行指令還沒結束,換行繼續打。參數 -r 代表range,要下載的檔案範圍。注意,是從0開始的,不是從1喔!所以,以上的指令會將第1到40961bytes的部份下載到 rose.part1,第40962到81921bytes的部份下載到rose.part2。以此類推。不過這樣子很麻煩呀!要下載個檔案還得打那麼多 遍!沒關係,筆者寫了一個簡單的小程式來幫您呼叫curl做這些事(註1)。

要把抓下來的各個部份結合起來,只要用以下的指令:

% cat rose.part* > rose.jpg

就可以嘍。

五、查字典:

碰上了沒遇過的單字?手頭上沒字典?curl支援DICT通訊協定,您也可以用curl來查字典!

% curl "dict://dict.org/d:apple"

把apple用你想查的字代換進去,就可以透過網路查字典嘍!

六、上傳檔案:

% curl -T "files" -u user:pass "ftp://ftp.server.com/path/filename"

curl除了下載以外,也可以上傳檔案!參數 -T 後面接想要上傳的檔案,參數 -u 後面接使用者名稱和密碼(兩者以冒號分隔),就可以上傳檔案嘍!如果伺服器支援,也可以接 -c 參數來繼續上傳之前傳到一半的檔案。

curl的功能還不只這些,它支援了FTP、HTTP、HTTPS、TELNET、GOPHER、LDAP、DICT、FILE等各種通訊協定,還可以設 定Proxy、安全認證抓檔案、HTTP post form(就是要填資料的那種網頁)、指定從哪張網路卡傳送、自行設定referer(有些網站會看Referer,如果不正確就不給抓資料)、自行設定 User-Agent(就是瀏覽器送出的識別字串,如Mozilla/4.0)…等。而且他們網站上還提供許多種程式語言的framework(連 Cocoa都有!),讓Programmer能夠自己寫程式利用curl提供的功能。無論您是重量級抓抓族還是因為每次都要重寫網路協定支援而覺得厭煩的 程式設計師,curl都是一個很不錯的選擇呢!

註1:

要安裝這個程式,請按照以下的步驟:
% cd ~/Desktop
% curl -O "http://blueapple.infor.org/curl/multiget.sit"
% open multiget.sit
% cd multiget
% ./install.sh
(Password):
輸入您的密碼,就完成了。(您必須有管理者的權限)

使用方法:
% multiget 50 http://www.server.com/path/file
50就是把檔案分割成50份,後面接要抓檔案的URL。