40

Pythonのurllibを使用してウィキペディアの記事を取得しようとしています。

f = urllib.urlopen("http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes")           
s = f.read()
f.close()

ただし、htmlページの代わりに、次の応答があります。エラー-ウィキメディア財団:

Request: GET http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes, from 192.35.17.11 via knsq1.knams.wikimedia.org (squid/2.6.STABLE21) to ()
Error: ERR_ACCESS_DENIED, errno [No Error] at Tue, 23 Sep 2008 09:09:08 GMT 

ウィキペディアは、標準のブラウザからではないリクエストをブロックしているようです。

誰かがこれを回避する方法を知っていますか?

4

10 に答える 10

50

ユーザー エージェントを変更するには、python std ライブラリのurllibを置き換えるurllib2を使用する必要があります。

からまっすぐ

import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]
infile = opener.open('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes')
page = infile.read()
于 2008-09-23T09:50:39.893 に答える
36

特定の問題に対する解決策ではありません。しかし、代わりに mwclient ライブラリ ( http://botwiki.sno.cc/wiki/Python:Mwclient ) を使用すると面白いかもしれません。それはとても簡単です。特に、記事のコンテンツを直接取得するため、html を解析する必要がなくなります。

私自身、2 つのプロジェクトで使用しましたが、非常にうまく機能します。

于 2008-09-23T09:49:44.763 に答える
15

ウィキペディアをだまそうとするのではなく、ウィキペディアの高レベルAPIの使用を検討する必要があります。

于 2009-06-11T11:14:20.137 に答える
3

ウィキペディアのコンテンツにアクセスしようとしている (ページ自体に関する特定の情報は必要ない) 場合は、API を使用する代わりに、次のようにウィキテキストを取得するために「action=raw」を指定して index.php を呼び出す必要があります。の:

'http://en.wikipedia.org/w/index.php? action=raw &title=Main_Page'

または、HTML コードが必要な場合は、次のように「action=render」を使用します。

'http://en.wikipedia.org/w/index.php? action=render &title=Main_Page'

「section=3」のように、コンテンツの一部だけを取得するセクションを定義することもできます。

その後、urllib2 モジュールを使用してアクセスできます (選択した回答で提案されているように)。ただし、ページ自体に関する情報 (リビジョンなど) が必要な場合は、上記のように mwclient を使用することをお勧めします。

さらに情報が必要な場合は、 MediaWiki の FAQを参照してください。

于 2010-11-12T19:16:55.070 に答える
2

requestsすごい!

を使用して html コンテンツを取得する方法は次のrequestsとおりです。

import requests
html = requests.get('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes').text

終わり!

于 2014-09-19T05:37:15.860 に答える
2

私がどのサイトでも使用する一般的な解決策は、Firefox を使用してページにアクセスし、Firebug などの拡張機能を使用して、Cookie を含む HTTP 要求のすべての詳細を記録することです。

プログラム (この場合は Python) で、必要に応じて Firefox で機能したものと同様の HTTP リクエストを送信するようにしてください。これには多くの場合、User-Agent、Referer、および Cookie フィールドの設定が含まれますが、他にもある場合があります。

于 2008-09-23T09:51:31.560 に答える
1

リクエストで送信するユーザー エージェント ヘッダーを次のように変更してみてください: User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008072820 Ubuntu/8.04 (hardy) Firefox/3.0.1 (Linux ミント)

于 2008-09-23T09:41:22.240 に答える
1

ブラウザのユーザー エージェントを偽装する必要はありません。空のユーザーエージェントではなく、すべてのユーザーエージェントが機能します。

于 2008-09-23T09:48:05.610 に答える
1

でページをリクエストすると?printable=yes、比較的クリーンな HTML ドキュメント全体が得られます。?action=render本文の HTML のみを提供します。同様に、MediaWiki アクション API を使用してページの解析を要求するとaction=parse、本文の HTML だけが得られますが、より細かい制御が必要な場合は、解析 API ヘルプ を参照してください。

レンダリングできるようにページの HTML だけが必要な場合は、ページのキャッシュされた HTML 表現を返す新しいRESTBase API を使用する方が高速で優れています。この場合、https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein .

2015 年 11 月現在、ユーザー エージェントを設定する必要はありませんが、設定することを強くお勧めします。また、ほぼすべてのウィキメディア ウィキが HTTPSを必要とするため、301 リダイレクトを避け、httpリクエストを作成してください。

于 2015-11-11T05:56:24.040 に答える
0
import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()

これは、ユーザー エージェントを変更しなくても機能するようです。「action=raw」がないとうまくいきません。

于 2011-01-25T15:02:18.943 に答える