うめすこんぶ

日々のプログラミングで残しておきたいメモ.何かの役に立てれば幸いです.

Wikipediaをスクレイピングするなら、ダンプデータを利用しよう

スポンサーリンク

Wikipediaのデータを使って有名人の出身地一覧を作りたいと思った。 しかし、Wikipediaは公式ではクローラによるスクレイピングを禁止しているとのこと。

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

その代わり、Wikipediaのダンプデータを入手することができるサイトがあるので、それを使う。 また、ダンプデータはそのままだと検索などで記事ゲットが困難なので、mysqlに入れる。

流れ

  1. mysqlの設定
  2. xml2sqlのインストール
  3. ダンプデータの入手
  4. データをmysqlに入れる
  5. 確認

結構手順があるけど、先人のブログのおかげでほとんど躓かずに済みました!

最初に注意

※ダンプデータ自体はmediawiki記法で書かれている。このままだとスクレイピングが難しいので、 htmlに変換します。そのへんはおいおい書いていきます。

※ダンプデータすべてダウンロードすると、2GB強あります。帯域制限食らってると時間かかる!

※mysqlがインストールされている前提です!

mysqlの設定

データをmysqlに入れる時、文字化けが発生Σ(´∀`;) みなさんはこうならないように、mysqlのエンコード設定をやっておきましょう。

データベースのデフォルト文字コードをUTF-8に変更する。

文字コードの確認はmysqlにログイン後、mysql -uroot以下で。

show variables like "chara%";
+--------------------------+--------------------------------------------------------+
| Variable_name            | Value                                                  |
+--------------------------+--------------------------------------------------------+
| character_set_client     | utf8                                                   |
| character_set_connection | utf8                                                   |
| character_set_database   | utf8                                                   |
| character_set_filesystem | binary                                                 |
| character_set_results    | utf8                                                   |
| character_set_server     | utf8                                                   |
| character_set_system     | utf8                                                   |
| character_sets_dir       | /usr/local/mysql-5.6.19-osx10.7-x86_64/share/charsets/ |
+--------------------------+--------------------------------------------------------+

確認すると、以下のように綺麗なutf8になっていればOK. 特に、character-set-serverとcharacter_set_connectionがutf8になっているかチェックしよう。 自分の場合、これらがlatinとなっていて文字化けした。

なっていなければ設定が必要。

以下、mysqlの設定ファイル(my.cnf)で文字コードをutf8に設定する。OSによって場所が違う。

自分のOSXでは、/usr/local/mysql/my.cnf。 CentOSでは、/etc/my.cnf

viコマンドで編集。管理者権限が必要なのでsudoする。

sudo vi /usr/local/mysql/my.cnf

以下のように設定。

`[mysqld]
...
character-set-server=utf8 #mysqldセクションの末尾に追加

[client]
default-character-set=utf8 #clientセクションを追加

設定後、再起動。

※OSXの場合、私はシステム環境設定からmysqlのサーバ再起動してますが、多分、 brewで入れた人はやり方が違うと思われます。

その後、再確認。

show variables like "chara%";

綺麗にutf8になっていたらOK!

参考: mysqlで文字コードをutf8にセットする - Qiita

xml2sqlのインストール

まず、Wikipediaのデータをmysqlにいれるために、xmlをsqlに変換するxml2sqlをインストール。

wget http://ftp.tietew.jp/pub/wikipedia/xml2sql-0.5.tar.gz
tar xvfz xml2sql-0.5.tar.gz
cd xml2sql-0.5
./configure
make
sudo make install

ダンプデータの入手

次に、データの入手。ページ本文含めての場合はjawiki-latest-pages-articles.xml.bz2。 これが2GB位ある。bzip2で解凍もしておく。

※注意として、4分割されたバージョンのファイルもあるけど、あとあと結合が面倒だったりする。

wget https://dumps.wikimedia.org/jawiki/latest/jawiki-latest-pages-articles.xml.bz2
bzip2 -d jawiki-latest-pages-articles.xml.bz2

データを以下コマンドで変換。 変換に16分かかった。

cat jawiki-latest-pages-articles.xml | sed -e 's/<dbname>.*<\/dbname>//' -e 's/<ns>.*<\/ns>//' -e 's/<parentid>.*<\/parentid>//' -e 's/<sha1>.*<\/sha1>//' -e 's/<model>.*<\/model>//' -e 's/<format>.*<\/format>//' -e 's/<redirect>.*<\/redirect>//' -e 's/<redirect.*\/>//' | xml2sql

データをmysqlに入れる

sqlのテーブル定義がmediawikiにあるので入手。

wget https://releases.wikimedia.org/mediawiki/1.26/mediawiki-1.26.2.tar.gz
tar xvfz mediawiki-1.26.2.tar.gz

mysqlがわでWikipedia用のデータベースを作成。

mysql -uroot

で入って、

create database mwiki;

でデータベースを作成。データベース名をmwikiとした。

まず、テーブル定義を入れる。

mysql -uroot mwiki < mediawiki-1.26.2/maintenance/tables.sql

続いて、データを入れる。これは、かなり時間がかかる。コーヒーを入れて、気長に待とう。

mysqlimport --fields-terminated-by="\t" --default-character-set=utf8 -uroot -dLp mwiki page.txt
mysqlimport --fields-terminated-by="\t" --default-character-set=utf8 -uroot -dLp mwiki text.txt
mysqlimport --fields-terminated-by="\t" --default-character-set=utf8 -uroot -dLp mwiki revision.txt

最後に

データが入っているか確認する。 mysqlに入って、以下のコマンドでとりあえず行数を見てみる。

show table status from mwiki;

mwikiのテーブル一覧と、各テーブルの行数が見れる。 さらに、pageが文字化けしていないか中身チェック。

select * from mwiki.page limit 2;

文字化けしてなければOK!

参考:

終わりに

今回は長かった。これなら特定のページだけhtmlダウンロードすればいいのでは?とも感じるけど、データが手元にあれば今後いろいろできて楽しいよね、 と自分に言い聞かせる。。。

次回、htmlへの変換を書きます!

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例

Rubyによるクローラー開発技法 巡回・解析機能の実装と21の運用例