Python で Wikipedia の記事を取得する
-
02-07-2019 - |
質問
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
Wikipedia は標準ブラウザからではないリクエストをブロックしているようです。
これを回避する方法を知っている人はいますか?
解決
を使用する必要があります。 URLlib2 それを置き換える URLライブラリ の中に Pythonの標準ライブラリ ユーザーエージェントを変更するため。
から直接 例
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()
他のヒント
特定の問題に対する解決策ではありません。ただし、mwclient ライブラリ (http://botwiki.sno.cc/wiki/Python:Mwclient) その代わり。そうすればずっと楽になるでしょう。特に、記事のコンテンツを直接取得できるため、HTML を解析する必要がなくなります。
私自身も 2 つのプロジェクトで使用しましたが、非常にうまく機能しました。
ウィキペディアを騙そうとするのではなく、ウィキペディアの 高レベルAPI.
Wikipedia コンテンツにアクセスしようとしている場合 (ページ自体に関する特定の情報は必要ありません)、API を使用する代わりに、次のように 'action=raw' を指定してindex.php を呼び出してウィキテキストを取得する必要があります。で:
'http://en.wikipedia.org/w/index.php?アクション=生&title=メインページ'
または、HTML コードが必要な場合は、次のように「action=render」を使用します。
'http://en.wikipedia.org/w/index.php?アクション=レンダリング&title=メインページ'
「section=3」のように、コンテンツの一部だけを取得するセクションを定義することもできます。
その後、urllib2 モジュールを使用してアクセスできます (選択した回答で示唆されているように)。ただし、ページ自体に関する情報 (リビジョンなど) が必要な場合は、上で提案したように mwclient を使用する方がよいでしょう。
参照する MediaWiki の FAQ さらに詳しい情報が必要な場合は。
私があらゆるサイトに対して使用する一般的な解決策は、Firefox を使用してページにアクセスし、Firebug などの拡張機能を使用して、Cookie を含む HTTP リクエストのすべての詳細を記録することです。
プログラム (この場合は Python) では、Firefox で動作したものと必要に応じて同様の HTTP リクエストを送信してみる必要があります。これには多くの場合、ユーザー エージェント、リファラー、および Cookie フィールドの設定が含まれますが、他にもある場合があります。
requests
すごい!
HTMLコンテンツを取得する方法は次のとおりです requests
:
import requests
html = requests.get('http://en.wikipedia.org/w/index.php?title=Albert_Einstein&printable=yes').text
終わり!
リクエストで送信しているユーザー エージェント ヘッダーを次のように変更してみてください。ユーザーエージェント:Mozilla/5.0 (X11;う;Linux i686;en-US;rv:1.9.0.1) Gecko/2008072820 Ubuntu/8.04 (丈夫) Firefox/3.0.1 (Linux Mint)
ブラウザーのユーザーエージェントになりすます必要はありません。空白のユーザー エージェントだけではなく、どのユーザー エージェントでも機能します。
import urllib
s = urllib.urlopen('http://en.wikipedia.org/w/index.php?action=raw&title=Albert_Einstein').read()
これは、ユーザーエージェントを変更しなくても機能するようです。「action=raw」がないと機能しません。
ページをリクエストする ?printable=yes
比較的きれいな HTML ドキュメント全体が得られます。 ?action=render
本文の HTML だけが表示されます。MediaWiki アクション API を介してページを解析するようリクエストします。 action=parse
同様に本文の HTML のみを提供しますが、より詳細な制御が必要な場合に適しています。 解析APIのヘルプを参照してください.
ページの HTML をレンダリングできるようにしたいだけの場合は、新しいメソッドを使用する方が速くて良いです。 RESTベース ページのキャッシュされた HTML 表現を返す API。この場合、 https://en.wikipedia.org/api/rest_v1/page/html/Albert_Einstein.
2015 年 11 月現在、ユーザーエージェントを設定する必要はありませんが、 それは強く奨励されています. 。また、ほぼすべてのウィキメディア ウィキ HTTPS が必要, したがって、301 リダイレクトを避けて http を作成します。s リクエスト。