HRR Co., Ltd.

技術的な記録を残していくことを目的としています。1次情報を大事にしています。

WikipediaのデータをMySQLに突っ込んだ話

はじめに

Wikipediaのデータを、VitualBoxで立ち上げたCentOS7のMySQLに入れてみました。
クローラーでのコンテンツの取得は禁じられているので、要注意です。

Wikipedia:データベースダウンロード - Wikipedia

クローラを用いてコンテンツを収集しないでください。

その代わり、Wikipediaのデータは圧縮されたXMLファイルで提供されています。
ここでは、そのデータを取り込む方法を書いていきます。

ただし、DBに格納されるデータは、MediaWiki形式で書かれた文字列なので、そのまま他に流用は厳しいです。
(ということがわかりました)

作業の流れ

上記の通り、このXMLのファイルを取り込むのですが、そのためのPHPファイルも提供されています。

Wikipedia:データベースダウンロード - Wikipedia

これらのXMLファイルをMySQLデータベースにインポートするには、MediaWiki配布物に含まれるimportDump.phpスクリプトを使用します。

$ bunzip2 -c pages-articles.xml.bz2 | php maintenance/importDump.php

コマンドを叩くだけなら簡単、と思いますが…これを動かすには、最終的には「LocalSettings.php」というファイルが必要です。
このファイルには、主にDBへの接続情報が書かれています。
接続情報なしにデータベースにはデータを入れることはできないで、当たり前といえばそれまでですが。

そしてその「LocalSettings.php」は、MediaWikiのインストールの過程で作成されるものです。
つまり…

  1. Wikipediaのシステムの元であるMediaWikiを仮想環境にインストールし、
  2. その上でWikipediaのデータをimportさせる。

必要があるということです。ちょっと遠回り。

Wikipediaのデータ

日本語のデータについては、こちらに入っています。 Index of /jawiki/ XML形式のファイルで、UTF-8です。 欲しいデータはWkipediaのごく一部のページでも、どこにあるかはわかりづらくなっています。

記事が入っているデータは、 Index of /jawiki/latest/

jawiki-latest-pages-articles.xml.bz2  

これになります。圧縮された状態で2.8GBくらいありますね。 分割されたデータもあり、それは

jawiki-latest-pages-articles1.xml.bz2  
jawiki-latest-pages-articles2.xml.bz2  
jawiki-latest-pages-articles3.xml.bz2  
...

のように連番になっています。

データを取り込むには?

Wikipedia:データベースダウンロード - Wikipedia

上にも書きましたが、下記コマンドを実行することを目指します。

$ bunzip2 -c pages-articles.xml.bz2 | php maintenance/importDump.php

データを取り込むまでに必要な準備

bzip2のインストール

人によっては入っていないと思いますので、まずはここから…。 CentOSならyumですぐにインストールできます。

$ sudo yum search bzip2
$ sudo yum install bzip2.x86_64
$ bzip2 -V
bzip2, a block-sorting file compressor.  Version 1.0.6, 6-Sept-2010.

   Copyright (C) 1996-2010 by Julian Seward.

   This program is free software; you can redistribute it and/or modify
   it under the terms set out in the LICENSE file, which is included
   in the bzip2-1.0.6 source distribution.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   LICENSE file for more details.

bzip2: I won't write compressed data to a terminal.
bzip2: For help, type: `bzip2 --help'.

解凍時は、こんなふうに使います。 特別難しいことはありません。

$ bunzip2 jawiki-latest-pages-articles.xml.bz2
記事のダウンロード
$ curl -O https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
importData.php のダウンロード

といいますか、MediaWikiソースコードのダウンロードです。
importData.phpは、MediaWikiソースコード内にある maintenance/importData.php です。
メンテナンスツールの一部なのでしょう。

今回はgit cloneで入手します。
MediaWiki · mediawiki

$ git clone https://phabricator.wikimedia.org/source/mediawiki.git
この時点で試しに実行

私が実行したときは、書かれたコマンドの準備ができたということで、(LocalSettings.phpはないものの)実行してみたのでした。
そうしましたら、

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml
Error: You are missing some external dependencies.
MediaWiki now also has some external dependencies that need to be installed
via composer or from a separate git repo. Please see
https://www.mediawiki.org/wiki/Download_from_Git#Fetch_external_libraries
for help on installing the required components.

私の場合「LocalSettings.php」がないという以外のエラーが出ました。
「いくつかの外部依存が足りていない。MediaWikiはいくつかの外部依存が必要で、それはcomposerで取ってくるか、gitから取ってきてくれ。詳しくはこのURLを見てね(超意訳)」
とのことなので、URL先を見てみる。

やり方はcomposerを使うか、gitで落としてきてもいいらしい。 composerがなかったので、私はgitで取得することにしました。

vendor/のダウンロード

MediaWikiの vendor/ ディレクトリをgit cloneしてくるだけなので楽です。

$ cd mediawiki/
$ git clone https://gerrit.wikimedia.org/r/p/mediawiki/vendor.git

そして改めて実行するわけですが、

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml
Error: Missing one or more required components of PHP.
You are missing a required extension to PHP that MediaWiki needs.
Please install:
 * xml <https://secure.php.net/xml>

Errorが出ましたが、私の場合はPHPのモジュールとしてのxmlがインストールされてませんでした。
人によって足りないものが異なるでしょうから、一度実行してみるのがよいと思います。

phpの足りない拡張機能をインストール

ここは他のサイトに説明を譲ります。

そして再実行

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml
A copy of your installation's LocalSettings.php
must exist and be readable in the source directory.
Use --conf to specify it.

ここで「LocalSettings.php」が必要だと言われます。
冒頭に書いたとおり、ここで諦めてMediaWikiをインストールして、その過程で生成しようと思います。

MediaWikiをインストール

ということで、まずはMediaWikiをブラウザから見れるように、ソースコードをドキュメントルートに持っていきます。
私の場合、ホームディレクトリに置いていたので移動します。

# cp -rp mediawiki/ /var/www/html/

下記にアクセスして、
http://localhost:8080/mediawiki/index.php

下記の画面が表示されれば、いったん成功になります。 f:id:hrroct:20181008234338p:plain

こんなエラーがCentOSで出る場合はSELinux関連の可能性があります。

[Sun Dec 16 23:21:25.810925 2018] [:error] [pid 12818] [client 10.0.2.2:60328] PHP Warning:  Unknown: failed to open stream: Permission denied in Unknown on line 0
[Sun Dec 16 23:21:25.810984 2018] [:error] [pid 12818] [client 10.0.2.2:60328] PHP Fatal error:  Unknown: Failed opening required '/var/www/html/mediawiki/index.php' (include_path='.:/usr/share/pear:/usr/share/php') in Unknown on line 0

MediaWikiの設定を行う

長い。道のりが長くて記事を分割したくなりますが、まだタイトルに行き着いていないのでがんばります。

f:id:hrroct:20181008234338p:plain

基本的にはポチポチクリックして進めていきます。

f:id:hrroct:20181230115232p:plain

ここは日本語そのままでよいでしょう。

f:id:hrroct:20181230115253p:plain

ここでDBの接続情報、ユーザーの情報を入れます。

f:id:hrroct:20181230115316p:plain

MySQLなので、ストレージエンジンの選択を行います。

f:id:hrroct:20181230115356p:plain

データ取得が目的なので、私の場合は何でもよかったです。

f:id:hrroct:20181230115426p:plain

飽きたので、とにかくインストールしてもらいます。

f:id:hrroct:20181230115546p:plain

これでインストールが完了します。

f:id:hrroct:20181230115624p:plain

ここでようやく、LocalSettings.phpをゲットできます。

ようやく実行

$ php mediawiki/maintenance/importDump.php < jawiki-latest-pages-articles.xml

したのですが…
私の環境では3日経ってもimportが終わりませんでした…
(メモリ8G、Core i5(第8世代)のノートPC)
Wikipediaのデータ量、恐るべし。

私のときは、下記エラーがたくさんできるので、設定しておいたほうが無難かも、です。

PHP Notice:  Undefined index: SERVER_NAME in /var/www/html/mediawiki/includes/GlobalFunctions.php on line 1374

もうひとつのやり方?

xml2sqlを使う手段もあるそうですが、どうやら非推奨のようです。

Data dumps/xml2sql - Meta

最後に

次はデータベースの中身の話ですが…
長くなるので、続きは別記事で。

以上でした!