ENGINEERING

pythonによるクローリング・スクレイピング基礎
~競馬の結果予測~

競馬が趣味で、予測モデルを作りたいとずっと夢を抱く データ分析チームTです!

もちろん競馬だけでなく釣れる日時だって予測を立てられます!その予測には様々な方法があり、今の仕事の延長戦上からひとまず、クローリング・スクレイピングの基本とその実践について紹介したいと思います。

ネットの情報を活用した分析を行う際、必須となる技術として、クローリング・スクレイピングがあります。

今回は、これからそういった分析を始めようとしている方々に向けて、pythonを用いたhtmlデータのクローリング・スクレイピングの基本とその実践について書かせていただきます。

1. クローリング・スクレイピングの定義

・クローリングとは、ウェブページをダウンロードすること
・スクレイピングとは、ダウンロードしたウェブページから必要な情報を抜き出すこと

2. pythonによるhtmlデータのクローリング・スクレイピングの基礎

今回は、netkeiba.comのレースデータを題材とし、以下のライブラリを用いる
・urllib (クローリング)
・bs4 (スクレイピング)

2.1 クローリング
2.1.1 htmlデータのクローリングと取得したデータの出力

以下のようなコードで簡単に出力できる

※上記#url http://db.netkeiba.com/race/201608030411/

2.1.2 クロール先のWebサーバの負荷考慮
クローリングによって、クロール先のWebサーバに負荷がかかり、サーバの障害を引き起こしてしまう可能性がある。

そのような事態を回避するために、以下のような対策を取る必要がある

  • 時間当たりのクロール先のWebサーバへのリクエスト数が多いと推測される時間帯には、クローリングを控える
  • クローリングのプログラムにスリープタイムを取り入れ、上述リクエスト数が多くならないようにする

より詳細に関しましては、以下のブログ記事などをご参照ください

2.2 スクレイピング
2.2.1 htmlの基本用語

スクレイピングを習得するために必要となるhtmlの用語を説明します。以下のようなhtmlの一部分を題材とする。
<p class=”category”>DATA-SCIENCE</p>

  • htmlタグ:  上の例では、<p class=”category”>, </p>のことです。<>で区切られた部分のこと
  • htmlタグ名: 上の例では、pタグのことです。<>内の一番左に書かれている部分でタグ名が識別できる
  • html要素:  上の例では、全体のことです。htmlタグで囲まれた中身とhtmlタグを合わせたもののこと
  • html属性:  上の例では、classのことです。htmlタグに記述されるタグの設定
  • html属性値: 上の例では、”category”のことです。その名の通り、属性の値のこと

2.2.2 beautifulsoupによるクローリングしたhtmlデータのスクレイピング

今回行うスクレイピングの流れは、以下のようなものである。

a. タグ名、属性・属性値から、html要素を検索し抽出する
b. 抽出したhtml要素から、タグ名、属性・属性値、テキストを抜き出す

上記のa.とb.は、先述したクローリングしたデータについて、それぞれ以下のようなコードで実行できる

a. タグ名、属性・属性値から、html要素を検索し抽出する


b. 抽出したhtml要素から、タグ名、属性・属性値、テキストを抜き出す

3. 実践例(競馬データ)

競馬の情報サイトであるnetkeiba.comには、二次元の表形式の馬の戦績データが存在する
今回は、先述したクローリング・スクレイピングの基本的な技術を用いて、このサイトのもずあアスコットという馬の戦績データをクローリング・スクレイピングし、csvファイルに格納する。
なお、csvファイルとして格納する際には、ライブラリpandasのDataFrameを使う。
対象となるurlは以下の通り
http://db.netkeiba.com/horse/result/2014110031/
全体の流れは以下のようなものである
1. クローリング
2. スクレイピング
a. カラム名を取得
b. 競馬データをDataFrameに格納( 表形式のデータを一行ずつ一列ずつ読み込んで、DataFrameに格納 )
3. DataFrameをcsv形式で保存

以下が実際のコードである
上記1.クローリング #url http://db.netkeiba.com/horse/result{}


まとめ

ここまでは、urllibとBeautifulSoupを用いたクローリング・スクレイピングの基本とその実践についてご紹介しました。
この記事を書いてから知ったのですが、直接table要素をparseできる方法があるそうで、
機会があれば追記などしたいと思います。取得したデータを入力として、競馬の予測モデルを作りたいと思い、連載で記事を書かせて頂くつもりです。

出展

この記事をシェアする