【发布时间】: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