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请求一次?就像这样:
3 |
curl -o video${video}.mp4 http://xxx.com/video${video}.mp4 |
其实今天才发现只需要一条命令就能够搞定:
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:
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" |
11 |
while [ $i - le "$ps_num" ]; |
13 |
begin=$(((i-1)*part_size)) |
14 |
end=$((i * part_size - 1)) |
15 |
if [ $i - eq $ps_num ]; |
22 |
nohup curl -o "${target_file_name}_part_$i" -r "$begin-$end" "$target_url" & |
不过这个最后还有个问题就是不能有个主进程去监控每个工作进程的完成情况,到时侯去自己合并数据,需要自己手工去合并,比如:
cat 1.txt 2.txt 3.txt > all.txt