Google Colab でスクレイピングして table 要素を Pandas.DataFrameに格納する方法

4 min

本記事では、Google Colaboratory から直接実行可能なサンプルコードを用意しています。本記事を最後まで読むと、URL と table 要素を特定するセレクタを入力して table 要素 を DataFrame に格納する方法が解ります。
この手法を身につけるとデータ収集を効率に進めることが出来るようになります。

例1)スペインリーグの順位表をDataFrameに格納する

これが↓

こうなります↓

例2)フェブラリーステークスの順位表をDataFrameに格納する

これが↓

こうなります↓

広告_零号機

スクレイピングのサンプルコードを実行する

サンプルコードを Google Colaboratory で起動する

下記をクリックして Colab を起動してください。

Open In Colab

Google Colaboratory について馴染みが無い方は下記記事などを参照ください。

スクレイピングする

まずは試しに実行します。

ツールバーから [ランタイム] _ [すべてのセルを実行] をクリックしてください。

「警告:このノートブックは Google が作成したものではありません」というダイアログが表示されます。「このまま実行」をクリックしてください。

下記が出力されます

フェブラリーステークスの結果

Jリーグの順位

海外サッカーの順位

サンプルコード解説

今回のサンプルコードは大きく3つの処理に分かれています。

  1. スクレイピング基底クラスの定義
  2. table 要素を DtaFrame に格納するクラスの定義
  3. サンプルクラスの実行

重要なメソッドのみ本記事に記載します。
詳しくは、Colab のコードを読んでください。

def htmldoc2data(self, _html_doc):
  soup = BeautifulSoup(_html_doc, "html.parser")

  # テーブルを取得
  _table = soup.select_one(self.__css_selector)

  # theadタグを探す
  thead = _table.find('thead') 

  # tbodyタグを探す
  tbody = _table.find('tbody') 

  if thead is not None and tbody is not None:
    # パターン①:thead と tbody タグが存在する場合

    # ヘッダーを取得
    ths = thead.tr.find_all('th')

    # DataFrame のヘッダーを作成
    columns = []
    for th in ths:
      columns.append(th.text)
    df = pd.DataFrame(columns=columns)

    # body を取得
    trs = tbody.find_all('tr')
    for tr in trs:
      # 各レコードからテキストを取得し、空白行や余計な空白を削除してDataFrame に格納して返却
      tdlist = []
      for td in tr.find_all('td'):
        tdlist.append(self.remove_blank_line_and_blank(td.text))
      sr = pd.Series(tdlist, index=df.columns)
      df = df.append(sr, ignore_index=True)
    return df
  else:
    # パターン②:thead と tbody タグのいずれかが存在しない場合

    df = pd.DataFrame()
    trs = _table.find_all('tr')

    for tr in trs:
      # 各レコードからテキストを取得し、空白行や余計な空白を削除してDataFrame に格納して返却
      tdlist = []
      for td in tr.find_all('th'):
        tdlist.append(self.remove_blank_line_and_blank(td.text))

      for td in tr.find_all('td'):
        tdlist.append(self.remove_blank_line_and_blank(td.text))

      if len(tdlist) > 0:
        sr = pd.Series(tdlist)
        df = df.append(sr, ignore_index=True)
    return df

サンプルコードの使用方法

GetTableDataFromWeb クラスの第一引数にURLのリスト、第二引数にセレクタを指定することでtable要素をDataFrameに格納することが出来ます。

# フェブラリーステークスの結果
_url_list =[
  "https://keiba.yahoo.co.jp/race/result/2205010811/",
  "https://keiba.yahoo.co.jp/race/result/2105010811/",
  "https://keiba.yahoo.co.jp/race/result/2005010811/"
]

getTableDataFromWeb = GetTableDataFromWeb(_url_list, "#raceScore")

results = getTableDataFromWeb.run()

print("============================")
print(_url_list[0])
results[_url_list[0]].head(5)

セレクタについては、各ブラウザのデベロッパーツールなどを使用して対象の web ページの html を参照して確認してください。デベロッパーツールを起動して各タグにマウスを重ねると対応する箇所が薄い水色でハイライトされるので、割と簡単に見つけられます。

目的のテーブル要素のタグを見つける様子

テーブルに対応するタグが下記であることが解ります。ここから、セレクタが “#raceScore” であることが解ります。

おわりに

本記事では、スクレイピングして html の table 要素 を Dataframe に格納するサンプルコードを紹介しました。ご参考になりましたら twitter をフォローしてSNSでシェアして頂ければ幸いです。

広告_零号機-エリア2
kewton

kewton

大学院卒業後、某大手SIerで10年以上SEとして従事。
社会人3年目までに基本情報・応用情報技術者、データベーススペシャリスト、簿記3級・2級を取得。
基幹系システム・IoTシステム開発のプロジェクト経験多数。AI活用システムの企画・プロト開発経験あり。
強みは、プロマネだけでなく自身で開発も実施してきたこと。
【扱える言語】
C#、java、python、javascript、Excel VBA
【扱えるDB】
oracle、sql server、postgreSQL、mongoDB

FOLLOW

関連記事

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA