しぷぜん

素人プログラマなおいのStep Zero to Oneブログ

【機械学習】折角だからTOTO BIGやってみる(スクレイピング編)

こんにちは、なおいです。

昨日志してみる編を書いて早速今日は、データを集める作業を行ってみました。

 

前回の記事も短いので読んでみてください。

 

ct-innovation01.hateblo.jp 

 

まず最初にすることは何か?

早速Webスクレイピングを行いたいのですが、実際にWebスクレイピングをする際に一番大事なことを行います。

 

それは、対象のサイトをしっかりみる!

 

いや、遊びたいわけじゃないです。冗談でもないです。今回はYouTubeにいつの間にかって話ではないです。大丈夫です。

 

理由は簡単で、サイトのどの部分をどうやって取得していくかを考えていかないといけません。なので、普通にサイトを見てもダメです。

 

スクレイピングで取得できる情報は、Chromeで言う所の右クリックで出てくる「ページのソースを表示」で出てくるHTMLの情報なのでそちらを見ます。

 

まずは、TOTO BIGのサイト

f:id:ct-innovation01:20170831001517p:plain

ここのサイトのソースが

f:id:ct-innovation01:20170831001710p:plain

この中から、一番下の各チームの勝敗情報を取得しようかな・・・と思いましたが、データ少なくないかなと思いました。今最新で第952回ということですが、TOTO BIGが始まったのが第244回できっと天気などの都合でやってない回もあると考えられるので700回分のデータしかない。

 

多分学習するにはデータが少ないので、ちょっと考え方を変えます。曜日の情報が使えなくなる可能性があるかも知れませんが、2006年以降の全てのゲームの情報を取得することにします。

 

とするとTOTOのサイトにはないので、Jリーグのデータサイトにお世話になろうと思います。そちらも同じようにソースをみると、下みたいにテーブルとしてデータが連続的に連なっていたので、この部分を取得してみます。

f:id:ct-innovation01:20170831002913p:plain

 

Pythonでプログラムを書いていく

 なんでもいいから、プログラムどうやんのさという方はここから見てください。

とはいえ、どこのブログでも紹介しているような内容をざくっと書いただけです。しかも、対象サイトを変えたり条件を変えて何回も動作させたりするつもりはないのでデータの取得からCSV化まで結構ごり押しで組んでます。

 

綺麗じゃないところとかもいろいろありますが、あまり気にしないでください。

みんな大好きなrequestsとBeutifulSoupを使ってます。

あとPythonは3系使ってます。2系ではユニコード問題とか出そうです。

 


# coding=utf-8 import requests import datetime from bs4 import BeautifulSoup import csv def main(): Year = 2006 day = datetime.datetime.today() thisyear = day.year data = [] while True: target_url = 'https://(パス省略)' resp = requests.get(target_url) soup = BeautifulSoup(resp.text) tables = soup.find_all("table",class_="table-base00 search-table") for table in tables: for tr in table.contents[3].contents: if tr != "\n": row = [t.text for t in tr.contents if t != '\n'] data.append(row) Year += 1 if Year > thisyear: break with open('test.csv', 'w') as f: writer = csv.writer(f, lineterminator='\n') writer.writerows(data) if __name__ == '__main__': main()

 とりあえずこんな感じで書きました。対象パスの中に年度を入れる箇所があったのでwhileで無限ループを作って年度を加算しながら今年まで繰り返すようにしました。

 

プログラムの各部の簡単な説明

 

それでは、プログラムの各部分にとんでもなく雑で簡単な説明を入れていきます。

 

以下の2行でページのHTMLの情報を取得してます。

 
        resp = requests.get(target_url)
        soup = BeautifulSoup(resp.text)

 以下の行で対象のタグ(table)かつクラス(table-base00 search-table)を持つところを抽出しています。

 
                tables = soup.find_all("table",class_="table-base00 search-table")
 

 以下の行で情報をリスト化しています。ここはちょっとPythonぽい書き方ですかね。

 
                row = [t.text for t in tr.contents if t != '\n']
 

 これは下のプログラムを一行で書いた場合の記述です。オライリー本とかその他でも結構いろんなところで出てくるので知ってる方が吉だと思います。単純に短く書けるのもいいですし。

 
    row = []
              for t in tr.contents:
                     if t != '\n':
                          row.append(t.text)
 

 完成したリストをそのままdataというリストに追加することで、配列のようにしており、withのブロックでCSVに出力しています。

 

大体こんな感じですかね。で出力結果がこんな感じで8000レコードぐらいでした。f:id:ct-innovation01:20170831091822p:plain

次は、これにちょいちょい加工を行って教育に入ってみます。