Wikipedia のデータ取得方法について

ちょっと Wikipedia から情報を取得してコンテンツを作りたいと思ったので調べてみた。


ちょっとしたデータなら SimpleAPI という API で取得可能ですが、
取得出来るデータはかなり少なく、コンテンツを作る上では不向き。


で、何とか Wikipedia のデータをフルで取得出来ないかと考えている。


参考になったのは YARETOKO さんの記事


まとめるとポイントは 2 つあるようです。

  1. Wikipedia API でデータを取得
  2. 取得したデータを Text_Wiki_Mediawiki でパースする


まず、Wikipedia で用意されている(?) API を使って Wikipedia のデータを取得する。
ただし取得したデータは XML 表記かつ Wiki 表記となっているので、次に Text_Wiki_Mediawiki という PEAR のライブラリを使ってパースする。
簡単に説明するとそんな感じ。

1. Wikipedia API でデータを取得


Wikipedia API については 気軽に開発メモさんの記事 が詳しかった。


なんでも

http://ja.wikipedia.org/wiki/特別:データ書き出し/[キーワード]
(※もちろん日本語は URL エンコードして使います)

の URL を叩けば記事が XML で取得出来るとのこと。


大好きなナインティナインさんの記事を取得してみることにする。

http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97/%E3%83%8A%E3%82%A4%E3%83%B3%E3%83%86%E3%82%A3%E3%83%8A%E3%82%A4%E3%83%B3
(※ http://ja.wikipedia.org/wiki/特別:データ書き出し/ナインティナイン

こんな感じでしょうか。
で、ブラウザで確認すると記事が XML で確かに取れてる!


これを HTTP で取得するプログラムを書けば良い訳ですね。

サンプルプログラム


get_wiki_data.php

<?php

/**
 * Wikipedia からデータを取得するプログラム
 */

// Wikipedia API の URL
define('WIKIPEDIA_API_URL', 'http://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E3%83%87%E3%83%BC%E3%82%BF%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%97');

// 取得するタイトル
$search_title = 'ナインティナイン';

// ストリームコンテキストの生成
$stream_context = stream_context_create(array(
    'http' => array(
        'method' => 'GET',
        'header' => 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)',
    ),
));

// データの取得
$wiki_data = file_get_contents(WIKIPEDIA_API_URL. '/'. urlencode($search_title) , false, $stream_context);

// 結果出力
$wiki_data_encode = mb_detect_encoding($wiki_data);
header('Content-Type: text/html; charset='. $wiki_data_encode);
echo $wiki_data;

?>


データを取得するプログラムを作る上でのポイントが UserAgent を送信すること!


YARETOKO さんの記事 にもある通り、Wikipedia は UserAgent がリクエストに付与されていないと受け付けないらしい。ボット対策なのかな!?


で、ぎじゅつやさんの記事 を参考に作ってみたのが上。


早速実行してみる。



※出力結果をエディタで開いた


ちゃんと取得出来た!

2. 取得したデータを Text_Wiki_Mediawiki でパースする


続きはまた今度