【Python】pandasでHTMLテーブルなどを超簡単にスクレイピング

以前pandasでのexcelをDataFrameとして取り込む方法を記事(関心がある方はこちら)にしたが、今回はウェブページ上のHTMLテーブルやCSVファイルをスクレイピングする方法をまとめてみたいと思います。

beautifulsoupやseleniumを使ったスクレイピングほど細かいことはできないものの、その手のスクレイピング方法が難しく感じた方でも、簡単にウェブページ上に落ちている情報をスクレイピングできると思います。


HTMLテーブルをスクレイピングする

細かい引数はともかくとして、テーブルデータを読み込むだけであればURLをしていするだけでできる。

import pandas as pd

df = pd.read_html('URL')

単純に細かい条件をつけずに、指定URLのテーブルをDataFrameとして取り込む場合には、たったこれだけで解決する。

もし指定したURLに複数のHTMLテーブルが含まれている場合には、テーブルごとにDataFrameが作成され、DataFrameのリストが返される。

例えば、トルコの統計局からCPIデータをこのURLから取得してみるとわかりやすい。

url = 'https://tcmb.gov.tr/wps/wcm/connect/EN/TCMB+EN/Main+Menu/Statistics/Inflation+Data/Consumer+Prices'

df = pd.read_html(url)[0] # 指定URLの一つ目のテーブルを指定

詳細設定

細かい条件の指定をする場合には、エクセルファイルをDataFrameとして取り込むのと同じような設定を一通り行うことができる。

代表的なところだけ押させておけば問題ない。

  • index_col : インデックスにする列の指定
  • header : 何行目をヘッダーにするかを指定(指定した行よりも上は無視される)
  • parse_dates : True or Falseで指定。インデックスをtimeseriesにするか否か


CSVファイルを読み込む

web上のCSVファイルもURLを指定するだけでDataFrameに変換することができる(Excelファイルも同じく)

csvファイルを読み込む場合には.read_csv()を使う
(Excelファイルの場合には.read_excel()を使う)

df = pd.read_csv('URL')

こちらも細かい読み込み範囲などを指定することが可能。
主に使うものはHTMLテーブルを読み込むときとほとんど同じになると思う。

  • index_col : インデックスに使う列の指定
  • header : 何行目をヘッダーにするかを指定(指定した行よりも上は無視される)
  • parse_dates : True or Falseで指定。インデックスをtimeseriesにするか否か
  • usecols : 使う列の選択