株価ランキングのクローリング

こんにちは。データ事業部2部の安部健太郎です。本記事では、クローリングについて解説したいと思います。クローリングとは、データ分析をする上で必要なデータを、様々なWEBサイトから自動で収集する技術のことです。WEBからの情報取得は、以下の2つに分類されます。

・ APIを使い、必要な情報だけを取得するタイプ

・ 人間と同じように、WEBサイトを実際に見に行き、必要な情報を取得するタイプ

本記事では、後者のAPIが提供されていないWEBサイトの情報取得について解説していきます。静的なサイトと動的なサイトではクローサーの作成の仕方、難易度が変わってきますが、今回は静的なサイトのクローラーの作成の方法を説明していきます。

今回は、Pythonを使ってヤフーファイナンスから株価情報を取得し、最終的にcsvファイルとして出力することを目標にします。
実際の作業の手順としては、以下の通りに行っていきます。

1, WEBサイトからソースコードを取得する

2,ソースコードをパースして、必要な情報を抜き出す

3,データフレームに情報を格納し、csvファイルに出力する

それでは順にやっていきましょう。

WEBサイトからソースコードを取得する

まずソースコードの取得ですが、これはrequestsと呼ばれるライブラリを使い、以下のように書くことで取得できます。

ここでhtmlにはレスポンスコードやヘッダー情報などが含まれていますが、ソースコードを抜き出す場合は以下のように書くことで取得できます。

しかし、ここに含まれている情報は、何の意味も持たないただの文字の羅列になっています。htmlタグなどに意味を持たせ、抽出を容易にするために、次に説明するパースを行います。

ソースコードをパースして、必要な情報を抜き出す

html.contentに入っている情報をパースすることで、文字の羅列を、htmlとして解釈することが可能になります。
今回は、BeautifulSoupというライブラリを用いてパースしたいと思います。
以下のように記述することで、soupという変数に、パースされたソースコードが格納されます。

ここから、一つ一つの情報の抽出に移ります。いきなり全部取るのではなく、まずは1行目のデータだけ抜き出してみたいと思います。1行目が正しく抜き出せれば、後はfor文を回していけば全て取得できるというのはなんとなくイメージが湧くかと思います。
ブラウザからソースコードを確認してみると、各行の株価の情報はtrタグでの中の、rankingTabledata yjMというクラウ名で書かれているということがわかります。これら情報を抜き出すためには、以下のように書きます。

これでitemlistに全ての株価情報がリスト型として格納されました。確認のため、len(itemlist) と書いて実行してみると、株価の表の行数である50という数値が返ってきたと思います。今はitemlistには全行分のデータが格納されているため、まずは1行目だけを以下のようにして抜き出します。

itemの中身は以下のようになっており、確かに1行目のデータが抜き出せたことが確認できます。

順位、コード、コードのリンク先のURLは以下のようにして抜き出せます。別の要素が、同じタグ、同じクラス名で書かれている場合は、何番目を取り出すかを後ろに記載します。

市場のように、タグとクラスで指定をすると要素が一つに決まる場合には、以下のように書くことができます。

ここまでできたら、1行目の要素を全て抜き出し、dataframeに入れてみましょう。

データフレームに情報を格納し、csvファイルに出力する

dataframeの作成と同時にデータを挿入してもいいのですが、この後にfor文を回すことを考え、先に空のdataframeを作成し、そこにデータを追加していく形とします。上で書いたコードもまとめて書いてみます。

ここまで書けたら、dfの中身を見てみましょう。各要素が正しくdfに格納されていると思います。
あとはitemlist後ろの数値を変数に置き換え、for文を回していけば完成です。上のコードとほとんど同じですが、完成版は以下のようになります。

このコードが実行できたら、dfの中身を見てみてください。どうでしょうか?50行のデータが正しく格納されたでしょうか?
正しくできていれば、あとは以下のようにcsvで出力するだけです。文字コードは各自の環境に合わせて変更してください。

まとめ

requestsBeautifulSoupを使うことで、静的なページのクローリングができました。
複数ページをクローリングする場合は、URLを変更しながらクロールするだけです。ただしその時は、WEBサイトに負荷をかけすぎないように注意しましょう。

このページをシェアする: