はじめに
pandasを使うと、webページの表(tableタグ)のスクレイピングが簡単にできます。
環境
- Windows version : 1903 (Windows 10 Home)
- conda version : 4.7.12
- conda-build version : 3.18.8
- python version : 3.7.3.final.0
- selenium : 3.141.0
手順
(1) 必要なモジュールをインストールします
conda install pandas
conda install beautifulsoup4
conda install html5lib
(2) コードをjupyter notebookに入力します
import pandas as pd tables = pd.read_html('https://info.finance.yahoo.co.jp/ranking/?kd=4', flavor='bs4', header=0) first_five_data = tables[0].head() last_five_data = tables[0].drop(len(tables[0])-1).tail() display(first_five_data.append(last_five_data))
コード説明
pandasのread_htmlメソッドを用いて、webページの表(tableタグ)のスクレイピングを行います。
上記のメソッドを呼び出すとページ内の表をすべて取得しDataFrameのリストとして返します。今回の場合は表が1つしかないため、tables[0]
で表データを参照できます
read_html型の戻り値は、リスト(<class 'list'>
)を作成します。引数はの意味は以下のとおりです。
# flavor ## 解析に使用するパッケージ種別 # 引数 : header # 表タイトルに指定する行番号 tables = pd.read_html('https://info.finance.yahoo.co.jp/ranking/?kd=4', flavor='bs4', header=0)
以下のコードで表の最初の5行分のデータを表示します。
display(tables[0].head())
以下のコードで表の最後の5行分のデータを表示します。しかし、最終行にゴミデータが入っています。
display(tables[0].tail())
上記のように最終行にゴミがある場合は、dropメソッドを呼び出し、最後の行を指定して削除した後に、最後の5行を取り出せば問題ありません。
tables[0].drop(50).tail()
上記のコードは以下でも代用できます
display(tables[0].drop(len(tables[0])-1).tail())
csvファイルに保存・csvファイルから読み込み
次に取得した情報をcsvファイルに保存しましょう。csvファイルに保存することで、取得したデータを永続化できます。
前回で、dropメソッドで不要な行を削除しましたが、今回は別な方法で削除します。
tables[0][:-1].to_csv("./stock_data_list.csv") df_csv = pd.read_csv('./stock_data_list.csv', index_col=0) display(df_csv.head().append(df_csv.tail()))
以下のコードで、一番目のテーブルの最後の行を除去して、csvファイルとして保存します。
[:-1]
で最初の行から最後から一行を意味します。ここで、0行目はタイトル行です。
次のread_csv関数で、0行目をインデックス行(タイトル行)(index_col=0
)と判断して、csvファイルをリードして、DataFrameに変換します。
Yahooサイトから、株価情報を取得します
Yahooサイトはスクレイピングでの高速アクセスを禁止しています。
そのため、高速アクセスを禁止するため、一度の処理の間にはウェイト(スリープ)を必ず入れたいと思います
参考リンク
Python, pandasでwebページの表(htmlのtable)をスクレイピング
Pythonの文字列を抽出する方法まとめ
あとがき
株価の予想をAIを用いて実行できるようにしたいです。まずは、スクレイピング(ネットから情報を取得)をマスターしたいと思います。
ただ、スクレイピングは国内サイトの場合、規制が厳しいです。海外のサイトから株価情報を取得することも考慮したいと思います。