Pythonで競合価格モニタリングを自作する完全ガイド|SaaS不要で月数千円カット

業務自動化📖 12分で読める
Pythonスクレイピング価格モニタリング業務自動化Slack

競合製品や仕入先の価格を毎日チェックして、Excelに転記している——その作業、もう人間がやる必要はありません。

価格モニタリング系のSaaSは月額3,000円〜10,000円が相場ですが、Pythonと数行の依存(BeautifulSoup)だけで自作できることをご存知でしょうか。本記事では、複数サイトから価格を取得して変動アラートを出すツールを、ゼロから作る手順をまとめました。

なぜ自作するのか

SaaSとの比較

項目 商用SaaS 自作
初期費用 0円 0円
月額 3,000〜10,000円 0円(API利用なら数十円)
監視数 プランで制限 無制限
カスタマイズ 限定的 自由
データ所有権 サービス側 自分

100商品を年間監視すると、SaaSなら30,000〜100,000円。自作なら初期費用ゼロ、以降も実質ゼロでメンテナンスし続けられます(必要なのは自分の構築工数だけ)。学習コストを払えば1年で大幅にペイする計算です。

自作の3つのメリット

  1. データが自社に蓄積される — 過去価格の履歴が将来の戦略立案に使える
  2. 業務に合わせて拡張できる — 「在庫切れも検知したい」等の追加が即座に可能
  3. 規約リスクを自分でコントロール — 監視先の変更や対象拡大を柔軟に

設計の3つの軸

実用的なツールにするには、次の3点を最初に決めます。

軸1: 何を取得するか

商品名と価格だけで十分なケースが多いですが、用途によっては在庫状況・レビュー数・割引バッジなども取得対象になります。最小限から始めて、必要になったら追加が鉄則です。

軸2: いつ取得するか

毎日1回(朝6時など)が標準です。深夜0時前後は避けることを推奨します。サーバ側のメンテナンスや日次バッチ処理が走っており、誤った値を取得するリスクがあります。

軸3: どう通知するか

毎日メールで結果報告は逆効果です。閾値を超えた変動だけを通知するのが正解。例えば「価格が10%以上変動したらSlackに通知」という設定にすると、本当に重要な情報だけが届きます。

実装の最小コード

ここから実装の核心です。完全版はGitHubの価格モニタリングサンプルで公開していますが、エッセンスを抜粋すると以下のような構造です(HTML パースは BeautifulSoup4 を使うので pip install beautifulsoup4 だけ追加してください。それ以外は標準ライブラリで完結します)。

import urllib.request, time, random, csv
from bs4 import BeautifulSoup

def fetch_with_retry(url, retries=2):
    """指数バックオフ付きでHTML取得"""
    for attempt in range(retries + 2):
        try:
            req = urllib.request.Request(
                url, headers={"User-Agent": "PriceMonitor/1.0 (+contact@example.com)"}
            )
            with urllib.request.urlopen(req, timeout=15) as resp:
                return resp.read().decode("utf-8", errors="replace")
        except Exception as e:
            wait = 2 ** attempt + random.uniform(0, 0.5)
            time.sleep(wait)
    raise RuntimeError(f"取得失敗: {url}")

def extract_price(html, selector):
    soup = BeautifulSoup(html, "html.parser")
    el = soup.select_one(selector)
    text = el.get_text(strip=True) if el else ""
    digits = "".join(c for c in text if c.isdigit())
    return int(digits) if digits else None

押さえておきたい4つの実装ポイント

1. User-Agentに連絡先を入れる

PriceMonitor/1.0 (+contact@example.com) のように連絡先を含めることで、サイト管理者からの問い合わせを受けられます。トラブルになる前に話せる関係性を作っておくのが重要です。

2. リクエスト間隔をランダム化する

毎秒ピッタリでアクセスするとボット検知されやすくなります。time.sleep(1 + random.uniform(0, 1)) のようにジッター(揺らぎ)を入れます。

3. 失敗は指数バックオフでリトライ

1秒、2秒、4秒、8秒... と待ち時間を増やすパターン。サーバ側の一時的な負荷を回避できます。

4. 取得失敗時の動作を明確に

「失敗したら無視して次に進む」が安全です。1サイトのエラーで全体が止まる作りにしないこと。

アラートと通知

価格変動の閾値判定は、こんな簡単なロジックで十分です。

def detect_alerts(current_prices, previous_prices, threshold_pct=5):
    alerts = []
    for name, current in current_prices.items():
        prev = previous_prices.get(name)
        if not prev or not current:
            continue
        diff_pct = (current - prev) / prev * 100
        if abs(diff_pct) >= threshold_pct:
            alerts.append({"name": name, "prev": prev, "current": current, "diff_pct": diff_pct})
    return alerts

Slack通知も10行で書けます。Incoming Webhookを設定して、JSON POSTするだけ。

import json, urllib.request

def post_to_slack(webhook_url, alerts):
    text = "*📈 価格モニタリング・アラート*\n"
    for a in alerts:
        arrow = "⬆️" if a["diff_pct"] > 0 else "⬇️"
        text += f"\n{arrow} *{a['name']}*  ¥{a['prev']:,} → ¥{a['current']:,} ({a['diff_pct']:+.2f}%)"
    payload = json.dumps({"text": text}).encode("utf-8")
    req = urllib.request.Request(webhook_url, data=payload, headers={"Content-Type": "application/json"})
    urllib.request.urlopen(req, timeout=10)

法律と倫理の押さえどころ

スクレイピングは技術的にできること=やっていいこと、ではありません

確実に守るべき3点

  1. robots.txtを確認 — 法的拘束力はないが業界慣行として尊重
  2. 利用規約でスクレイピング禁止条項を確認 — 大手ECサイトは多くが禁止
  3. 取得頻度を抑える — 1秒1リクエスト以下、深夜帯を避ける

避けるべき行為

ログイン後ページの自動取得、CAPTCHA回避、商用プロキシによる出所偽装などは、不正アクセス禁止法・著作権法・規約違反のいずれかに抵触する可能性が高い領域です。「グレー」ではなく避けるべき行為として扱ってください。一度トラブルになると、ビジネス的にも法的にも取り返しがつきません。

判断に迷ったら、対象サイトの利用規約と robots.txt を読み、その上で書面(メール)で問い合わせるのが最短ルートです。

拡張パターン

最初の構築が終わったら、次の拡張で価値を高められます。

Excel/Googleスプレッドシート出力

openpyxlで履歴をExcelに出すと、関係者全員で共有できます。具体例はExcel月次レポート自動化サンプルを参考に。

グラフでの可視化

Chart.jsを使ったHTML一枚での可視化なら追加コストゼロです。HTMLメールに埋め込むと「ダッシュボード」として機能します。

AIによる異常検知

「過去30日と比べて統計的に異常な変動」を検知させるなら、PythonのscipyやAnthropic APIに相談する形でも実装できます。

自分で作るか、外注するか

スクレイピングは法律・運用設計の比重が大きく、技術以外の論点が多い領域です。

「自分で作る時間を取れない」「業務影響が大きい」という方は、当ラボのPython自動化サービス(15,000円〜)でも対応しています。価格モニタリング・在庫監視・データ収集など、業務に合わせてカスタマイズ可能です。

「規約上、対象サイトをスクレイピングしてよいか分からない」という段階なら、まず自動化相談(3,300円)で方向性を整理することをおすすめします。

まとめ

Pythonでの価格モニタリングは、SaaSに月額数千円払う代わりに自作することで、長期的に大幅なコストカットと自社のデータ蓄積が実現できます。

実装で意識すべき4つのポイント:

  1. User-Agentに連絡先
  2. リクエスト間隔のランダムジッター
  3. 指数バックオフリトライ
  4. 失敗時の継続性

完全動作するサンプルコードをGitHubで公開しているので、ぜひ動かしてみてください。python monitor.py --demo で30秒以内にHTMLレポートが生成されます。

この記事をシェアする