5

このシェルコマンドは成功します

$ 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:BadBehavior」ではなく「403:Forbidden」になります。

私はどういうわけか何か間違ったことをしていますか、それともこれはmechanize / urllib2のバグですか?robots.txtを取得するだけで「悪い動作」になる可能性があるのか​​わかりませんか?

4

1 に答える 1

9

実験で確認したように、受け入れ可能なコンテンツタイプを指定するには、 Acceptヘッダーを追加する必要があります(「Accept」ヘッダーが存在する限り、どのタイプでもかまいません)。たとえば、次のように変更すると機能します。

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

に:

br.addheaders = [('User-Agent', ua), ('Accept', '*/*')]
于 2013-02-13T16:51:48.143 に答える