我正在编写一个搜寻器,为此,我正在实现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/