可爱的爬虫(二)——下载器wget

wget,简单粗暴的下载器。

1 组装爬虫

没有谁不想有一个属于自己的轮子,看到GitHub上飙升的Star和Fork,心里美滋滋的。那些用程序员鼓励师来博人眼球的文案,真是呵呵了。你们真不懂程序员,真正能给予我们力量的不是性感与裸露,而是来自用户、同行和社会的认可。

  • 如果用户点赞了我们的产品;
  • 如果同行提交了Pull Request;
  • 如果社会上多几声工程师的称谓。

但是现实却有些骨感,制造一个满意的轮子往往是在梦醒时分。工作中,我们不得不压榨时间,留更多的时间给抓取的过程,让处理和分析走得更加顺畅。我们放弃了炫技的机会,争分夺秒,以最快的速度写出bug free的代码。然后运行代码,等待,等待,再等待,等待数据抓取完成。如果一不小心进坑,还要重新修复程序,再运行,再等待。

所以,我们希望尽快实现爬虫,不要和我提C++了,没时间了。什么,Python?还能不能更快?最好和堆积木一样,三下五除二组装起来,搞定。如果你还没有写过爬虫,那太好了,我们一起来用现成的工具堆一个吧!

2 下载器wget

2.1 wget上手

wget,来源于 World Wide Web和get,是一个命令行工具。通过wget可以快速组装出如我心意的下载器,入门只需以下八步。

1) 抓取“zhangxiaoyang.me”可以这样做:

$ wget zhangxiaoyang.me

然后会将“zhangxiaoyang.me”对应的页面抓取并储存到本地当前路径,即index.html

2) 如果我们想修改储存的文件名或路径,可以这样:

$ wget -O homepage.txt zhangxiaoyang.me # 修改文件名为homepage.txt
$ wget -P website zhangxiaoyang.me # 修改下载路径为website,没有该文件夹则自动创建

3) 作为一只有礼貌的爬虫,有必要控制一下下载速度,我们都不希望目标网站因承受不住而挂掉:

$ wget --limit-rate=200k zhangxiaoyang.me

4) 如果不幸网络断开或出现了异常情况导致中途下载失败了,不要怕,这在下载大文件的时候尤为重要:

$ wget -c zhangxiaoyang.me

5) 如果之前已经成功下载了,wget -c将不会重复下载,并提示我们:

The file is already fully retrieved; nothing to do.

6) 把下载任务丢到后台吧,我们可以搞其他的事情,wget还会在当前目录生成一个wget-log文件,里面记录了下载任务的详细情况:

$ wget -b zhangxiaoyang.me
Continuing in background, pid 2714.
Output will be written to ‘wget-log’.

7) 把自己伪装成浏览器吧,直接声称自己是爬虫是不是太实诚了:

$ wget -U "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36" zhangxiaoyang.me

8) 以上参数可以随意组合,比如这样:

$ wget -U "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.63 Safari/537.36" -c -b --limit-rate=200k -O homepage.txt zhangxiaoyang.me

2.2 wget知新

1) 由于种种原因,有些URL不能一次抓取成功,可能需要多试几次(最多尝试3次):

$ wget --tries=3 zhangxiaoyang.me

2) 设置连接超时(3秒):

$ wget --connect-timeout=3 google.com

3) 我们有一批URL需要抓取,所有的URL储存在urllist.txt中,一行一个URL:

$ wget -i urllist.txt

4) 抓取一个FTP协议的URL,但是需要验证账号和密码:

$ wget --ftp-user=USERNAME --ftp-password=PASSWORD FTP_URL

5) 抓取一个HTTP协议的URL,但是需要验证账号和密码:

$ wget --http-user=USERNAME --http-password=PASSWORD HTTP_URL

6) 我只想抓取并输出,不要储存到文件:

$ wget -O- zhangxiaoyang.me

7) 输出的结果里带有下载进度等冗余信息,我不希望看到他们:

$ wget -q -O- zhangxiaoyang.me

8) 我似乎get了静默下载的新技能:

$ wget -q zhangxiaoyang.me

9) 把下载详情写入日志吧:

$ wget -o mylog zhangxiaoyang.me

2.3 wget抓站

1) 我要把“zhangxiaoyang.me”的所有内容都下载下来,我要收藏!

$ wget -r zhangxiaoyang.me

2) 如果之前已经抓过该站点,只想抓取有更新的内容:

$ wget -r -N zhangxiaoyang.me

3) 我只想下载“zhangxiaoyang.me”中的图片:

$ wget -r -A .jpg,.jpeg,.gif,.png zhangxiaoyang.me

4) 我不想下载图片:

$ wget -r -R .jpg,.jpeg,.gif,.png zhangxiaoyang.me

5) 设置域名来跟踪指定的域名:

$ wget -r -D zhangxiaoyang.me,vince67.github.io zhangxiaoyang.me

6) 限制批量下载时的时间间隔(3秒):

$ wget -r -w 3 zhangxiaoyang.me

7) 设置抓取的深度,如果想无限抓取:

$ wget -r -l inf zhangxiaoyang.me

8) 镜像一个网站:

$ wget -r -N -l inf zhangxiaoyang.me

9) 如果想简化以上写法:

$ wget -m zhangxiaoyang.me

10) 把下载的HTML中的链接改为本地链接(指向下载的本地文件):

$ wget -r -k zhangxiaoyang.me

当网站下载完成后,会执行转换,可以看到类似下面的输出:

FINISHED --2016-06-08 03:56:00--
Total wall clock time: 41s
Downloaded: 176 files, 7.3M in 2.6s (2.87 MB/s)
Converting links in zhangxiaoyang.me/categories/data-mining-tutorial/data-mining-tutorial-5-2.html... 23-2
Converting links in zhangxiaoyang.me/categories/weixin/20160606.html... 22-2
...

11) 下载所有和网站渲染相关的内容且他们必须隶属当前域名,比如图片、声音、样式,这样比用-A-R方便很多:

$ wget -r -p zhangxiaoyang.me

12) 下载所有内容,哪怕这些内容在其他的域名下,这样比用-D方便很多:

$ wget -r -H zhangxiaoyang.me

13) 给下载的文件加上后缀(如果原来并没有文件后缀的话),比如一个HTML文件下载下来是无后缀的,此时给他加上.html

$ wget -r -E zhangxiaoyang.me

14) 网站镜像终极大法:

$ wget -mpkEH zhangxiaoyang.me

15) 了解以上缩写参数的全称或者get更多技能:

$ wget --help
$ man wget

参考