【问题标题】:Python robotparser module giving wrong resultsPython robotsparser 模块给出错误的结果
【发布时间】:2015-06-24 23:13:25
【问题描述】:

我遇到了 Python 的 robotsparser 模块的问题。它适用于特定的 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,只是想得到一些指针可能是不处理这些响应代码的原因。

【问题讨论】:

  • 当我刚尝试访问 menendez.senate.gov/contact/contact.cfm 时,我收到了 HTTP 404 响应和此页面 menendez.senate.gov/404
  • 这个网址我得到 503。 >>> 导入请求 >>> requests.get("menendez.senate.gov/contact/contact.cfm")
  • 503 表示服务不可用,404 表示未找到。无论哪种方式,网站都有问题。也许有人正在研究它,这不是robotparser.py的错。如果您希望它处理错误代码,则将其放入。不处理 503 的原因可能是“由于服务器的临时过载或维护”,而 404 通常代表更持久的情况。
  • 查看 robotsparser 手册 (docs.python.org/2/library/robotparser.html) 应该给它一个以 robots.txt 结尾的 URL,并具有在 robotstxt.org/orig.html 中记录的结构。 menendez.senate.gov/contact/contact.cfm 不是 robots.txt 文件,因此 robotparser 无法解析它。诚然,它应该返回一个表明这一点而不是 HTTP 错误的错误,但是网站存在问题,并且 robotsparser 似乎无法读取 URL 以确定它无法解析它。
  • 是的,我将 URL 作为menendez.senate.gov/robots.txt 传递给robotparser,所以我认为我没问题。由于临时超载或维护而不处理 5XX 错误是有道理的。

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


【解决方案1】:

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 文件。它是纯文本格式,可以在浏览器中阅读。 robotsparser 可以毫无问题地解析它,但是它对 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 错误,这不太可能。

【讨论】:

  • 是的,确实有道理。但是您应该使用menendez.senate.gov/robots.txt 文件来由我的问题的试用代码中提到的robotparser 解析。
猜你喜欢
  • 2012-04-19
  • 2018-02-09
  • 2012-08-30
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多