第33回「スクレイピング(5)」取得したデータをCSVやExcelに出力する

こんにちは、小澤です。

前回は、複数ページを巡回してデータを取得する「ページネーション」について解説しました。1ページだけでなく、複数ページにまたがる情報を取得できるようになることで、スクレイピングの実用性は大きく高まります。今回はその続きとして、取得したデータをファイルとして保存する方法を紹介します。スクレイピングは「情報を取る」だけでは不十分です。実務では、そのデータを

  • 分析する
  • 共有する
  • レポートにする

といった形で活用する必要があります。そのためには、データを扱いやすい形式に整形し、CSVやExcelとして保存することが重要になります。

今回は、

  • データをリストとして整理する方法
  • CSVファイルとして保存する方法
  • pandasを使ってExcel形式に出力する方法

を順に確認していくことにしましょう。

取得したデータをリストとして整理する

まずは、スクレイピングで取得したデータを整理します。これまでのコードでは、その場で print() していましたが、実務では、あとで使える形にまとめる必要があります。

import requests
from bs4 import BeautifulSoup

url = “<https://example.com/items>”
response = requests.get(url)
response.raise_for_status()

soup = BeautifulSoup(response.text, “html.parser”)

items = soup.find_all(“div”, class_=”item”)

data = []

for item in items:
    name = item.find(“h2”).text.strip()
    price = item.find(“span”, class_=”price”).text.strip()

    data.append({
        “name”: name,
        “price”: price
    })

このコードでは、

  • 各商品の情報を辞書としてまとめる
  • それをリストに追加する

という形でデータを整理しています。このように、「1件=辞書」「全体=リスト」という構造にしておくと、後の処理が非常に楽になります。

CSVファイルとして保存する

次に、このデータをCSVファイルとして保存してみましょう。Python標準ライブラリのcsvを使います。

import csv

with open(“items.csv”, “w”, newline=””, encoding=”utf-8″) as f:
    writer = csv.DictWriter(f, fieldnames=[“name”, “price”])

    writer.writeheader()

    for row in data:
        writer.writerow(row)

このコードでは、

  • ヘッダー(列名)を書き込む
  • 各データを1行ずつ書き込む

という処理を行っています。実行すると、次のようなCSVファイルが作成されます。

name,price
商品A,1000円
商品B,2000円

CSVはシンプルな形式ですが、Excelで開くこともできるため、最も扱いやすい出力形式のひとつです。

pandasを使ってデータを扱う

もう少し本格的にデータを扱いたい場合は、pandas を使う方法があります。pandasを使うと、リスト形式のデータをそのまま表(DataFrame)として扱えます。

import pandas as pd

df = pd.DataFrame(data)
print(df)

このようにすると、データが表形式で表示されます。

   name   price
0  商品A  1000円
1  商品B  2000円

pandasを使うことで、

  • 並び替え
  • フィルタリング
  • 集計

といった処理も簡単に行えるようになります。

Excelファイルとして保存する

pandasを使えば、Excelファイルとして保存することも簡単です。

df.to_excel(“items.xlsx”, index=False)

これだけで、Excelファイルが作成されます。

Excel形式にしておくと、

  • 社内での共有
  • レポート資料への利用
  • 手動での確認

といった場面で扱いやすくなります。

ページネーションと組み合わせる

前回のページネーションと組み合わせることで、より実用的なコードになります。

data = []

for page in range(1, 4):
    url = f”<https://example.com/items?page={page}>”
    response = requests.get(url)
    response.raise_for_status()

    soup = BeautifulSoup(response.text, “html.parser”)
    items = soup.find_all(“div”, class_=”item”)

    for item in items:
        name = item.find(“h2”).text.strip()
        price = item.find(“span”, class_=”price”).text.strip()

        data.append({
            “name”: name,
            “price”: price
        })

このようにすれば、

  • 複数ページのデータをまとめて取得
  • 1つのリストに集約
  • CSVやExcelとして出力

という流れが完成します。

実務で意識したいポイント

データ出力の際には、いくつか意識しておきたいポイントがあります。

まず、データの形式を統一することです。

  • 数値なのか文字列なのか
  • 単位(円、ドルなど)はどうするか

といった点を整理しておくと、後の分析がしやすくなります。

また、不要な空白や改行を取り除くことも重要です。

text.strip()

は基本的に毎回使う、と考えておいてよいでしょう。

さらに、エラー処理も意識しておくと安心です。特定の要素が取得できない場合でも、処理全体が止まらないようにしておくと、実務で安定して動作します。

今回のまとめ

今回は、スクレイピングで取得したデータをCSVやExcelとして保存する方法を解説しました。

ポイントは次のとおりです。

  • データは「辞書+リスト」で整理する
  • CSVはシンプルで扱いやすい
  • pandasを使うと表形式で扱える
  • Excel出力は業務で使いやすい
  • ページネーションと組み合わせると実用的になる

これまでの内容を組み合わせることで、

  • データを取得する
  • 複数ページに展開する
  • ファイルとして保存する

という一連の流れが完成します。

次回は、このスクレイピング処理を、定期実行して自動化する方法(cronやスケジューラ)について解説します。定期的にデータを収集できるようになると、業務での活用の幅がさらに広がります。次回もお楽しみに。

更新情報

PAGE TOP