Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Building an Autonomous Competitor Price Monitor with Python, Playwright, and Discord (Zero SaaS Fees)

2026年10月03日に「Dev.to」が公開したITニュース「Building an Autonomous Competitor Price Monitor with Python, Playwright, and Discord (Zero SaaS Fees)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Python、Playwright、Discordで、競合サイトの価格を自動監視するシステムを自作するガイド。高額なSaaSに頼らず、効率的なスクレイピングで価格データを取得・保存し、価格変動をリアルタイムでDiscordに通知する仕組みを、具体的なコードと共に解説する。

ITニュース解説

eコマースの市場では、商品の価格が常に変動しているため、競合他社の価格動向を正確に把握することが非常に重要となる。例えば、競合店が突発的なセールを実施したり、深夜に価格を調整したりといった変化をわずかな時間見逃すだけでも、その日の利益が大きく損なわれる可能性がある。もし競合店が主要な商品の価格を15%引き下げれば、朝の会議が始まる前に、自社の売上は急激に落ち込んでしまうだろう。

通常、企業はこの問題に対処するために、PrisyncやPrice2SpyのようなSaaS(Software as a Service)型の監視プラットフォームを契約することが多い。しかし、これらのサービスは月額150ドルから800ドルと高額な費用がかかる上に、監視できる商品数に制限があったりする。さらに、監視対象のウェブサイトがデザインを変更したり、JavaScriptによる複雑な処理を導入したりすると、うまく機能しなくなることも頻繁に発生するという課題を抱えている。

そこで、この記事では、外部のSaaSに頼ることなく、自律的に機能し、自社で完全に管理できる価格監視システムを構築する方法を解説する。このシステムはPythonというプログラミング言語を中心に、ウェブサイトから情報を高速に取得し、静的な情報収集に適したHTTPX、ウェブブラウザを自動操作し、JavaScriptで動的に表示されるウェブサイトからも情報を取得できるPlaywright、取得した価格や在庫の履歴を記録するためのシンプルなデータベース、SQLite、価格変動などの情報を、Discordチャットツールにリアルタイムで通知するDiscord Webhooksといったツールを組み合わせて実現される。

商用SaaSの価格監視ツールには主に三つの技術的な問題がある。一つ目は「脆弱なセレクタと厳しいレート制限」だ。多くの商用プラットフォームは、ウェブサイトのHTML構造から特定の情報(例えば価格)を見つけ出す「セレクタ」と呼ばれる目印に依存しているが、ウェブサイトのデザインが少しでも変わると、このセレクタが機能しなくなり、データが取得できなくなる。加えて、多くのSaaSは複数の顧客で同じIPアドレス帯を共有しているため、Cloudflareのようなセキュリティサービスによって「機械によるアクセス」と判断され、アクセスがブロックされたり、速度が制限されたりしやすい。

二つ目の問題は「ペイロードの非効率性」だ。ウェブサイトの中には、JavaScriptを使って動的にコンテンツを表示するものがある。このようなサイトから情報を取得するには、Google Chromeのような完全なウェブブラウザを起動し、そのブラウザ上でウェブサイトを表示させる必要がある(これをヘッドレスブラウザと呼ぶ)。しかし、すべてのウェブページチェックのために重いブラウザを毎回起動していては、非常に多くの計算資源が無駄になる。理想的なシステムでは、まず高速なHTTPリクエストで静的な情報を取得し、JavaScript実行やCAPTCHA回避が必要な場合にのみ、軽量なヘッドレスブラウザを利用する階層的なアプローチが求められる。

三つ目は「ブラックボックスなポーリング」という点だ。SaaSを利用する場合、どのくらいの頻度で、どの商品を監視するかといった設定を細かく調整できないことが多く、また、なぜ情報収集が失敗したのかも、サポートに問い合わせないと分からない。自社でシステムを構築すれば、HTTPリクエストのヘッダー情報(アクセス元の情報)を調整したり、プロキシ(代理サーバー)を切り替えたり、データベース内の情報を直接確認したりと、すべてを細かく制御できるようになる。

この自社製システムの全体的な構造は、軽量なスケジュール実行(cronと呼ばれる機能で15分から60分ごとに自動実行される)に基づいている。処理は以下の四つの段階を経て進む。まず「Cronトリガー/オーケストレーター」がシステムを起動する。次に「階層型スクレイパー」が、HTTPXで高速なウェブサイト情報の取得を試み、失敗した場合はPlaywrightに切り替えて情報を取得する。この際、ウェブサイト側から検出されにくくするために、アクセス元の情報を偽装したり、プロキシを自動で切り替えたりする。また、不要なCSSやフォント、画像などのリソースは読み込まないことで、処理を高速化し、メモリ使用量を抑える。情報が取得できたら「SQLite時系列エンジン」がそのデータを処理する。ここでは、今回取得した最新の価格と、前回取得した価格を比較し、価格の変動(差分)や在庫状況の変化を計算する。最後に「アラートディスパッチャー」が、計算された情報を元にDiscordへの通知を送信する。価格が下がった場合は赤色、上がった場合は緑色、変化がない場合は青色といった具合に、視覚的に分かりやすい形でアラートが送られる。

具体的な実装について見ていこう。まず、情報の保存と差分の検出には「SQLiteストレージと差分エンジン」が使われる。SQLiteは、特別なサーバーを必要としない軽量なデータベースで、価格の履歴を確実に記録し、在庫状況の変化を検出するのに適している。Pythonのsqlite3モジュールを使い、price_historyテーブルに商品コード(SKU)、店舗名、URL、価格、在庫状況、タイムスタンプなどの情報を保存する。過去価格の取得や新規価格の記録を行う関数が用意されている。これにより、常に最新の価格と在庫状況を把握し、過去のデータと比較することが可能となる。

次に、ウェブサイトからの情報取得には「階層型抽出エンジン」が利用される。これは、まずHTTPXを使って高速なHTTPリクエストを試みる。HTTPXは非同期処理に対応し、複数のウェブサイトを同時に効率よくチェックできる。もしこのHTTPXでの取得が、ウェブサイトがJavaScriptでコンテンツを動的に生成しているため失敗したり、アクセスが拒否されたりした場合は、Playwrightに処理を切り替える。Playwrightは、完全なウェブブラウザをバックグラウンドで起動し、ウェブサイトを実際に表示して情報を取得する。この際、Playwrightはウェブサイトの読み込みを高速化し、メモリ使用量を減らすために、価格情報には不要な画像やフォントなどのリソースの読み込みをブロックする設定も可能だ。これにより、効率的に必要な情報だけを取得できる。

取得したHTMLデータから、価格や在庫状況といった具体的な情報を抜き出すのが「パースと正規化」の段階だ。ここではselectolaxという高速なHTMLパーサーが使われる。selectolaxは高速なHTMLパーサーであり、標準的なツールより効率的である。これを使って、HTMLの中から指定されたセレクタ(ウェブサイトの構造上の目印)に基づいて価格や在庫の情報を探し出す。抽出された価格データには、通貨記号や余分な文字が含まれていることが多いため、正規表現を使って数値だけを抽出し、正確な価格情報として処理する。在庫状況についても、例えば「out of stock」や「sold out」といったテキストを検出し、商品の在庫有無を判定する。

そして、最終的に重要な情報をユーザーに届けるのが「Discord Webhookアラートディスパッチャー」だ。価格や在庫状況の変化が検出されると、Discordの指定されたチャンネルに自動で通知が送られる。この通知は単なるテキストではなく、Discordの「埋め込み」機能を使って、タイトル、URL、競合店舗名、価格(新旧)、変動幅、在庫状況などが分かりやすく表示される。価格が下がった場合は赤色で「脅威」を、上がった場合は緑色で「機会」を、変化がない場合は青色で「基準」を示すように色分けされるため、一目で状況を把握し、すぐに行動に移せるようになる。

このシステムを実際に動かす場合、特にVPS(仮想プライベートサーバー)のようなリモート環境で運用する際には、いくつかの運用上の考慮点がある。一つは「User-Agentとプロキシのローテーション」だ。頻繁に同じ情報でウェブサイトにアクセスすると、機械的なアクセスと判断され、IPアドレスがブロックされる可能性がある。これを避けるために、アクセス元の情報を偽装するUser-Agentを定期的に変更したり、複数のプロキシサーバーを切り替えながら利用したりする工夫が必要となる。二つ目は「ヘッドレスブラウザでのメモリリーク」の問題だ。Playwrightのようなヘッドレスブラウザは、長時間連続して実行するとメモリを大量に消費し、システムの動作が不安定になることがある。これを防ぐには、Playwrightのブラウザコンテキストを各実行サイクルで確実に閉じるか、Dockerコンテナのような独立した環境で、実行ごとにシステムをリセットすることが推奨される。三つ目は「Crontabによる実行」だ。システムを一定間隔で自動的に実行させるために、LinuxなどのOSに標準搭載されているcrontabというスケジューラー機能を利用する。これにより、例えば30分ごとに自動的にPythonスクリプトが実行され、価格監視サイクルが繰り返されるように設定できる。

この記事で示された技術とコードスニペットを参考に、特定のウェブサイトに合わせて設定を調整し、データベースと連携させれば、価格監視システムを自作できる。これにより、価格情報の収集を完全に制御し、競合他社の戦略変更に迅速に対応し、自社の利益を守る強力な基盤を築ける。

関連コンテンツ

関連IT用語

関連ITニュース