ウェブサイトからテーブルをスクレイピングする方法 - Pythonチュートリアル

ハウツー, パイソン, スクレイピング, 12月13日-2024年5分で読める

Webスクレイピングは、Python開発者、データアナリスト、そしてデータセットを扱うすべての人にとって不可欠なスキルとなっている。構造化されたリッチなデータに関して言えば、ウェブサイトにあるテーブルは情報の宝庫であることが多い。製品カタログ、スポーツ統計、財務データなど、ウェブを探し回っているのであれ、Pythonを使ってテーブルデータを抽出して保存する能力は非常に貴重なツールです。

この実用的なガイドでは、Pythonを使ってウェブサイトからテーブルをスクレイピングするプロセスを段階的に説明します。最後には、requestsBeautiful Soup、さらにはpandasのような一般的なライブラリを使用してテーブルデータにアクセスし、CSVファイルのような再利用可能な形式で保存する方法を知ることができます。

前提条件

技術的な詳細に入る前に、フォローするために必要なものを説明しよう:

  • Pythonがシステムにインストールされていることを確認してください。最新版はこちらからダウンロードできます。
  • 必要なライブラリ:
    • requests-ウェブサイトからHTMLコンテンツを取得する。PythonでHTTPリクエストを送信するための人気のあるパッケージです。
    • Beautiful Soup-HTMLやXMLドキュメントを解析するための強力なライブラリ。ウェブページから特定の要素を抽出するために使用する。
    • pandas-Pythonのデータ操作と分析に最適なライブラリ。これが、抽出したテーブルデータを格納する最終的な場所になります。

pipコマンドを使って必要なライブラリをインストールします。ターミナルで以下のコマンドを実行するだけで、インストールが完了します:

pipinstall requestsbeautifulsoup4 pandas

テーブル・スクレイピングのステップ・バイ・ステップ・ガイド

ステップ1:ウェブサイトの構造を理解する

ウェブスクレイピングプロジェクトの最初のステップは、ターゲットとなるウェブサイトの構造を分析することです。この例では、ホッケーチームの順位表を表示するテーブルを特徴とするサンプルウェブサイトからデータをスクレイピングします。下記はテーブルのプレビューです:

このテーブルがHTML構造の中でどのように表示されるかを示す。

ステップ2:HTTPリクエストの送信

最初のステップは、スクレイピングしたいウェブページを取得することである。リクエスト・ライブラリを使ってHTTPリクエストを送信し、テーブル・コンテンツを取得するために使っているダミー・ウェブサイトからHTMLコンテンツを取得する。

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
   print("Page fetched successfully!")
   html_content = response.text
else:
   print(f"Failed to fetch the page. Status code: {response.status_code}")
   exit()

ステップ3:テーブルからのデータ抽出

HTMLにおいてテーブルとは、スプレッドシートのように行と列でデータを表示する構造化された方法である。テーブルは <table> タグに分割され、その内容は行 (<tr>)とセル(<td> データセルまたは <th> ヘッダー・セルの場合)。テーブルの構造を簡単に説明しよう:

  • 内に囲まれている <table> タグを使うと、すべての行とセルのコンテナとして機能する。
  • 列: それぞれ <tr> (テーブル行)はテーブルの水平方向のスライスを表す。
  • 細胞だ: 各列の内側、 <td> タグは個々のデータ値(または <th> タグをヘッダーに使用)。
  • 属性:テーブルには多くの場合、クラスや IDなどの属性があります。

例えば、このスクリプトでは <table> タグに特定のクラス (class="table"を使用して行とセルを抽出する。 美しいスープ.これにより、系統的にデータを引き出し、分析や保存の準備をすることができる。

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
   print("No table found on the page!")
   exit()

ステップ4:データをCSVファイルに保存する

このステップでは、抽出したテーブルデータをCSVファイルに保存し、将来使用できるようにするとともに、pandas DataFrameとして表示し、データがどのような構造になっているかを確認できるようにします。CSVとして保存することで、後でExcelや Google SheetsPythonなどのツールでデータを分析することができます。

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
   cells = [cell.text.strip() for cell in row.find_all("td")]
   rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(f"Data saved to {csv_filename}")

このコードを実行すると、pandasはファイル名を scraped_table_data.csv(スクレイプド・テーブル・データ.csv を作業ディレクトリに置くと、抽出されたデータが以下のようにコンソールに出力される:

          チーム名 年 勝 敗 OT 敗戦 勝率 得失点 (GF) 得失点 (GA) + / -
0ボストン・ブルーインズ1990 44 24 0.55 299 264 35
1バッファロー・セイバーズ1990 31 30 0.388 292 278 14
2カルガリー・フレイムズ1990 46 26 0.575 344 263 81
3シカゴ・ブラックホークス1990 49 23 0.613 284 211 73
4デトロイト・レッドウィングス1990 34 38 0.425 273 298 -25

フルコードテーブルデータのスクレイピングと保存

以下は、ウェブサイトからテーブルデータをスクレイピングし、CSVファイルに保存し、抽出したデータを表示するための完全なPythonスクリプトです。このスクリプトは、このガイドで取り上げたすべてのステップを1つのまとまったワークフローにまとめたものです。

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.scrapethissite.com/pages/forms/"

response = requests.get(url)

if response.status_code == 200:
    print("Page fetched successfully!")
    html_content = response.text
else:
    print(f"Failed to fetch the page. Status code: {response.status_code}")
    exit()

soup = BeautifulSoup(html_content, "html.parser")

table = soup.find("table", {"class": "table"})

if not table:
    print("No table found on the page!")
    exit()

headers = [header.text.strip() for header in table.find_all("th")]

rows = []
for row in table.find_all("tr", class_="team"):
    cells = [cell.text.strip() for cell in row.find_all("td")]
    rows.append(cells)

df = pd.DataFrame(rows, columns=headers)

csv_filename = "scraped_table_data_pandas.csv"
df.to_csv(csv_filename, index=False, encoding="utf-8")

print(df.head())
print(f"Data saved to {csv_filename}")

結論

このガイドでは、ウェブサイトの構造を理解し、データを抽出し、分析のために保存するというプロセスを段階的に説明してきました。リサーチ用のデータセットを構築するにしても、データ収集を自動化するにしても、単にウェブスクレイピングの可能性を探るにしても、これらのテクニックをマスターすることで世界が広がります。

スクレイピング中に、ウェブサイトが課すIP禁止やレート制限などの課題に遭遇するかもしれない。そこで重要になるのがプロキシです。プロキシを使えば、以下のことが可能になります:

  • レート制限を回避IPアドレスをローテーションすることで、リクエストが多すぎてウェブサイトからブロックされるのを防ぎます。
  • 匿名性の維持:実際のIPアドレスをマスクすることで、身元を隠しておくことができます。
  • 地域限定データにアクセス:特定のロケーションを持つプロキシを使用して、地域固有のコンテンツをスクレイピングします。

ProxyScrapeは、Webスクレイピング用に調整された、 レジデンシャル プレミアム 専用 モバイルプロキシなどの幅広いプロキシを提供しています。信頼性と拡張性に優れたプロキシソリューションは、大規模なスクレイピングプロジェクトを中断することなく処理し、スムーズで効率的なデータ収集を実現します。