ウィキペディアの特定のページを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つの異なるシステムで私に起こりました。なぜこれが起こるのか誰にも分かりますか?
データの取得:承認済みのボットタスクに直接関係しない用途のバルクコンテンツを取得するためにボットを使用することはできません。これには、別の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()
これをデバッグするには、その例外をトラップする必要があります。
try:
f = urllib2.urlopen('http://en.wikipedia.org/wiki/OpenCola_(drink)')
except urllib2.HTTPError, e:
print e.fp.read()
結果のメッセージを印刷すると、次のものが含まれます。
"英語
現在、サーバーで技術的な問題が発生しています。これはおそらく一時的なものであり、すぐに修正する必要があります。数分後にもう一度お試しください。 」
多くの場合、Webサイトは、認識されたユーザーエージェントによってアクセスされているかどうかを確認することにより、アクセスをフィルターします。ウィキペディアでは、スクリプトをボットとして扱い、拒否しています。ブラウザとしてなりすましを試してください。次のリンクでは、その方法を示す記事を紹介しています。
Jochen Ritzelが述べたように、ウィキペディアはボットをブロックします。
ただし、PHP api。「love」というタイトルのウィキペディアページを取得するには、ボットはブロックされません。
http://en.wikipedia.org/w/api.php?format=json&action=query&titles=love&prop=revisions&rvprop=content
一部のWebサイトでは、urllibが送信するヘッダーを読み取ることにより、サーバーの「不必要な」使用を回避するために、スクリプトからのアクセスをブロックします。ウィキペディアがこれを行う/行う理由を知りませんし、想像もできませんが、ヘッダーをスプーフィングしようとしましたか?
必要なサイトでブロックされていない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コードが返されます