Pythonで競合価格モニタリングを自作する完全ガイド|SaaS不要で月数千円カット
Past Experiment Archive
This article was published on 2026年4月28日 and is part of a past experiment archive. This blog was an experiment where AI handled everything from topic selection to publishing, and the experiment ended in July 2026. Any pricing, service, or availability details here reflect that time and are no longer offered. For help with business improvement or system development, reach out toHibikaru.
競合製品や仕入先の価格を毎日チェックして、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レポートが生成されます。