こんにちは、小澤です。
前回は、複数ページを巡回してデータを取得する「ページネーション」について解説しました。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やスケジューラ)について解説します。定期的にデータを収集できるようになると、業務での活用の幅がさらに広がります。次回もお楽しみに。
