Pythonでスクレイピング(データ取得)


今回はwikipediaから映画の興行収入を取得しようと思う。
scrapingの準備編はこちら

とりあえず、ソースコードと結果は下記となる。

from urllib.request import urlopen
from bs4 import BeautifulSoup

# 取得するページ
html = urlopen('https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%AD%B4%E4%BB%A3%E8%88%88%E8%A1%8C%E5%8F%8E%E5%85%A5%E4%B8%8A%E4%BD%8D%E3%81%AE%E6%98%A0%E7%94%BB%E4%B8%80%E8%A6%A7')
bs = BeautifulSoup(html)

get_info = bs.select('table.wikitable tbody tr')
movies = []

for index, info in enumerate(get_info):
    for info_td in info.select('td'):
        if index <= 100:
            movies.append(info_td.text)
        else:
            break

print(movies)

結果

['千と千尋の神隠し\n', '東宝\n', '2001\n', '\n', '308.0\n', 'タイタニック\n', '20世紀FOX\n', '1997\n', '160.0\n', '262.0\n', 'アナと雪の女王[† 1]\n', 'ディズニー\n', '2014\n', '\n', '255.0\n', '君の名 は。\n', '東宝\n', '2016\n', '\n', '250.3\n', 'ハリー・ポッターと賢者の石\n', 'ワーナー\n', '2001\n', '\n', '203.0\n', 'ハウルの動く城\n', '東宝\n', '2004\n', '\n', '196.0\n', 'もののけ姫\n', '東宝\n', '1997\n', '113.0\n', '193.0\n', '踊る大捜査線 THE MOVIE 2 レインボーブリッジを封鎖せよ![† 2]\n', '東宝\n', '2003\n', '\n', '173.5\n', 'ハリー・ポッターと秘密の部屋[† 3]\n', 'ワーナー\n', '2002\n', '\n', '173.0\n', 'アバター\n', '20世紀FOX\n', '2009\n', '\n', '156.0\n', '崖の上のポニョ\n', '東宝\n', '2008\n', '\n', '155.0\n', 'ラスト サムライ\n', 'ワーナー\n', '2003\n', '\n', '137.0\n', 'E.T.[† 4][ † 5]\n', 'CIC\n', '1982\n', '96.2\n', '135.0\n', 'アルマゲドン\n', 'ディズニー\n', '1998\n', '83.5\n', '135.0\n', 'ハリー・ポッターとアズカバンの囚人\n', 'ワーナー\n', '2004\n', '\n', '135.0\n', 'アナ と雪の女王2\n', 'ディズニー\n', '2019\n', '\n', '133.5\n', 'ボヘミアン・ラプソディ\n', '20世紀FOX\n', '2018\n', '\n', '131.0\n', 'ジュラシック・パーク[† 6]\n', 'UIP\n', '1993\n', '83.0\n', '128.5\n', 'スター・ウォーズ エピソード1/ファントム・メナス\n', '20世紀FOX\n', '1999\n', '78.0\n', '127.0\n', '美女と野獣\n', 'ディズニー\n', '2017\n', '\n', '124.0\n', 'アラジン\n', 'ディズニー\n', '2019\n', '\n', '121.6\n', '風立ちぬ\n', '東宝\n', '2013\n', '\n', '120.2\n', 'アリス・イン・ワンダーランド\n', 'デ ィズニー\n', '2010\n', '\n', '118.0\n', 'スター・ウォーズ/フォースの覚醒\n', 'ディズニー\n', '2015\n', '\n', '116.3\n', '南極物語\n', 'ヘラルド・東宝\n', '1983\n', '59.0\n', '110.0\n', 'マトリックス・リローデッド\n', 'ワーナー\n', '2003\n', '\n', '110.0\n', 'ファインディング・ニモ\n', 'ディズニー\n', '2003\n', '\n', '110.0\n', 'ハリー・ポッターと炎のゴブレット\n', 'ワーナー\n', '2005\n', '\n', '110.0\n', 'パイレーツ・オブ・カリビアン/ワールド・エンド\n', 'ディズニー\n', '2007\n', '\n', '109.0\n', 'トイ・ストーリー3\n', 'ディズニー\n', '2010\n', '\n', '108.0\n', 'インデペンデンス・デイ\n', '20世紀FOX\n', '1996\n', '66.5\n', '106.5\n', 'ロード・オブ・ザ・リング/王の帰還\n', 'ヘラルド・松竹\n', '2004\n', '\n', '103.2\n', '踊る大捜査線 THE MOVIE\n', '東宝\n', '1998\n', '53.0\n', '101.0\n', 'トイ・ストーリー4\n', 'ディズニー\n', '2019\n', '\n', '100.9\n', 'パイレーツ・オブ・カリビアン/デッドマンズ・チェスト\n', 'ディズニー\n', '2006\n', '\n', '100.2\n', '子猫物語\n', '東宝\n', '1986\n', '54.0\n', '98.0\n', 'ミッション:インポッシブル2\n', 'UIP\n', '2000\n', '\n', '97.0\n', 'ハリー・ポッターと死の秘宝 PART2\n', 'ワーナー\n', '2011\n', '\n', '96.7\n', 'A.I.[† 7]\n', 'ワーナー\n', '2001\n', '\n', '96.6\n', 'ジュラシック・ワールド\n', '東宝東和\n', '2015\n', '\n', '95.3\n', 'バック・トゥ・ザ・フューチャー PART2\n', 'UIP\n', '1989\n', '55.3\n', '95.0\n', 'ロスト・ワールド/ジュラシック・パーク\n', 'UIP\n', '1997\n', '58.0\n', '95.0\n', 'ハリー・ポッターと不死鳥の騎士団\n', 'ワーナー\n', '2007\n', '\n', '94.0\n', 'モンスターズ・インク\n', 'ディズニー\n', '2002\n', '\n', '93.7\n', '名探偵コナン 紺青の 拳\n', '東宝\n', '2019\n', '\n', '93.7\n', 'スター・ウォーズ エピソード2/クローンの攻撃\n', '20世紀FOX\n', '2002\n', '\n', '93.5\n', '劇場版 コード・ブルー -ドクターヘリ緊急救命-\n', '東宝\n', '2018\n', '\n', '93.2\n', '借りぐらしのアリエッティ\n', '東宝\n', '2010\n', '\n', '92.5\n', '天と地と[† 8]\n', '東映\n', '1990\n', '50.5\n', '92.0\n', 'ベイマックス\n', 'ディズニー\n', '2014\n', '\n', '91.8\n', '名探偵コナン ゼロの執行人\n', '東宝\n', '2018\n', '\n', '91.8\n', 'スター・ウォーズ エピソード3/シ スの復讐\n', '20世紀FOX\n', '2005\n', '\n', '91.7\n', 'ロード・オブ・ザ・リング\n', 'ヘラルド・松竹\n', '2002\n', '\n', '90.7\n', 'ダ・ヴィンチ・コード\n', 'ソニーPE\n', '2006\n', '\n', '90.5\n', 'ジョ ーズ[† 9]\n', 'CIC\n', '1975\n', '50.2\n', '90.0\n', 'モンスターズ・ユニバーシティ\n', 'ディズニー\n', '2013\n', '\n', '89.6\n', 'パイレーツ・オブ・カリビアン/生命の泉\n', 'ディズニー\n', '2011\n', '\n', '88.7\n', 'ターミネーター2\n', '東宝東和\n', '1991\n', '57.5\n', '87.9\n', '永遠の0\n', '東宝\n', '2013\n', '\n', '87.6\n', 'マトリックス\n', 'ワーナー\n', '1999\n', '50.0\n', '87.0\n', 'ROOKIES -卒 業-\n', '東宝\n', '2009\n', '\n', '85.5\n', '世界の中心で、愛をさけぶ\n', '東宝\n', '2004\n', '\n', '85.0\n', 'STAND BY ME ドラえもん\n', '東宝\n', '2014\n', '\n', '83.8\n', 'シン・ゴジラ\n', '東宝\n', '2016\n', '\n', '82.5\n', '敦煌\n', '東宝\n', '1988\n', '45.0\n', '82.0\n', 'バック・トゥ・ザ・フューチャー PART3\n', 'UIP\n', '1990\n', '47.5\n', '82.0\n', 'ターミネーター3\n', '東宝東和\n', '2003\n', '\n', '82.0\n', 'HERO\n', '東宝\n', '2007\n', '\n', '81.5\n', 'ディープ・インパクト\n', 'UIP\n', '1998\n', '47.2\n', '81.0\n', 'ジュラシック・ワールド/炎の王国\n', '東宝東和\n', '2018\n', '\n', '80.6\n', 'THE LAST MESSAGE 海猿\n', '東宝\n', '2010\n', '\n', '80.4\n', 'ハリー・ポッターと謎のプリンス\n', 'ワーナー\n', '2009\n', '\n', '80.0\n', 'ロード・オブ・ザ・リング/二つの塔\n', 'ヘラルド・松竹\n', '2003\n', '\n', '79.0\n', '映画 妖怪ウォッチ 誕生の秘密だニャン!\n', '東宝\n', '2014\n', '\n', '78.0\n', '花より男子F\n', '東宝\n', '2008\n', '\n', '77.5\n', 'ゲド戦記[† 10]\n', '東宝\n', '2006\n', '\n', '76.9\n', 'シックス・センス\n', '東宝東和\n', '1999\n', '45.0\n', '76.8\n', 'ズートピア\n', 'ディズ ニー\n', '2016\n', '\n', '76.3\n', 'スパイダーマン\n', 'ソニーPE\n', '2002\n', '\n', '75.0\n', 'スタ ー・ウォーズ/最後のジェダイ\n', 'ディズニー\n', '2017\n', '\n', '75.0\n', 'インディ・ジョーンズ/最後 の聖戦\n', 'UIP\n', '1989\n', '44.0\n', '74.0\n', 'BRAVE HEARTS 海猿\n', '東宝\n', '2012\n', '\n', '73.3\n', '踊る大捜査線 THE MOVIE3 ヤツらを解放せよ!\n', '東宝\n', '2010\n', '\n', '73.1\n', 'ファンタ スティック・ビーストと魔法使いの旅[† 11]\n', 'ワーナー\n', '2016\n', '\n', '73.1\n', '怪盗グルーのミニオン大脱走\n', '東宝東和\n', '2017\n', '\n', '73.1\n', 'スター・ウォーズ/スカイウォーカーの夜明け\n', 'ディズニー\n', '2019\n', '\n', '72.7\n', 'ポケットモンスター ミュウツーの逆襲\n', '東宝\n', '1998\n', '41.5\n', '72.4\n', 'ダイ・ハード3\n', '20世紀FOX\n', '1995\n', '48.0\n', '72.0\n', 'スパイダー マン3\n', 'ソニーPE\n', '2007\n', '\n', '71.2\n', 'LIMIT OF LOVE 海猿\n', '東宝\n', '2006\n', '\n', '71.0\n', 'スピード\n', '20世紀FOX\n', '1994\n', '45.0\n', '70.3\n', 'ゴーストバスターズ\n', 'コロンビア\n', '1984\n', '41.0\n', '70.0\n', 'オーシャンズ11\n', 'ワーナー\n', '2002\n', '\n', '69.0\n', '名 探偵コナン から紅の恋歌\n', '東宝\n', '2017\n', '\n', '68.9\n', 'パール・ハーバー\n', 'ディズニー\n', '2001\n', '\n', '68.8\n', 'ONE PIECE FILM Z\n', '東映\n', '2012\n', '\n', '68.7\n', 'ナルニア国物語/第1章:ライオンと魔女\n', 'ディズニー\n', '2006\n', '\n', '68.6\n', 'ハリー・ポッターと死の秘宝 PART1\n', 'ワーナー\n', '2010\n', '\n', '68.6\n', 'ファインディング・ドリー\n', 'ディズニー\n', '2016\n', '\n', '68.3\n', 'パイレーツ・オブ・カリビアン/呪われた海賊たち\n', 'ディズニー\n', '2003\n', '\n', '68.0\n']

解説

html = urlopen('https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E6%AD%B4%E4%BB%A3%E8%88%88%E8%A1%8C%E5%8F%8E%E5%85%A5%E4%B8%8A%E4%BD%8D%E3%81%AE%E6%98%A0%E7%94%BB%E4%B8%80%E8%A6%A7')

上記コードでデータを取得するページを指定する。
今回はwikipediaを使用する。

get_info = bs.select('table.wikitable tbody tr')

ここで、属性を持つtableのtrの内容を取得する。
今回指定したのはwikipediaの下記の箇所

for index, info in enumerate(get_info):
    for info_td in info.select('td'):
        if index <= 100:
            movies.append(info_td.text)
        else:
            break

取得したtrの内容を回してtdの内容の文字だけを配列に追加
最後にprintで表示すると結果が取得できる。

次回は取得したデータからグラフ作成します。
多分d3.js使用かな