网络爬虫项目开发日志(五): 爬虫协议初探

--前言--

常在河边走,哪有不湿鞋

有的时候,网络爬取就像串门一样,如果守规矩的话,是需要先打个电话给主人预约一下,或是进门的时候先敲门看看主人是否在家,如果主人允许咱进去,咱再进去,进去后,也不要东摸摸西看看,否则主人是会发飙了,搞不好就会逐客了。


--概念--

网络爬取领域,也是一样的,也有着通用的规范,称之为机器人协议,这是一个面向计算机网络搜索引擎的,以Robots命名的文本文档,一般都会放在网站的根目录下,可以直接访问到的。


--应用模式--

应用模式,此文讨论的主要是围绕ICP(网络内容提供商)和搜索引擎(爬虫程序)之间的双向行为模式。

1)  ICP通过“爬虫协议“排除特定信息显示于搜索结果,即:ICP通过爬虫协议禁止搜索引擎将该网站上部分信息被罗列在搜索结果中,但实际上我们还是可以通过别的方式来访问或获取这些信息的。

2) ICP通过“爬虫协议”排除特定搜索引擎,即:爬虫协议作用的对象原本只是针对改ICP网站上的部分信息内容,并一视同仁的对待所有的网站访问者。但是,在此模式中,ICP网站引入了白名单、黑名单机制,对名单中的不同访问者区别性对待。

3)  搜索引擎无视“爬虫协议”并提供相关的信息地址,即:由于“爬虫协议”并不具备技术上的强制性,搜索引擎完全可以无视协议,直接访问ICP网站内容,这种行为可能属于违约,应承担违约责任,而且有过过往的法律纠纷发生过,但是,我只能说过往的法律裁定结果不能作为今后类似案件的判定依据。

4)  搜索引擎无视“爬虫协议”并复制相关信息,即:网络爬取是最典型的事例,这种情况下有可能侵犯ICP的著作权,如果ICP的信息都来源于网络用户的上传,搜索引擎的复制行为也涉嫌侵犯其他主题的著作权及ICP对于信息管理、编排所产生的权利。

5) ICP对于“爬虫协议”功能的扩展,很多ICP运营者往往会利用“爬虫协议”的法律地位与功能的不明确,赋予其额外的功能,实现竞争利益最大化的同时为其相关欣行为的合理性背书。针对这种行为,可以结合《反不正当竞争法》有相关条款,并着眼于“爬虫协议”的基本功能,结合该行为背后的竞争因素,判断爬虫协议的合理性。


--简易协议构建--

最简单的robots.txt只有两条规则:
User-agent:指定对哪些爬虫生效
Disallow:指定要屏蔽的网址
先说User-agent,爬虫抓取时会声明自己的身份,这就是User-agent,没错,就是http协议里的User-agent。robots.txt利用User-agent来区分不同的搜索引擎。
Disallow 行列出的是要拦截的网页,以正斜线 (/) 开头,可以列出特定的网址或模式。要屏蔽整个网站,使用正斜线即可;
要屏蔽某一目录以及其中的所有内容,在目录名后添加正斜线;要屏蔽某个具体的网页,就指出这个网页。例如:

User-agent: *

Disallow: /?*

Disallow: /pop/*.html

User-agent: EtaoSpider

Disallow: /


--进阶--

sitemap


前面说过爬虫会通过网页内部的链接发现新的网页。但是如果没有连接指向的网页怎么办?或者用户输入条件生成的动态网页怎么办?能否让网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页?这就是sitemap,最简单的 Sitepmap 形式就是 XML 文件,在其中列出网站中的网址以及关于每个网址的其他数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度等等),利用这些信息搜索引擎可以更加智能地抓取网站内容。
新的问题来了,爬虫怎么知道这个网站有没有提供sitemap文件,或者说网站管理员生成了sitemap,(可能是多个文件),爬虫怎么知道放在哪里呢?
由于robots.txt的位置是固定的,于是大家就想到了把sitemap的位置信息放在robots.txt里。这就成为robots.txt里的新成员了。
节选一段google robots.txt:
Sitemap: http://www.gstatic.com/cultur...
Sitemap: http://www.google.com/hostedn...
插一句,考虑到一个网站的网页众多,sitemap人工维护不太靠谱,google提供了工具可以自动生成sitemap。


meta tag
其实严格来说这部分内容不属于robots.txt。
robots.txt的初衷是为了让网站管理员管理可以出现在搜索引擎里的网站内容。但是,即使使用 robots.txt 文件让爬虫无法抓取这些内容,搜索引擎也可以通过其他方式找到这些网页并将它添加到索引中。例如,其他网站仍可能链接到该网站。因此,网页网址及其他公开的信息(如指向相关网站的链接中的定位文字或开放式目录管理系统中的标题)有可能会出现在引擎的搜索结果中。如果想彻底对搜索引擎隐身那咋整呢?答案是:元标记,即meta tag。
比如要完全阻止一个网页的内容列在搜索引擎索引中(即使有其他网站链接到此网页),可使用 noindex 元标记。只要搜索引擎查看该网页,便会看到 noindex 元标记并阻止该网页显示在索引中,这里注意noindex元标记提供的是一种逐页控制对网站的访问的方式。
要防止所有搜索引擎将网站中的网页编入索引,在网页的部分添加:

这里的name取值可以设置为某个搜索引擎的User-agent从而指定屏蔽某一个搜索引擎。
除了noindex外,还有其他元标记,比如说nofollow,禁止爬虫从此页面中跟踪链接。详细信息可以参考Google支持的元标记,这里提一句:noindex和nofollow在HTML 4.01规范里有描述,但是其他tag的在不同引擎支持到什么程度各不相同,还请读者自行查阅各个引擎的说明文档。


Crawl-delay
除了控制哪些可以抓哪些不能抓之外,robots.txt还可以用来控制爬虫抓取的速率。如何做到的呢?通过设置爬虫在两次抓取之间等待的秒数。
Crawl-delay:5
表示本次抓取后下一次抓取前需要等待5秒。
注意:google已经不支持这种方式了,在webmaster tools里提供了一个功能可以更直观的控制抓取速率。
这里插一句题外话,几年前曾经有一段时间robots.txt还支持复杂的参数:Visit-time,只有在visit-time指定的时间段里,爬虫才可以访问;Request-rate: 用来限制URL的读取频率,用于控制不同的时间段采用不同的抓取速率。后来估计支持的人太少,就渐渐的废掉了,目前google和baidu都已经不支持这个规则了,其他小的引擎公司貌似从来都没有支持过。


防君子不防小人
Robots协议不是什么技术壁垒,而只是一种互相尊重的协议,好比私家花园的门口挂着“闲人免进”,尊重者绕道而行,不尊重者依然可以推门而入。目前,Robots协议在实际使用中,还存在一些问题。


缓存
robots.txt本身也是需要抓取的,出于效率考虑,一般爬虫不会每次抓取网站网页前都抓一下robots.txt,加上robots.txt更新不频繁,内容需要解析。通常爬虫的做法是先抓取一次,解析后缓存下来,而且是相当长的时间。假设网站管理员更新了robots.txt,修改了某些规则,但是对爬虫来说并不会立刻生效,只有当爬虫下次抓取robots.txt之后才能看到最新的内容。尴尬的是,爬虫下次抓取robots.txt的时间并不是由网站管理员控制的。当然,有些搜索引擎提供了web 工具可以让网站管理员通知搜索引擎那个url发生了变化,建议重新抓取。注意,此处是建议,即使你通知了搜索引擎,搜索引擎何时抓取仍然是不确定的,只是比完全不通知要好点。至于好多少,那就看搜索引擎的良心和技术能力了。


ignore
不知是无意还是有意,反正有些爬虫不太遵守或者完全忽略robots.txt,不排除开发人员能力的问题,比如说根本不知道robots.txt。另外,本身robots.txt不是一种强制措施,如果网站有数据需要保密,必需采取技术措施,比如说:用户验证,加密,ip拦截,访问频率控制等。


恶意爬虫
在互联网世界中,每天都有不计其数的爬虫在日夜不息地爬取数据,其中恶意爬虫的数量甚至高于非恶意爬虫。遵守Robots协议的爬虫才是好爬虫,但是并不是每个爬虫都会主动遵守Robots协议。
恶意爬虫可以带来很多潜在威胁,比如电商网站的商品信息被爬取可能会被竞争对手利用,过多的爬虫还会占用带宽资源、甚至导致网站宕机。


你可能感兴趣的:(爬虫,网络爬虫,爬虫,搜索引擎,机器人,计算机)