robots.txt

robots.txt和服务协议

[摘自: Python网络爬虫权威指南 第二版]

​ 从法理上说,网站的服务协议和robots.txt是很有趣的。如果一个网站允许公众接入,那么网站管理员对哪些软件可以接入而哪些软件不可以接入的限制是不合理的。如果网站管理员对你说,“你用浏览器访问网站没问题,但是你用自己写的程序访问它就不行”,这就不太靠谱了。

​ 大多数网站在每页的页脚都有自己的服务协议链接。服务协议不仅包含网络爬虫和自动接入的规则,而且还包括网站收集的信息类型和信息用途,通常还有一条免责声明,表明对网站提供的服务不做任何明示或默示保证。

​ 如果你对搜索引擎优化(search engine optimization,SEO)或搜索引擎技术感兴趣,那么你可能听说过robots.txt文件。如果你想在任何大型网站上查找robots.txt文件,可以在网站根目录http://website.com/robots.txt找到。

​ robots.txt文件的语法是在1994年出现的,那时搜索引擎技术刚刚兴起。当时,从整个互联网寻找资源的搜索引擎,比如AltaVista和DogPile,开始和那些按照主题对网站进行分类的门户网站激烈竞争,比如Yahoo!。互联网搜索规模的增长不仅意味着网络爬虫数量的增长,而且也意味着网络爬虫收集的信息对普通人而言的可供性大大增强了。

​ 虽然我们今天认为这种可用性是稀松平常的,但在当时,当网站文件结构深处隐藏的信息出现在主要搜索引擎的搜索结果首页中时,有些网站管理员感到非常震惊。于是,robots.txt文件的语法,也称为机器人排除标准(Robots Exclusion Standard),应运而生。

​ 与通常用人类语言宽泛地讨论网络爬虫的服务协议不同,robots.txt文件可以被自动化程序轻易地解析和使用。虽然它似乎可以一劳永逸地解决爬虫问题,但是请注意下面两点。

• robots.txt文件的语法没有标准格式。它是一种常用并被良好遵循的规范,但是并未阻止任何人创建自己的robots.txt文件(且不说除非它变成主流标准,否则网络机器人就不会承认或遵循它)。尽管如此,它仍是一种被企业广泛认可的规范,主要是因为它非常简单,而且企业也没什么动力去开发自己的版本或者尝试去改进它。

• robots.txt文件并不是一个强制性约束。它只是说“请不要抓网站的这些内容”。很多网络爬虫库都支持robots.txt文件(虽然这通常是个很容易修改的默认设置)。另外,按照robots.txt文件抓取信息比直接抓取要麻烦得多(毕竟,你需要抓取、分析并在代码逻辑中处理页面内容)。

​ 机器人排除标准的语法很简单。和Python等语言一样,注释都是用#号开头,用换行符结尾,可以用在文件的任意位置。

​ 文件的第一行非注释内容是User-agent:,注明具体哪些机器人需要遵守规则。后面是一组规则,要么是Allow:要么是Disallow:,决定了是否允许机器人访问网站的该部分内容。星号(*)是通配符,可以用于User-agent:,也可以用于URL链接中。

​ 如果一条规则后面跟着一个与之矛盾的规则,则按后一条规则执行。

例如:

1
2
3
4
5
6
#Welcome to my robots.txt file! 
User-agent: *
Disallow: *
User-agent: Googlebot
Allow: *
Disallow: /private

在这个例子中,所有的机器人都被禁止访问网站的任何内容,除了Google的网络机器人,它可以访问网站上除/private位置之外的所有内容。

​ Twitter的robots.txt文件对Google、Yahoo!、Yandex(俄罗斯著名搜索引擎)、微软,以及其他机器人或搜索引擎的访问范围都有明确的说明。Google搜索(和其他机器人的访问范围一样)的内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
#Google Search Engine Robot 
User-agent: Googlebot
Allow: /?_escaped_fragment_
Allow: /?lang=
Allow: /hashtag/*?src=
Allow: /search?q=%23
Disallow: /search/realtime
Disallow: /search/users
Disallow: /search/*/grid
Disallow: /*?
Disallow: /*/followers
Disallow: /*/following

注意,Twitter限制访问其网站中有API的部分。因为Twitter有一个管理良好的API(并且可以通过授权赚到钱),所以禁止任何“自制API”通过独立抓取其网站来收集信息对Twitter最为有利。

​ 虽然看到一个指明爬虫抓取范围的文件让人感觉很憋屈,但是它其实可以成为网络爬虫开发的指示灯。如果你发现一个robots.txt文件禁止抓取网站上某个部分的内容,那么基本可以确定网管同意你抓取其他部分的所有内容(如果他们不愿意让你抓取,就会在robots.txt文件中明令禁止了)。

​ 例如,维基百科的robots.txt文件中适用于一般网络爬虫(并非搜索引擎)的部分非常宽容。它甚至用人类可以阅读的文字来欢迎机器人抓取(适合我们的爬虫!),并且只禁止访问一小部分页面,比如登录页面、搜索页面和“随机词条”页面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#
# Friendly, low-speed bots are welcome viewing article pages, but not
# dynamically generated pages please.
#
# Inktomi's "Slurp" can read a minimum delay between hits; if your bot supports
# such a thing using the 'Crawl-delay' or another instruction, please let us
# know.
#
# There is a special exception for API mobileview to allow dynamic mobile web &
# app views to load section content.
# These views aren't HTTP-cached but use parser cache aggressively and don't
# expose special: pages etc.
#
User-agent: *
Allow: /w/api.php?action=mobileview&
Disallow: /w/
Disallow: /trap/
Disallow: /wiki/Especial:Search
Disallow: /wiki/Especial%3ASearch
Disallow: /wiki/Special:Collection
Disallow: /wiki/Spezial:Sammlung
Disallow: /wiki/Special:Random
Disallow: /wiki/Special%3ARandom
Disallow: /wiki/Special:Search
Disallow: /wiki/Special%3ASearch
Disallow: /wiki/Spesial:Search
Disallow: /wiki/Spesial%3ASearch
Disallow: /wiki/Spezial:Search
Disallow: /wiki/Spezial%3ASearch
Disallow: /wiki/Specjalna:Search
Disallow: /wiki/Specjalna%3ASearch
Disallow: /wiki/Speciaal:Search
Disallow: /wiki/Speciaal%3ASearch
Disallow: /wiki/Speciaal:Random
Disallow: /wiki/Speciaal%3ARandom
Disallow: /wiki/Speciel:Search
Disallow: /wiki/Speciel%3ASearch
Disallow: /wiki/Speciale:Search
Disallow: /wiki/Speciale%3ASearch
Disallow: /wiki/Istimewa:Search
Disallow: /wiki/Istimewa%3ASearch
Disallow: /wiki/Toiminnot:Search
Disallow: /wiki/Toiminnot%3ASearch

​ 是否遵照robots.txt文件的要求写网络爬虫由你自己决定,但是我强烈建议你遵守,尤其是你的爬虫不加选择地抓取网页的时候。