我正在编写一个搜寻器,为此,我正在实现robots.txt解析器,我使用的是标准lib robotparser

似乎robotparser的不是正确解析,我正在使用Google的robots.txt调试抓取工具。

(以下示例来自IPython)

In [1]: import robotparser

In [2]: x = robotparser.RobotFileParser()

In [3]: x.set_url("http://www.google.com/robots.txt")

In [4]: x.read()

In [5]: x.can_fetch("My_Crawler", "/catalogs") # This should return False, since it's on Disallow
Out[5]: False

In [6]: x.can_fetch("My_Crawler", "/catalogs/p?") # This should return True, since it's Allowed
Out[6]: False

In [7]: x.can_fetch("My_Crawler", "http://www.google.com/catalogs/p?")
Out[7]: False

这很有趣,因为有时它似乎“工作”,有时似乎失败,我也使用Facebook和Stackoverflow的robots.txt进行了同样的尝试。这是robotpaser模块的错误吗?还是我在这里做错了什么?如果是这样,该怎么办?

我想知道this错误是否有任何相关之处

最佳答案

这不是错误,而是解释上的差异。根据draft robots.txt specification(从未获得批准,也没有可能获得批准):



(第3.2.2节“允许和禁止行”)

使用该解释,然后输入“/catalogs/p?”。应该被拒绝,因为以前有一个“Disallow:/catalogs”指令。

在某个时候,Google开始以与该规范不同的方式解释robots.txt。他们的方法似乎是:

Check for Allow. If it matches, crawl the page.
Check for Disallow. If it matches, don't crawl.
Otherwise, crawl.

问题在于,对robots.txt的解释尚无正式协议(protocol)。我见过使用Google方法的抓取工具以及其他使用1996年以来的标准草案的抓取工具。当我操作抓取工具时,当我使用Google解释时,我从网站管理员那里收到了讨厌的图片,因为我抓取了他们认为不应该抓取的页面,如果我使用其他解释,我会从其他人那里得到讨厌的表情,因为他们认为应该将其编入索引,但事实并非如此。

关于python - Robotparser似乎无法正确解析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15344253/

10-16 01:16