首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HTTP 403使用mechanize检索robots.txt时出错

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

Stack Overflow用户
提问于 2013-02-13 23:46:29
回答 1查看 6.1K关注 0票数 5

此shell命令成功

代码语言:javascript
复制
$ 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代码):

代码语言:javascript
复制
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')

在我的控制台上的输出是:

代码语言:javascript
复制
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:禁止“,而不是"403:坏行为”。

我是不是做错了什么,或者这是mechanize/urllib2中的一个bug?我不明白简单地获取robots.txt怎么会是“坏行为”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-14 00:51:48

通过实验验证,您需要添加一个Accept标头来指定可接受的内容类型(只要存在"Accept“标头,任何类型都可以)。例如,更改后即可正常工作:

代码语言:javascript
复制
br.addheaders = [('User-Agent', ua)]

至:

代码语言:javascript
复制
br.addheaders = [('User-Agent', ua), ('Accept', '*/*')]
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14857342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档