網頁下載工具curl命令簡介


原文鏈接:http://my.oschina.net/chihz/blog/96101

早上起床的時候看網易公開課,想下載到本地觀看,於是就寫了一個shell腳本,從頁面抓取公開課的鏈接,然后下載到本地。順便深入研究了一下curl工具的使用,以下是總結。

1. 資源另存為

利用curl 可以把url資源以指定的文件名另存為到本地

1 curl -o lesson0.mp4 http://60.2.157.160/mov.bn.netease.com/movieMP4/2012/3/F/F/S7S94H7FF.mp4

使用-O (大歐) 選項可以自動從url解析出文件名另存為到當前目錄

1 curl -O http://60.2.157.160/mov.bn.netease.com/movieMP4/2012/3/F/F/S7S94H7FF.mp4

文件就會以S7S94H7FF.mp4 為文件名進行保存。但是如果執行:

1 curl -O http://www.sina.com.cn

那么就會產生錯誤:“Remote file name has no length!” 無法去解析文件名。

2. 查看Http響應頭

通過 -I 參數可以只查看Http響應頭

1 curl -I http://www.sina.com.cn

3. 強大的通配符支持

公開課的視頻有很多,假設我們要全部下載,該怎么做?去循環?每次都去curl請求一次?就像這樣:

1 for video in 1 2 3 4;
2 do
3 curl -o video${video}.mp4 http://xxx.com/video${video}.mp4
4 done

其實今天才發現只需要一條命令就能夠搞定:

1 curl -o 'video#1.mp4' 'http://xxx.com/video[1-4].mp4'

這樣就可以下載所有的視頻,並且所有的視頻都會依次以video1.mp4 video2.mp4...這樣來在本地進行保存。

另外范圍的通配符還支持前面置0的做法:

1 curl -O http://www.curltest.com/test[00-99].mp3

就會自動下載test00.mp3 到 test99.mp3

另外還可以指定步長:

1 curl -O http://www.curltest.com/test[00-99:2].mp3

嗯,感覺跟Python的range差不多吧。挺高端的。

除了表示范圍的通配符,還可以提供詞匯列表的通配:

1 curl -O http://www.urltest.com/{minzufeng,tante}.mp3

4. 自動跟蹤重定向

如果curl請求的地址產生重定向,那么使用-L參數會自動重定向,比如:

1 curl -L http://www.sina.com

會自動重定向到www.sina.com.cn

5. 指定HTTP請求方式

可以使用-X參數來指定http的請求方式,默認的情況下curl發起的是GET請求。

curl -X POST 發起post請求

curl -X UPDATE 發起update請求

6. 自定義HTTP請求頭:

cookie: --cookie "name1=XXX;name2=XXX" http://www.curltest.com

referer: --referer "<script>alert('I am admin, bitch!');</script>"

ua: --user-agent "<script>alert('I am admin, bitch!');</script>"

7. 提交Form表單

可以使用-F參數來提交form表單, -F參數允許有多個

curl -X post -F "name=chihz" -F "age=22" -F "headImg=@/home/samchi/images/mypic.jpg" http://curltest.com

其中 -F "headImg=@/home/samchi/images/mypic.jpg"  為文件上傳。

8. 多進程下載

curl支持按照范圍來進行文件下載,通過-r參數就可以實現:

1 curl -O -r'0-500' http://60.2.157.160/mov.bn.netease.com/movieMP4/2012/3/F/F/S7S94H7FF.mp4

這樣就會下載文件的前500個byte, 如果一個大文件,我們可以通過先使用curl -I拿到Content-Length, 然后分配固定個進程,為每個進程制定一個下載的范圍,這樣就可以實現多進程下載,下載完畢之后再將每個進程下載的文件進行合並就可以。

for example:

01 #!/bin/bash
02 read -p"please input the target url:" target_url
03 read -p"please input the processor number:" ps_num
04 read -p"please input the target file name:" target_file_name
05 content_length=$(curl -I $target_url|grep 'Content-Length'|awk -F':' '{print$2}')
06 content_length=$(echo $content_length) #like trim function
07 echo "the content length is:$content_length"
08 part_size=$((content_length / ps_num))
09 echo "Part size is $part_size"
10 i=1
11 while [ $i -le "$ps_num" ];
12 do
13   begin=$(((i-1)*part_size))
14   end=$((i * part_size - 1))
15   if [ $i -eq $ps_num ];
16   then
17     end=$content_length
18   fi
19   i=$((i+1))
20   echo "begin:$begin"
21   echo "end:$end"
22   nohup curl -o "${target_file_name}_part_$i" -r "$begin-$end" "$target_url" &
23 done

不過這個最后還有個問題就是不能有個主進程去監控每個工作進程的完成情況,到時侯去自己合並數據,需要自己手工去合並,比如:

cat 1.txt 2.txt 3.txt > all.txt 

另外發現http協議有很多東西需要自己去發掘,我覺着我應該去好好讀讀最近流行的那本HTTP權威指南了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM