javascriptでウィキペディアの情報を取得する



ウィキペディアの情報が取得できる javascript用のライブラリ「WikiJs」の紹介です。

 ウィキペディアは PHPで作られた " MediaWiki " という オープンソースのWikiパッケージを使って構築されており、API用の URL + query_string を叩けば情報が取得できますが、パラメーターが細かいのと、取得した後の テキストの加工が必要になります。

そんな ウィキペディアの API を 使いやすくしたラッパーライブラリが 「WikiJs」です。

WikiJs で出来ること

- wikipedia ( WikiMedia も含む) の 情報を取得できる ( 部分的にも可 )

const wiki = require("wikijs").default;

// これだけでページの概要が取得できます
wiki({ apiUrl: 'http://ja.wikipedia.org/w/api.php' })
    .page("モンキー・D・ルフィ")
    .then(page => page.summary())
    .then(console.log);

/* output:
 モンキー・D・ルフィ(モンキー・ディー・ルフィ、Monkey D. Luffy)は、
尾田栄一郎の漫画『ONE PIECE』に登場する架空の人物であり、同作品の主人公。
*/


WikiJs のインストール

 wikijsのインストールには ' npm ' 又は ' yarn ' コマンドを使ってインストールします。

# npm
npm i wikijs --save
# yarn
yarn add wikijs


webpack を通して使う場合  

 Webページで WikiJS を使う場合、webpackを通してビルドをする必要があります。webpack用のコンフィグファイル、 ' webpack.config.js  ' 内に下記のコードを追加します。

externals: {
  "isomorphic-fetch": "fetch"
}


WikiJs で記事の情報を取得する 

 WikiJs の使い方は簡単で、' page ' メソッドに、取得したい記事の文字列を入れれば ' Promise ' でコールバック処理が書くことが可能で、記事内の各種情報を取り出すことが出来ます。

import wiki from 'wikijs';

let keyword = 'Batman'; // 取得するページ

wiki.page(keyword)
	.then(page => page.info()) // バットマンのページの infoを取得
    // .then(page => page.summary()) // ページの概要を取得する場合
	.then(console.log); // Bruce Wayne

// commonJS * node.jsの場合
const wiki = require('wikijs').default;

wiki().page(keyword)
	.then(page => page.info())
	.then(console.log); // Bruce Wayne

取得出来る情報ページ情報
html :  ページ全体のHTML
content : ページのテキスト
summary : ページの概要
- images : ページの画像のURL
references : 出典のURL
links : 出典のテキスト
categories : 記事の紐付けされているカテゴリ
info : ページ情報
- rawImages : ページに使われる画像情報
mainImage : ページに使われている画像のURL
langlinks : 言語用のリンク
rawInfo : ページ全体のテキスト( wiki構文 )

 

wikipedia 日本語版の情報を取得する

 WikiJSはデフォルトでは、英語版の Wikipediaの記事を取得するようにされているので、日本語を含む他の言語のページから取得する場合、' apiUrl ' オプションに API 取得用のURL を渡す必要があります。

* 日本語の場合 : ' http://ja.wikipedia.org/w/api.php

import wiki from 'wikijs';
// const wiki = require('wikijs').default; // node.js

let word = "マリオ_(ゲームキャラクター)";

// apiUrl オプションが無い場合、日本語のwikipediaから情報を取得できません
wiki({ apiUrl: 'http://ja.wikipedia.org/w/api.php' })
    .page(word)
    .then(page => page.summary())
    // .then(page => page.images())

/* => マリオ(Mario)は、任天堂が開発・発売しているコンピューターゲームに登場する架空の人物。
本名は、マリオ・マリオ(英:Mario Mario)
*/

 また、下記のページのスクリーンショットのように、記事URLのタイトルが正確でないと、記事情報を取得出来ないので注意してください。

マリオの場合、" マリオ_( ゲームキャラクター) "  


search メソッドと組み合わせる

wikipediaの場合、1つのタイトルに、複数の別名が紐付けされている記事も存在します。

" アレクサンドロス3世 " のページを例にすると、1つのページに合計4つのタイトルが紐付けされています。

アレキサンドロス3世に紐付けされている別名
1. アレキサンダー大王
2. アレクサンドロス3世
3. アレクサンドロス大王
4. アレクサンダー大王

 WikiJsを使って、記事ページ情報を取得するには タイトルが重複しないユニークである必要がありますが、' search ' メソッドを使うと 検索ワードに紐付いたワード( あいまい検索 )が配列で取得できます。

const wiki = require("wikijs").default;

let word = 'アレクサンダー大王';
// let word = アレキサンダー大王
// let word = アレクサンダー大王
// let word = アレクサンドロス3世
// let word = アレクサンドロス大王

wiki({ apiUrl: "http://ja.wikipedia.org/w/api.php" })
  .search(word)
  .then(data => {
    // resultsオブジェクトで検索結果が取得できます
    console.log(data.results);
  });

/* output 上記のキーワードを使って検索しても同じ結果が出ます
// =>
[ 'アレクサンドロス3世',
  'アレクサンダー大王 -天上の王国-',
  'アレクサンダー大王の戦い',
  '紀元前331年',
  'ローマの素材',
  .....
*/


 実際に search  メソッドを使うような場面は page メソッドとセットで使うと思われます。

const wiki = require("wikijs").default;

// アレクサンドロス3世
let word = "アレキサンダー大王";

let wikipedia = wiki({ apiUrl: "http://ja.wikipedia.org/w/api.php" });

// アレキサンダー大王を元にして記事の検索
wikipedia.search(word).then(data => {
  wikipedia
    // 検索結果の一番最初の要素を取得
    .page(data.results[0])
    // アレキサンドロス3世のページ情報が返される
    .then(page => page.summary())
    .then(console.log);
});


Summary

以上が WikiJS の紹介でした。ブログや固有名詞が多いページで hoverイベントとして部分的に使うと、ページの滞在時間が増やせそうなライブラリです。

GitHub : dijs/wiki

 

この記事のカテゴリ
プログラミング

この記事に付けられているタグ