一.关于爬虫的一些零散知识
1.Robots协议
大多数网站的主页下会有robots.txt文件,标识了爬虫爬取该网站信息时,哪些资源是有限制的,可以使用Python的标准库robotparser来检测将要爬取的url链接是否被允许:
打印结果:
2.识别网站使用的技术
利用builtwith模块可以检测出网站使用的技术信息:
打印结果:
3.查看网站所有者的信息
WHOIS协议可以查询到域名注册者的信息,Python中针对该协议的模块为whois:
打印结果:
二.下载网页
使用urllib2模块进行网页的下载,在上一篇博客中,拉取百度百科的词条获得词条对应的url,但url可能已经过期,我们再去拉取会报异常,所以需要使用try-except捕获异常:
使用urllib2下载网页的时候,可能会出现异常,其中code为4xx为请求异常,5xx为服务器错误,当URLError的code为5xx时,可以考虑重新发起请求:
(2-1)ID遍历爬虫
很多网站由于数据挺多,会采用page切换的方式展现数据,类似于:
http://www......../page=1
http://www......../page=2
这样的。可以使用循环,自动爬取每个page对应的数据。
【模块简介-itertools】
itertools模块模块用于生成各种循环器。
|- itertools.count(start, step) : 从start开始,每隔step生成一个数字,直到无穷大
|- itertools.cycle(seq):无限次的循环seq中的每一个item
|- itertools.repeat(item):无限循环输出item
因为我们并不知道page的最后一个数是多少,因此可以使用itertools进行无限次向后递进循环:
上面的代码中,当遇到某一page对应的url下载到的html_doc为None时,就认为已经到最后一页了,即停止继续爬取网页,但有些情况下,html_doc可能是因为某一page对应的网页失效,或其他原因而导致下载失败,但其后面的page对应url的网页正常,那么上面的代码就有问题了,需要进一步改进:
(2-2)链接爬虫
“百度百科”中爬取词条的时候,在每个词条网页中会包含相关的词条,我们可以使用爬虫对当前网页中其他词条信息进行抓取,这样就可以爬取得到大量的词条信息,但是我们会发现,爬取到的词条的url链接如下①:
① |- /view/76320.htm 相对链接
② |- http://baike.baidu.com/view/76320.htm 绝对链接
而完整的url如②,①为相对链接,它不包括协议和服务器部分,②为绝对链接,对于浏览器来说,绝对/相对链接都可以被识别,但对于urllib2来说,只能识别绝对链接,因为要将相对链接拼接成为绝对链接,此时可以使用urlparse模块进行拼接,将相对链接url_relative拼接为绝对链接url_full:
(2-3)支持代理
有些url的访问需要一个代理IP:
由此完整的downloadHtml()函数可以写成如下的方式:
(2-4)下载限速
有些网站访问对访问速度进行了限制,为了不让爬虫被禁止,需要对爬虫下载网页的速度进行一定的限制:
上面的类,使用了一个字典,来存储每个域名最近一次访问的时间,每次访问一个域名的url的时候,比对上次访问时间,要是没有超过延时delay,则进行相应时间的sleep操作,否则继续访问,有了上面的类,我们就可以实现下载限速的目的: