MediaWiki APIを使ってWikipediaの情報を取得

  • 194
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

内容

MediaWiki APIを使うとWikipediaの情報をAPIを使って取得できる。
例えば次のようなことが可能。

  • 記事の内容を取得
  • 記事からのリンクや記事へのリンクの一覧を取得
  • 記事を含むカテゴリを取得
  • 記事で使われているテンプレートを取得
  • Wikipediaへのログイン・ログアウト
  • 記事の編集

フォーマットはXML, JSON, YAMLなどに対応している。

今回は主に記事に関する情報を取得する方法を紹介する。
より詳しい内容は公式ドキュメントを参照。

2014-12-19 追記: こちらでAPIサンドボックスが使えるようです。@yukichiさん、ありがとうございます。

注意

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=xmlaction=queryを指定している。

記事の基本情報を取得

パラメータ

prop=infoを用いる。

記事「エマ・ワトソン」の基本情報を取得

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=info&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3

<?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形式で取得 (なし)

記事「エマ・ワトソン」の本文を取得

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3&rvprop=content

<?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形式で取得

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=revisions&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3&rvprop=content&rvparse

<?xml version="1.0" encoding="UTF-8"?>
<api>
  <query>
    <pages>
      <page pageid="128948" ns="0" title="エマ・ワトソン">
        <revisions>
          <rev xml:space="preserve">&lt;table class="infobox" style="width:20em; text-align:left; font-size:90%"&gt;
&lt;tr&gt;
&lt;td colspan="2" style="text-align:center; padding-top:0.1em; background-color:#ed8; color:#000"&gt; &lt;small&gt;エマ・ワトソン&lt;/small&gt;&lt;br/&gt;&lt;big&gt;&lt;b&gt;Emma Watson&lt;/b&gt;&lt;/big&gt;
...
&lt;/p&gt;</rev>
        </revisions>
      </page>
    </pages>
  </query>
</api>

記事からリンクしている記事の一覧を取得

パラメータ

prop=linksを用いる。

結果が多くて一度に表示できない場合、レスポンスに含まれるplcontinueの属性値をリクエストURLのplcontinueパラメータに与えることで、次のページを取得できる。

パラメータ 意味
plnamespace 記事の名前空間 0(通常の記事), 1(ノート), ...
pllimit 結果数の上限 (整数)
plcontinue リクエストの継続情報 (レスポンスに含まれる属性値)

記事「エマ・ワトソン」からのリンクの一覧を取得

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=links&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3

<?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>

例(次のページ)

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=links&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3&plcontinue=128948|0|MTV%E3%83%A0%E3%83%BC%E3%83%93%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%AF%E3%83%BC%E3%83%89

<?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 リクエストの継続情報 (レスポンスに含まれる属性値)

記事「エマ・ワトソン」が属するカテゴリの一覧を取得

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=categories&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3

<?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 リクエストの継続情報 (レスポンスに含まれる属性値)

記事「エマ・ワトソン」で使用されているテンプレートの一覧を取得

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=templates&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3

<?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 結果数の上限 (整数)

記事「エマ・ワトソン」に含まれる画像の一覧を取得

http://ja.wikipedia.org/w/api.php?format=xml&action=query&prop=images&titles=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3

<?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 リクエストの継続情報 (レスポンスに含まれる属性値)

記事「エマ・ワトソン」へリンクしている記事の一覧を取得

https://ja.wikipedia.org/w/api.php?format=xml&action=query&list=backlinks&bltitle=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3

<?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 リダイレクト記事を含める (なし)

単語「エマ・ワトソン」を含む記事を検索

http://ja.wikipedia.org/w/api.php?format=xml&action=query&list=search&srsearch=%E3%82%A8%E3%83%9E%E3%83%BB%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3

<?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="| ふりがな = &lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;&#xA;...ンズ・チャイニーズ・シアター]]でサインを求められる&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt; ([[2007年]])]]&#xA;" size="35154" wordcount="1742" timestamp="2014-02-19T10:14:16Z" />
      <p ns="0" title="ハリー・ポッターと死の秘宝" snippet="...[[ダニエル・ラドクリフ]]&amp;lt;br&amp;gt;[[ルパート・グリント]]&amp;lt;br&amp;gt;[[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]]&amp;lt;br&amp;gt;[[レイフ・ファインズ]]&amp;lt;br&amp;gt;[[アラン・リックマン]]&amp;lt;br&amp;gt;&#xA;...ニエル・ラドクリフ]]&amp;lt;br /&amp;gt;[[ルパート・グリント]]&amp;lt;br /&amp;gt;[[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]]&amp;lt;br /&amp;gt;[[ヘレナ・ボナム=カーター]]&amp;lt;br /&amp;gt;[[ロビー・コル�&#xA;" size="75627" wordcount="2711" timestamp="2014-01-31T09:28:04Z" />
      ...
      <p ns="0" title="ハリー・ポッターと秘密の部屋" snippet="...ニエル・ラドクリフ]]&amp;lt;br /&amp;gt;[[ルパート・グリント]]&amp;lt;br /&amp;gt;[[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]]&amp;lt;br /&amp;gt;[[ケネス・ブラナー]]&amp;lt;br /&amp;gt;[[ジョン・クリーズ]]&amp;lt;br/&amp;gt;[&#xA;| colspan=&amp;quot;2&amp;quot; | [[ハーマイオニー・グレンジャー]] || [[&lt;span class='searchmatch'&gt;エマ・ワトソン&lt;/span&gt;]] || [[須藤祐実]]&#xA;" 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>