はじめに
内容
MediaWiki APIを使うとWikipediaの情報をAPIを使って取得できる。
例えば次のようなことが可能。
- 記事の内容を取得
- 記事からのリンクや記事へのリンクの一覧を取得
- 記事を含むカテゴリを取得
- 記事で使われているテンプレートを取得
- Wikipediaへのログイン・ログアウト
- 記事の編集
フォーマットはXML, JSON, YAMLなどに対応している。
今回は主に記事に関する情報を取得する方法を紹介する。
より詳しい内容は公式ドキュメントを参照。
2014-12-19 追記: ~~こちら~~でAPIサンドボックスが使えるようです。 @yukichi さん、ありがとうございます。
2018-07-14 追記: APIサンドボックスのURLが変更されたようです。 @mizoe@github さん、ありがとうございます。
注意
Wikipediaの提供するMediaWiki APIにはリクエスト数/時間などの制限はないが、大量のリクエストを送ってサーバに負担をかけてはいけない。
例えば次のことに気をつける。
- レスポンスを受け取ってから次のリクエストを送る
- 繰り返し操作はなるべく1つのリクエストにまとめる
- User-Agent偽装はしない
詳しくはこちらを参照。
API仕様
URLフォーマット
Wikipedia日本語版の場合、URLは次のようになる。
http://ja.wikipedia.org/w/api.php?パラメータ1=値1&パラメータ2=値2&...&パラメータn=値n
パラメータの種類
パラメータには全てのAPIリクエストで使用できる汎用パラメータと、指定したactionごとに固有のパラメータがある。
汎用パラメータ
フォーマットやアクションを指定する。
パラメータ | 意味 | 値 |
---|---|---|
format | 出力フォーマット | json, xml, yaml, ... |
action | 操作 | query, login, logout, edit, ... |
アクション固有パラメータ
汎用パラメータにaction=query
を指定した場合、取得したい情報の種類に応じて次のようなパラメータを指定する。
パラメータ | 意味 | 値 |
---|---|---|
prop | 記事の各構成要素を取得 | info, revisions, categories, links, templates, images, ... |
list | 記事などのリストを取得 | backlinks, random, search, ... |
記事の指定方法
prop=記事の構成要素
を用いる場合、次のいずれかのパラメータを用いて記事を指定する。
パラメータ | 意味 | 値 |
---|---|---|
titles | 記事タイトル | (URLエンコードされた文字列) |
pageids | 記事ID | (整数) |
使用例
以下では目的ごとにAPIの使用法を説明する。
汎用パラメータはformat=xml
とaction=query
を指定している。
記事の基本情報を取得
パラメータ
prop=info
を用いる。
例
記事「エマ・ワトソン」の基本情報を取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン" contentmodel="wikitext" pagelanguage="ja" touched="2014-04-22T16:31:02Z" lastrevid="50754976" counter="" length="35154" />
</pages>
</query>
</api>
記事本文を取得
パラメータ
prop=revisions
を用いる。
この操作は本来記事のリビジョンを取得するためのものなので、本文を取得したい場合はさらにrvprop=content
を指定する。
デフォルトではMediaWiki記法で書かれた本文が返る。
本文をHTML形式で取得したければrvparse
オプションを指定する。
タグなどがエスケープされた形式で返るので、元に戻す処理が必要。
パラメータ | 意味 | 値 |
---|---|---|
rvprop | 取得する要素 | ids, timestamp, content, ... |
rvparse | 本文をHTML形式で取得 | (なし) |
例
記事「エマ・ワトソン」の本文を取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン">
<revisions>
<rev contentformat="text/x-wiki" contentmodel="wikitext" xml:space="preserve">{{ActorActress
| 芸名 = Emma Watson
| ふりがな = エマ・ワトソン
...
{{Link FA|zh}}</rev>
</revisions>
</page>
</pages>
</query>
</api>
例(HTML)
記事「エマ・ワトソン」の本文を(エスケープされた)HTML形式で取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン">
<revisions>
<rev xml:space="preserve"><table class="infobox" style="width:20em; text-align:left; font-size:90%">
<tr>
<td colspan="2" style="text-align:center; padding-top:0.1em; background-color:#ed8; color:#000"> <small>エマ・ワトソン</small><br/><big><b>Emma Watson</b></big>
...
</p></rev>
</revisions>
</page>
</pages>
</query>
</api>
記事からリンクしている記事の一覧を取得
パラメータ
prop=links
を用いる。
結果が多くて一度に表示できない場合、レスポンスに含まれるplcontinueの属性値をリクエストURLのplcontinue
パラメータに与えることで、次のページを取得できる。
パラメータ | 意味 | 値 |
---|---|---|
plnamespace | 記事の名前空間 | 0(通常の記事), 1(ノート), ... |
pllimit | 結果数の上限 | (整数) |
plcontinue | リクエストの継続情報 | (レスポンスに含まれる属性値) |
例
記事「エマ・ワトソン」からのリンクの一覧を取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query-continue>
<links plcontinue="128948|0|MTVムービー・アワード" />
</query-continue>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン">
<links>
<pl ns="0" title="1990年" />
<pl ns="0" title="2001年" />
...
<pl ns="0" title="IMDB" />
</links>
</page>
</pages>
</query>
</api>
例(次のページ)
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query-continue>
<links plcontinue="128948|0|ウォールフラワー_(映画)" />
</query-continue>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン">
<links>
<pl ns="0" title="MTVムービー・アワード" />
<pl ns="0" title="Noah" />
...
<pl ns="0" title="インターネット・ムービー・データベース" />
</links>
</page>
</pages>
</query>
</api>
記事が属するカテゴリの一覧を取得
パラメータ
prop=categories
を用いる。詳細はprop=links
と同様。
パラメータ | 意味 | 値 |
---|---|---|
cllimit | 結果数の上限 | (整数) |
clcontinue | リクエストの継続情報 | (レスポンスに含まれる属性値) |
例
記事「エマ・ワトソン」が属するカテゴリの一覧を取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン">
<categories>
<cl ns="14" title="Category:1990年生" />
<cl ns="14" title="Category:イングランドの俳優" />
...
<cl ns="14" title="Category:存命人物" />
</categories>
</page>
</pages>
</query>
</api>
記事で使用されているテンプレートの一覧を取得
パラメータ
prop=templates
を用いる。詳細はprop=links
と同様。
パラメータ | 意味 | 値 |
---|---|---|
tllimit | 結果数の上限 | (整数) |
tlcontinue | リクエストの継続情報 | (レスポンスに含まれる属性値) |
例
記事「エマ・ワトソン」で使用されているテンプレートの一覧を取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query-continue>
<templates tlcontinue="128948|10|Cite_press_release" />
</query-continue>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン">
<templates>
<tl ns="10" title="Template:!" />
<tl ns="10" title="Template:Accessdate" />
...
<tl ns="10" title="Template:Cite news" />
</templates>
</page>
</pages>
</query>
</api>
記事に含まれる画像の一覧を取得
パラメータ
prop=images
を用いる。詳細はprop=links
と同様。
パラメータ | 意味 | 値 |
---|---|---|
imlimit | 結果数の上限 | (整数) |
例
記事「エマ・ワトソン」に含まれる画像の一覧を取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query>
<pages>
<page pageid="128948" ns="0" title="エマ・ワトソン">
<images>
<im ns="6" title="ファイル:Commons-logo.svg" />
<im ns="6" title="ファイル:Emma Watson 2012.jpg" />
...
<im ns="6" title="ファイル:Wikiquote-logo.svg" />
</images>
</page>
</pages>
</query>
</api>
記事へリンクしている記事の一覧を取得
パラメータ
list=backlinks
を用いる。
パラメータ | 意味 | 値 |
---|---|---|
bltitle | 記事タイトル | (URLエンコードされた文字列) |
blnamespace | 記事の名前空間 | 0(通常の記事), 1(ノート), ... |
blfilterredir | リダイレクト記事の扱い | all(全ての記事を取得), redirects(リダイレクト記事のみ取得), nonredirects(リダイレクト記事以外のみ取得) |
bllimit | 取得するリンク数の上限 | (整数) |
blredirect | リダイレクト経由でリンクしている記事を含める | (なし) |
blcontinue | リクエストの継続情報 | (レスポンスに含まれる属性値) |
例
記事「エマ・ワトソン」へリンクしている記事の一覧を取得
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query-continue>
<backlinks blcontinue="0|エマ・ワトソン|128963" />
</query-continue>
<query>
<backlinks>
<bl pageid="4870" ns="0" title="4月15日" />
<bl pageid="5694" ns="0" title="ハリー・ポッターシリーズ" />
...
<bl pageid="106220" ns="0" title="エマ" />
</backlinks>
</query>
</api>
単語を含む記事を検索
パラメータ
list=search
を用いる。
パラメータ | 意味 | 値 |
---|---|---|
srsearch | 検索語 | (URLエンコードされた文字列) |
srlimit | 結果数の上限 | (整数) |
srnamespace | 記事の名前空間 | 0(通常の記事), 1(ノート), ... |
sroffset | 結果のオフセット | (整数) |
srprop | 結果に含める情報 | size(記事サイズ), wordcount(記事の単語数), timestamp(記事の最終更新日時), score(検索エンジンのスコア), snippet(記事中の検索語を含む部分), ... |
srredirects | リダイレクト記事を含める | (なし) |
例
単語「エマ・ワトソン」を含む記事を検索
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query-continue>
<search sroffset="10" />
</query-continue>
<query>
<searchinfo totalhits="62" />
<search>
<p ns="0" title="エマ・ワトソン" snippet="| ふりがな = <span class='searchmatch'>エマ・ワトソン</span>
...ンズ・チャイニーズ・シアター]]でサインを求められる<span class='searchmatch'>エマ・ワトソン</span> ([[2007年]])]]
" size="35154" wordcount="1742" timestamp="2014-02-19T10:14:16Z" />
<p ns="0" title="ハリー・ポッターと死の秘宝" snippet="...[[ダニエル・ラドクリフ]]&lt;br&gt;[[ルパート・グリント]]&lt;br&gt;[[<span class='searchmatch'>エマ・ワトソン</span>]]&lt;br&gt;[[レイフ・ファインズ]]&lt;br&gt;[[アラン・リックマン]]&lt;br&gt;
...ニエル・ラドクリフ]]&lt;br /&gt;[[ルパート・グリント]]&lt;br /&gt;[[<span class='searchmatch'>エマ・ワトソン</span>]]&lt;br /&gt;[[ヘレナ・ボナム=カーター]]&lt;br /&gt;[[ロビー・コル�
" size="75627" wordcount="2711" timestamp="2014-01-31T09:28:04Z" />
...
<p ns="0" title="ハリー・ポッターと秘密の部屋" snippet="...ニエル・ラドクリフ]]&lt;br /&gt;[[ルパート・グリント]]&lt;br /&gt;[[<span class='searchmatch'>エマ・ワトソン</span>]]&lt;br /&gt;[[ケネス・ブラナー]]&lt;br /&gt;[[ジョン・クリーズ]]&lt;br/&gt;[
| colspan=&quot;2&quot; | [[ハーマイオニー・グレンジャー]] || [[<span class='searchmatch'>エマ・ワトソン</span>]] || [[須藤祐実]]
" size="31224" wordcount="488" timestamp="2014-04-02T09:56:07Z" />
</search>
</query>
</api>
記事をランダムに取得
パラメータ
list=random
を用いる。
パラメータ | 意味 | 値 |
---|---|---|
rnlimit | 結果数の上限 | (整数) |
rnnamespace | 記事の名前空間 | 0(通常の記事), 1(ノート), ... |
rnredirect | リダイレクト記事のみを表示 | (なし) |
例
ランダムに10件の通常記事を取得
http://ja.wikipedia.org/w/api.php?format=xml&action=query&list=random&rnnamespace=0&rnlimit=10
<?xml version="1.0" encoding="UTF-8"?>
<api>
<query>
<random>
<page id="1928065" ns="0" title="小柴大始" />
<page id="240784" ns="0" title="ジェイムス・ミッシェル" />
...
<page id="350128" ns="0" title="OH!相撲" />
</random>
</query>
</api>