web-dev-qa-db-ja.com

Wikipediaの記事をPython

Pythonのurllibを使用してWikipediaの記事を取得しようとします。

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 

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

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

40
dkp

ユーザーエージェントを変更するには、 python std libraryrllib の上位シードである rllib2 を使用する必要があります。

から直接

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()
51
Florian Bösch

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

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

36
Hannes Ovrén

ウィキペディアをだまそうとするのではなく、それらの High-Level API の使用を検討する必要があります。

15
sligocki

Wikipediaのコンテンツにアクセスしようとしている場合(ページ自体に関する特定の情報は必要ありません)、APIを使用する代わりに、次のようにWikitextを取得するために '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 を参照してください。

3
mathias

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

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

2
Liam

requests は素晴らしいです!

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

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

できた!

2
Aziz Alto

リクエストで送信するユーザーエージェントヘッダーを次のように変更してみてください: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 Mint)

1
Vasil

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

1
Gurch
import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()

これは、ユーザーエージェントを変更しなくても機能するようです。 「action = raw」がなければ、それは私のために機能しません。

0

?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月の時点では、ユーザーエージェントを設定する必要はありませんが、 強くお勧めします です。また、ほぼすべてのWikimedia wiki HTTPSが必要 なので、301リダイレクトを避け、httpsリクエストを実行します。

0
skierpage