使用 mechanize 检索 robots.txt 时出现 HTTP 403 错误

Posted

技术标签:

【中文标题】使用 mechanize 检索 robots.txt 时出现 HTTP 403 错误【英文标题】:HTTP 403 error retrieving robots.txt with mechanize 【发布时间】:2013-01-29 05:20:52 【问题描述】:

这个shell命令成功

$ curl -A "Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)" http://fifa-infinity.com/robots.txt

并打印 robots.txt。省略 user-agent 选项会导致服务器出现 403 错误。检查 robots.txt 文件显示http://www.fifa-infinity.com/board 下的内容允许抓取。但是,以下失败(python代码):

import logging
import mechanize
from mechanize import Browser

ua = 'Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)'
br = Browser()
br.addheaders = [('User-Agent', ua)]
br.set_debug_http(True)
br.set_debug_responses(True)
logging.getLogger('mechanize').setLevel(logging.DEBUG)
br.open('http://www.fifa-infinity.com/robots.txt')

我的控制台上的输出是:

No handlers could be found for logger "mechanize.cookies"
send: 'GET /robots.txt HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.fifa-infinity.com\r\nConnection: close\r\nUser-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:18.0) Gecko/20100101 Firefox/18.0 (compatible;)\r\n\r\n'
reply: 'HTTP/1.1 403 Bad Behavior\r\n'
header: Date: Wed, 13 Feb 2013 15:37:16 GMT
header: Server: Apache
header: X-Powered-By: php/5.2.17
header: Vary: User-Agent,Accept-Encoding
header: Connection: close
header: Transfer-Encoding: chunked
header: Content-Type: text/html
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/moshev/Projects/forumscrawler/lib/python2.7/site-packages/mechanize/_mechanize.py", line 203, in open
    return self._mech_open(url, data, timeout=timeout)
  File "/home/moshev/Projects/forumscrawler/lib/python2.7/site-packages/mechanize/_mechanize.py", line 255, in _mech_open
    raise response
mechanize._response.httperror_seek_wrapper: HTTP Error 403: Bad Behavior

奇怪的是,在不设置用户代理的情况下使用 curl 会导致“403: Forbidden”而不是“403: Bad Behavior”。

我是不是做错了什么,或者这是 mechanize/urllib2 中的错误?我看不出简单地获取 robots.txt 可能是“不良行为”?

【问题讨论】:

还有另一个标头嗅探失败的例子。另一端的服务器正在查看更多的 UA 代理,检查 curl 发送的标头,将它们与 mechanize 使用的标头进行比较,调整,冲洗,重复。这不是 python 问题。 这个问题与urllib2.HTTPError: HTTP Error 403: Forbidden非常相似 【参考方案1】:

经过实验验证,您需要添加一个Accept 标头来指定可接受的内容类型(任何类型都可以,只要“Accept”标头存在)。比如修改后会生效:

br.addheaders = [('User-Agent', ua)]

到:

br.addheaders = [('User-Agent', ua), ('Accept', '*/*')]

【讨论】:

我希望我早点看到这个......它会为我节省几个小时的工作!谢谢惠!

以上是关于使用 mechanize 检索 robots.txt 时出现 HTTP 403 错误的主要内容,如果未能解决你的问题,请参考以下文章

CTF--web 攻防世界web题 robots backup

Perl Mechanize : 获取页面修改后的响应页面?

Python爬虫的道德规范---robots协议

Ruby登录使用mechanize进行spotify

无法使用 Ruby Mechanize 登录亚马逊

如何使用 Mechanize 处理 JavaScript?