web-dev-qa-db-ja.com

Pythonの `urllib2`:Wikipediaページを` urlopen`するとエラー403が発生するのはなぜですか?

ウィキペディアの特定のページをurlopenしようとすると、奇妙なバグがあります。これはページです:

http://en.wikipedia.org/wiki/OpenCola_(drink)

これはシェルセッションです。

>>> f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
Traceback (most recent call last):
  File "C:\Program Files\Wing IDE 4.0\src\debug\tserver\_sandbox.py", line 1, in <module>
    # Used internally for debug sandbox under external interpreter
  File "c:\Python26\Lib\urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "c:\Python26\Lib\urllib2.py", line 397, in open
    response = meth(req, response)
  File "c:\Python26\Lib\urllib2.py", line 510, in http_response
    'http', request, response, code, msg, hdrs)
  File "c:\Python26\Lib\urllib2.py", line 435, in error
    return self._call_chain(*args)
  File "c:\Python26\Lib\urllib2.py", line 369, in _call_chain
    result = func(*args)
  File "c:\Python26\Lib\urllib2.py", line 518, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 403: Forbidden

これは異なる大陸の2つの異なるシステムで私に起こりました。なぜこれが起こるのか誰にも分かりますか?

53
Ram Rachum

ウィキペディアのスタンスは

データの取得:承認済みのボットタスクに直接関係しない用途のバルクコンテンツを取得するためにボットを使用することはできません。これには、別のWebサイトからページを動的にロードすることが含まれます。その結果、Webサイトがブラックリストに登録され、アクセスが完全に拒否される可能性があります。バルクコンテンツをダウンロードしたり、プロジェクトをミラーリングしたい場合は、データベースの独自のコピーをダウンロードまたはホストしてください。

だからPythonはブロックされています。 データダンプをダウンロードする とすることになっています。

とにかく、Python 2:

req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib2.urlopen( req )
print con.read()

またはPython 3:

import urllib
req = urllib.request.Request(url, headers={'User-Agent' : "Magic Browser"}) 
con = urllib.request.urlopen( req )
print con.read()
124
Jochen Ritzel

これをデバッグするには、その例外をトラップする必要があります。

try:
    f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
except urllib2.HTTPError, e:
    print e.fp.read()

結果のメッセージを印刷すると、次のものが含まれます。

"英語

現在、サーバーで技術的な問題が発生しています。これはおそらく一時的なものであり、すぐに修正する必要があります。数分後にもう一度お試しください。 」

10
S.Lott

多くの場合、Webサイトは、認識されたユーザーエージェントによってアクセスされているかどうかを確認することにより、アクセスをフィルターします。ウィキペディアでは、スクリプトをボットとして扱い、拒否しています。ブラウザとしてなりすましを試してください。次のリンクでは、その方法を示す記事を紹介しています。

http://wolfprojects.altervista.org/changeua.php

5
Eli

Jochen Ritzelが述べたように、ウィキペディアはボットをブロックします。

ただし、PHP api。「love」というタイトルのウィキペディアページを取得するには、ボットはブロックされません。

http://en.wikipedia.org/w/api.php?format=json&action=query&titles=love&prop=revisions&rvprop=content

1
Hello World

一部のWebサイトでは、urllibが送信するヘッダーを読み取ることにより、サーバーの「不必要な」使用を回避するために、スクリプトからのアクセスをブロックします。ウィキペディアがこれを行う/行う理由を知りませんし、想像もできませんが、ヘッダーをスプーフィングしようとしましたか?

1
Chris Foster

必要なサイトでブロックされていないphpを使用して、この問題を回避しました。

次のようにアクセスできます。

path='http://phillippowers.com/redirects/get.php? 
file=http://website_you_need_to_load.com'
req = urllib2.Request(path)
response = urllib2.urlopen(req)
vdata = response.read()

これにより、HTMLコードが返されます

0
Phil