pandas使ってwikipediaの表データを取得する
はじめに
特定ジャンルの用語などをまとめて取得するのに、wikipediaの「〜の一覧」が有用だったりする。
wikipedia:一覧の一覧
多くは、リスト形式で書かれていたりするが、中には表(テーブル)形式でまとめられているものもある。
いろんな取得方法が考えられるが、pythonのデータ解析支援ライブラリの「pandas」を使うと簡単に取得できたのでメモしておく。
注意
記事を大量にダウンロードするためにクローラを使わないで下さい。 強引なクローリングは、ウィキペディアが劇的に遅くなる原因となります。 ウィキペディアのデータベースから自動的にデータの収集がなされた場合、 システム管理者によってあなたのサイトからウィキペディアへのアクセスを 禁止する措置が取られることもあります。 またウィキメディア財団が法的措置を検討することもあります。
自己責任でお願いします。
表形式でまとめられている一覧ページの取得
「猫の品種の一覧」「犬の品種一覧」「ウサギの品種一覧」はそれぞれ写真付きで表形式一覧になっている。
DBpediaで見てみても、表形式のデータをきれいに取り出せてはいない模様。
以下で取得、ちょっとした置換処理、csv出力ができる。
import pandas # 猫の品種の一覧 url = 'https://ja.wikipedia.org/wiki/%E7%8C%AB%E3%81%AE%E5%93%81%E7%A8%AE%E3%81%AE%E4%B8%80%E8%A6%A7' df = pandas.io.html.read_html(url, encoding='utf-8', header=0) df[0]['種類'] = df[0]['種類'].replace({'(英語版)':'', '\(.+\)':'', '\[\d+\]':'', '^en\:':''}, regex=True) df[0].to_csv('neko.csv') # 犬の品種一覧 url = 'https://ja.wikipedia.org/wiki/%E7%8A%AC%E3%81%AE%E5%93%81%E7%A8%AE%E4%B8%80%E8%A6%A7' df = pandas.io.html.read_html(url, encoding='utf-8', header=[0,1]) df[0]['犬種'] = df[0]['犬種'].replace({'(英語版)':'', '\(.+\)':'', '\[\d+\]':'', '^en\:':''}, regex=True) df[0].to_csv('inu.csv') # ウサギの品種一覧 url = 'https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%B5%E3%82%AE%E3%81%AE%E5%93%81%E7%A8%AE%E4%B8%80%E8%A6%A7' df = pandas.io.html.read_html(url, encoding='utf-8', header=0) df[0]['和名'] = df[0]['和名'].replace({'(英語版)':'', '\(.+\)':'', '\[\d+\]':'', '^en\:':''}, regex=True) df[0]['英名'] = df[0]['英名'].replace({'\[\d+\]':'', '^en\:':''}, regex=True) df[0].to_csv('usagi.csv')
結果
$ python get_wiki.py $ ls get_wiki.py inu.csv neko.csv usagi.csv $ wc -l *.csv 759 inu.csv 91 neko.csv 130 usagi.csv 980 total $ head *.csv ==> inu.csv <== ,犬種,原産地,国際畜犬連盟[1],JKC登録,画像,Unnamed: 5_level_0 ,分類,番号,Unnamed: 2_level_1,Unnamed: 3_level_1,Unnamed: 4_level_1,Unnamed: 5_level_1 ,,,,,, 0,アーカンソー・ジャイアント・ブルドッグ,アメリカ合衆国,,,, 1,アーフェンピンシャー,ドイツ・フランス,2G-1,186,○, 2,アイスランド・シープドッグ,アイスランド,5G-3,289,, 3,アイディ,モロッコ,2G-2,247,, 4,アイリッシュ・ウォーター・スパニエル,アイルランド,8G-3,124,○, 5,アイリッシュ・ウルフハウンド,アイルランド,10G-2,160,○, 6,アイリッシュ・コリー,アイルランド,,,, ==> neko.csv <== ,種類,原産国,発生,身体のタイプ,毛足の長さ,毛色および模様,画像 0,アビシニアン,エチオピア,自然発生種,フォーリン,短毛,複色, 1,アメリカンカール,アメリカ合衆国,突然変異,セミフォーリン,短毛もしくは長毛,単色, 2,アメリカンショートヘア,アメリカ合衆国,自然発生種,セミコビー,短毛,All, 3,アメリカンボブテイル,アメリカ合衆国,自然発生種,ロング&サブスタンシャル,短毛もしくは長毛,All, 4,アメリカンワイヤーヘア,アメリカ合衆国,突然変異,セミコビー,Rex,All but colorpoint, 5,エキゾチックショートヘア,アメリカ合衆国,交配種,コビー,Short,All, 6,エジプシャンマウ,エジプト,自然発生種,セミフォーリン,短毛,ぶち, 7,オシキャット,アメリカ合衆国,交配種,セミフォーリン,短毛,Spotted, 8,オホースアズーレス,アメリカ合衆国,突然変異,フォーリン,Short,All, ==> usagi.csv <== ,和名,英名,原産,体重(kg),毛,耳,色,ARBA,BRC,画像 0,,Alaska,ドイツ,3.2-4.1,短,立,黒,No,Yes, 1,,Altex,アメリカ,5.9,短,立,Pointed White,No,No,--- 2,アメリカン,American Blue,アメリカ,4.1-5.4,短,立,青,Yes,No, 3,アメリカン,American Albino,アメリカ,4.1-5.4,短,立,白,Yes,No, 4,アメリカン・ファジー・ロップ,American Fuzzy Lop,アメリカ,1.4-1.8,長,垂,さまざま,Yes,No, 5,アメリカン・セーブル,American Sable,アメリカ,4.1-4.5,短,立,Sable,Yes,No, 6,,Argente Bleu,フランス,2.7,短,立,青,No,Yes,--- 7,,Argente Brun,フランス,2.7,短,立,茶,No,Yes,--- 8,,Argente Clair,フランス,2.7,短,立,Blue Silver,No,No,---
合わせて1000種類程度の品種名が取得できた。
wikipediaに限った話ではないので、お手軽に表形式の情報抽出するならかなりよさそう。
参考
- http://qiita.com/kitsuyui/items/4906bb457af4d0e2d0a5
- Wes McKinney, Pythonによるデータ分析入門 NumPy、pandasを使ったデータ処理(日本語訳), O'Reillyジャパン