Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1181455
  • 博文数量: 181
  • 博客积分: 4968
  • 博客等级: 上校
  • 技术积分: 1867
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-13 21:52
文章分类

全部博文(181)

文章存档

2015年(2)

2013年(6)

2012年(22)

2011年(41)

2010年(27)

2009年(51)

2008年(32)

我的朋友

分类: LINUX

2015-11-20 13:52:49

1. 资源另存为

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

?
1
curl -o lesson0.mp4
使用-O (大欧) 选项可以自动从url解析出文件名另存为到当前目录
?
1
curl -O
文件就会以S7S94H7FF.mp4 为文件名进行保存。但是如果执行:
?
1
curl -O
那么就会产生错误:“Remote file name has no length!” 无法去解析文件名。

2. 查看Http响应头

通过 -I 参数可以只查看Http响应头

?
1
curl -I

3. 强大的通配符支持

公开课的视频有很多,假设我们要全部下载,该怎么做?去循环?每次都去curl请求一次?就像这样:

?
1
2
3
4
for video in 1 2 3 4;
do
curl -o video${video}.mp4 {video}.mp4
done
其实今天才发现只需要一条命令就能够搞定:
?
1
curl -o 'video#1.mp4' '[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 {minzufeng,tante}.mp3

4. 自动跟踪重定向

如果curl请求的地址产生重定向,那么使用-L参数会自动重定向,比如:

?
1
curl -L
会自动重定向到

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 ""

ua: --user-agent ""

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'
这样就会下载文件的前500个byte, 如果一个大文件,我们可以通过先使用curl -I拿到Content-Length, 然后分配固定个进程,为每个进程制定一个下载的范围,这样就可以实现多进程下载,下载完毕之后再将每个进程下载的文件进行合并就可以。

for example:

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

不过这个最后还有个问题就是不能有个主进程去监控每个工作进程的完成情况,到时侯去自己合并数据,需要自己手工去合并,比如:

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

阅读(4000) | 评论(0) | 转发(0) |
0

上一篇:右左法则--复杂指针解析

下一篇:没有了

给主人留下些什么吧!~~