Python robotparser模块给出了错误的结果

时间:2015-06-24 23:13:25

标签: python python-2.7 web-crawler robots.txt

我遇到了Python的robotparser模块的问题。它适用于特定的URL,但一旦执行特定的步骤序列就会失败。下面提到的是我执行的步骤和结果: -

这个序列工作正常: -

>>> import robotparser
>>> rp = robotparser.RobotFileParser()
>>> url = "http://www.ontheissues.org/robots.txt"
>>> rp.set_url(url)
>>> rp.read()
>>> rp.can_fetch("*", "http://www.ontheissues.org/House/Jim_Nussle.htm")
True
>>> 

但是,下面提到的序列与我在上面执行的步骤失败了: -

>>>> import robotparser
>>>> rp = robotparser.RobotFileParser()
>>>> url = "http://menendez.senate.gov/robots.txt"
>>>> rp.set_url(url)
>>>> rp.read()
>>>> rp.can_fetch("*", "http://menendez.senate.gov/contact/contact.cfm")
False
>>>>
>>>>
>>>> url = "http://www.ontheissues.org/robots.txt"
>>>> rp.set_url(url)
>>>> rp.read()
>>>> rp.can_fetch("*", "http://www.ontheissues.org/House/Jim_Nussle.htm")
False
>>>>

经过一段时间的调试后,我发现如果每次使用新的URL时创建一个新对象,它都能正常工作。这意味着,每次URL更改时我都必须执行“rp = robotparser.RobotFileParser()”。

我不确定我的方法是否正确,因为如果我能够更改URL,那么robotparser应该能够处理这种情况。

此外,在上述情况下,当我尝试使用requests.get()或任何其他方式下载链接“http://menendez.senate.gov/contact/contact.cfm”时,它会提供503 error_code。我查看了robotparser.py的代码,在该文件中,对于RobotFileParser类中的read()方法,没有检查HTTP响应代码> 500.我不确定为什么没有处理这些response_codes,只是想得到一些指示可能是不处理这些响应代码的原因。

1 个答案:

答案 0 :(得分:2)

robotparser只能解析http://www.robotstxt.org/orig.html中指定的“/robots.txt”格式的文件,并且这些文件在排除机器人遍历时处于活动状态,它们必须位于网站上的/robots.txt中。基于此,robotparser不应该能够解析“http://menendez.senate.gov/contact/contact.cfm”,因为它可能不是“/robots.txt”格式,即使访问它没有问题。

Facebook在https://www.facebook.com/robots.txt有一个robots.txt文件。它是纯文本,可以在浏览器中读取。 robotparser可以毫无问题地解析它,但是它对facebook.com上其他文件的访问似乎被robots.txt中的以下规则排除:

User-agent: *
Disallow: /

以下是使用robotparser读取和解析https://www.facebook.com/robots.txt的会话:

>>> from urllib import robotparser
>>> rp = robotparser.RobotFileParser()
>>> rp.set_url("https://www.facebook.com/robots.txt")
>>> rp.read()  # no error
>>> rp.can_fetch("*", "https://www.facebook.com/")
False
>>> rp.can_fetch("*", "https://www.facebook.com/about/privacy")
False

在我的浏览器中测试对http://www.ontheissues.org/robots.txt的访问权限时,我收到HTTP错误404 - 找不到文件或目录。然后我下载了http://svn.python.org/projects/python/branches/release22-maint/Lib/robotparser.py,修改了它的read()函数来打印它读取的每一行,在这个URL上运行它并只打印第一行:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

此行表示http://www.ontheissues.org/robots.txt的格式对于“/robots.txt”文件不正确,尽管它可能会重定向到一个。

再次对“https://www.facebook.com/robots.txt”进行相同的测试只会产生一行,这次会显示一条警告消息:

# Notice: Crawling Facebook is prohibited unless you have express written

使用修改后的robotparser.read()函数再次测试http://menendez.senate.gov/contact/contact.cfm会导致HTML标头变得简单,但与http://www.ontheissues.org/robots.txt的标题不同,并且没有错误。以下是为http://menendez.senate.gov/contact/contact.cfm打印的标题行:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

再次浏览http://menendez.senate.gov/contact/contact.cfm,最初会生成http://www.menendez.senate.gov/404,在10-15秒后重定向到http://www.menendez.senate.gov/。这样的重定向链接可以编码如下:

<meta http-equiv="refresh" content="15;url=http://www.menendez.senate.gov/" />

搜索http://www.menendez.senate.gov/contact/的来源发现“cfm”不匹配,表明它不包含指向contact.cfm的链接。虽然这样的链接可以在Web服务器的其他地方配置或动态生成,但是不太可能在浏览时导致http://www.menendez.senate.gov/404的HTTP 404错误。