curl 和 wget 抓取网页

一、curl 和 wget 的区别

1、curl是libcurl这个库支持的,wget是一个纯粹的命令行命令。

2、curl支持更多的协议。

curl supports FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, POP3, IMAP, SMTP and RTSP at the time of this.

writing. wget supports HTTP, HTTPS and FTP.

3、curl 默认支持HTTP1.1(也支持1.0),而wget仅仅支持HTTP1.0规范。引用wget的man page中的一段话:

Please be aware that Wget needs to know the size of the POST data in advance. It’s not quite clear how to work around this limitation inherent in HTTP/1.0. Although HTTP/1.1 introduces chunked transfer that doesn’t require knowing the request length in advance, a client can’t use chunked unless it knows it’s talking to an HTTP/1.1 server. And it can’t know that until it receives a response, which in turn requires the request to have been completed – a chicken-and-egg problem.

HTTP1.0和HTTP1.1的区别,HTTP1.1中增加的持续性连接(Persist Connection)与块编码(Chunked Encoding)技术。
块传输编码(Chunked Transfer Coding)
块 编码(chunked encoding)改变消息主体使消息主体(message body,译注:消息主体与实体主体是有区别的,后面章节将会介绍)成块发送。每一个块有它自己的大小(size)指示器,在所有的块之后会紧接着一个可 选的包含实体头域的尾部(trailer)。这允许发送端能动态生成内容,并能携带有用的信息,这些信息能让接收者判断消息是否接收完整。

4、curl在指定要下载的链接时能够支持URL的序列或集合,而wget则不能这样。

5、wget支持递归下载,而curl则没有这个功能。

二、网站抓取实例

抓取网页,分为url 网址和proxy代理两种方式。以抓取百度首页为例。

1、url 网址方式抓取

(1)curl下载百度首页内容,保存在baidu_html文件中

curl http://www.baidu.com/ -o baidu_html

(2)wget下载百度首页内容,保存在baidu_html文件中

wget http://www.baidu.com/ -O baidu_html

有的时候,由于网速/数据丢包/服务器宕机/等原因,导致暂时无法成功下载网页,这时,可能就需要多次尝试发送连接,请求服务器的响应;如果多次仍无响应,则可以确认服务器出问题了。

(1)curl多次尝试连接

curl --retry 10 --retry-delay 60 --retry-max-time 60 http://www.baidu.com/ -o baidu_html

注:–retry表示重试次数;–retry-delay表示两次重试之间的时间间隔(单位:秒);–retry-max-time表示超时时间。

curl -y 60 -Y 1 -m 60 http://www.baidu.com -o baidu_html

注:-y表示测试网速的时间;-Y表示停止传输速度的限制(单位:字节/秒);-m表示最大的连接时间,超过则连接自动断掉放弃连接

(2)wget多次尝试连接

wget -t 10 -w 60 -T 30 http://www.baidu.com/ -O baidu_html

注:-t(–tries)表示重试次数;-w表示两次重试之间的时间间隔(单位:秒);-T表示链接超时时间。

2、proxy 代理方式抓取

proxy代理下载,是通过连接一台中间服务器间接下载url网页的过程,不是url直接连接网站服务器下载。这里代理用127.0.0.1:8080做测试。

(1)curl 通过代理抓取百度首页

curl -x 127.0.0.1:8080 -o baidu_html http://www.baidu.com

注:-x表示代理服务器(ip:port),port 常见有80,8080,8086,8888,3128等,默认为80,即curl先连接到代理服务器127.0.0.1:8080,然后再通过它下载百度首页,最后127.0.0.1:8080把下载的百度首页传给curl至本地

(2)wget 通过代理抓取百度首页

wget通过代理下载,跟curl不太一样,需要首先设置代理服务器的http_proxy=ip:port

以ubuntu为例,在当前用户目录(cd ~),新建一个wget配置文件(.wgetrc),输入代理配置:

http_proxy=127.0.0.1:8080

然后再输入wget抓取网页的命令:

wget http://www.baidu.com -O baidu_html

你可能感兴趣的:(Spider)