Python

WebスクレイピングでデータをCSVに自動出力

指定したWebサイトから商品名・価格・URLを自動収集し、CSVファイルに整形して保存するPythonスクリプトです。定期実行との組み合わせで価格監視にも使えます。

Python 3 requests BeautifulSoup4 pandas CSV出力
処理の流れ
🌐
URLにアクセス
requests で取得
🔍
HTML解析
BeautifulSoup
📦
データ抽出
CSSセレクタで取得
📄
CSV保存
pandas で出力
スクリプト(Python)
Python 3scraper.py
import requests
import pandas as pd
from bs4 import BeautifulSoup
from datetime import datetime
import time

def scrape_items(url: str) -> list[dict]:
    """指定URLから商品情報を取得してリストで返す"""
    headers = {'User-Agent': 'Mozilla/5.0'}
    res     = requests.get(url, headers=headers, timeout=10)
    res.raise_for_status()

    soup  = BeautifulSoup(res.text, 'html.parser')
    items = []

    # 商品カードを全件取得(セレクタはサイトに合わせて変更)
    for card in soup.select('.product-card'):
        name  = card.select_one('.product-name')
        price = card.select_one('.product-price')
        link  = card.select_one('a')

        if not (name and price):
            continue

        items.append({
            '商品名' : name.get_text(strip=True),
            '価格'   : price.get_text(strip=True),
            'URL'    : link['href'] if link else '',
            '取得日時': datetime.now().strftime('%Y/%m/%d %H:%M')
        })
        time.sleep(0.5)  # サーバーへの負荷軽減

    return items

def save_to_csv(items: list[dict], filename: str):
    """データをCSVに保存"""
    df = pd.DataFrame(items)
    df.to_csv(filename, index=False, encoding='utf-8-sig')
    print(f"✅ {len(items)}件を {filename} に保存しました")

if __name__ == '__main__':
    TARGET_URL = 'https://example.com/products'
    OUTPUT_CSV = f'products_{datetime.now().strftime("%Y%m%d")}.csv'

    data = scrape_items(TARGET_URL)
    save_to_csv(data, OUTPUT_CSV)
ポイント解説
🛡️
サーバー負荷対策を実装 time.sleep(0.5) でリクエスト間隔を空け、対象サイトへの過剰アクセスを防いでいます。
📄
utf-8-sig でExcel対応 encoding='utf-8-sig' を指定することで、Excelで開いても文字化けしないCSVを生成します。
📅
日付付きファイル名 出力CSVに日付を付与することで、定期実行時も上書きせず履歴として蓄積できます。