ウィキペディアの情報が取得できる javascript用のライブラリ「WikiJs」の紹介です。
ウィキペディアは PHPで作られた " MediaWiki " という オープンソースのWikiパッケージを使って構築されており、API用の URL + query_string を叩けば情報が取得できますが、パラメーターが細かいのと、取得した後の テキストの加工が必要になります。
そんな ウィキペディアの API を 使いやすくしたラッパーライブラリが 「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のインストールには ' npm
' 又は ' yarn
' コマンドを使ってインストールします。
# npm
npm i wikijs --save
# yarn
yarn add wikijs
Webページで WikiJS を使う場合、webpackを通してビルドをする必要があります。webpack用のコンフィグファイル、 ' webpack.config.js
' 内に下記のコードを追加します。
externals: {
"isomorphic-fetch": "fetch"
}
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構文 )
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);
});
以上が WikiJS の紹介でした。ブログや固有名詞が多いページで hoverイベントとして部分的に使うと、ページの滞在時間が増やせそうなライブラリです。
GitHub : dijs/wiki