Pythonで競合価格モニタリングを自作する完全ガイド|SaaS不要で月数千円カット
競合製品や仕入先の価格を毎日チェックして、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つのメリット
- データが自社に蓄積される — 過去価格の履歴が将来の戦略立案に使える
- 業務に合わせて拡張できる — 「在庫切れも検知したい」等の追加が即座に可能
- 規約リスクを自分でコントロール — 監視先の変更や対象拡大を柔軟に
設計の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点
- robots.txtを確認 — 法的拘束力はないが業界慣行として尊重
- 利用規約でスクレイピング禁止条項を確認 — 大手ECサイトは多くが禁止
- 取得頻度を抑える — 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つのポイント:
- User-Agentに連絡先
- リクエスト間隔のランダムジッター
- 指数バックオフリトライ
- 失敗時の継続性
完全動作するサンプルコードをGitHubで公開しているので、ぜひ動かしてみてください。python monitor.py --demo で30秒以内にHTMLレポートが生成されます。