Scarnox · Blog

スクレイピングによる価格モニタリング: 実践ガイド

価格モニタリングとは、複数のサイトにある商品の価格を一定の間隔で確認し、結果を記録して、時間の経過とともに比較できるようにすることです。小売業者、マーケットプレイス、アナリストがみな使っています。価格のスクレイピングは、スクレイパーがキャプチャに遭遇する最も一般的な場面の一つでもあるため、設計を正しく行う価値があります。このガイドでは、何を監視するか、本来解析されることを想定されていないページから数値を取り出す方法、変化の保存とアラート、そしてその過程でサイトのルールを守る方法を扱います。

利用が許可されている情報源から始める

コードを書く前に、サイトが公式なデータ取得の手段を提供していないか確認してください。商品フィード、API、パートナープログラムなどです。これらはスクレイピングより信頼性が高く、法的リスクと技術的リスクの大部分を取り除きます。スクレイピングは、公式な手段が存在しない公開ページの代替手段です。その場合も利用規約と robots.txt は適用されます。一般的な論点はウェブスクレイピングの法的概要で扱っています。

5つの部分からなる構成

信頼性の高いモニターは5つの部分から成り、それぞれを分けておくと、デバッグが容易になります。

  1. スケジューラー。 どの商品ページを、いつ訪問するかを決めます。すべてを同じ分に確認せず、一日を通して訪問を分散させてください。
  2. フェッチャー。 控えめな間隔、リトライ、キャッシュを使ってページをダウンロードします。
  3. パーサー。 価格、通貨の文脈、在庫状況を取り出します。
  4. ストア。 すべての観測値をタイムスタンプとともに保存し、履歴を残します。
  5. アラーター。 新しい値を前回の値と比較し、設定した閾値を超えたら通知します。

乱雑なページから価格を解析する

価格は、桁区切りのカンマ、小数点としてのカンマ、数値の前のラベル、複数の要素に分かれた表示など、さまざまな形で現れます。パーサーは小さく保ち、実際の例でテストしてください。ここでは、カンマが桁区切り、ドットが小数点という一般的な形式を前提にしたバージョンを示します。他の形式は、呼び出す前に正規化してください。

import re
from decimal import Decimal, InvalidOperation

PRICE_PATTERN = re.compile(r"\d{1,3}(?:,\d{3})*(?:\.\d{1,2})?|\d+(?:\.\d{1,2})?")

def parse_price(text: str) -> Decimal | None:
    """テキスト内の最初の数値を Decimal で返す。見つからなければ None。"""
    match = PRICE_PATTERN.search(text.replace(" ", " "))
    if not match:
        return None
    try:
        return Decimal(match.group(0).replace(",", ""))
    except InvalidOperation:
        return None

print(parse_price("Now 1,249.50 in stock"))  # Decimal('1249.50')
print(parse_price("Sold out"))               # None

比較や合計をする値には、float ではなく Decimal を使ってください。浮動小数点の丸め誤差により、等しい価格が異なって見えることがあります。解析された値の横に生のテキストも保存しておけば、全ページを再取得しなくても、後でパーサーのバグを修正できます。

履歴を保存し、変化を検出する

一つの価格は一時点のスナップショットにすぎません。モニターの価値は履歴にあります。観測ごとに一行を保存し、商品 ID、情報源、タイムスタンプ、解析された値、生のテキストを記録してください。その後、アラートは直前の行との単純な比較になります。意味のある変化、たとえば設定した割合を超える値下げや、商品の在庫切れだけに通知してください。そうしないとノイズで溢れてしまいます。

バリエーションとセットを扱う

一つの商品ページには、サイズや色ごとの価格、セット価格、会員価格、選択後にだけ表示される価格など、複数の価格が並ぶことがあります。構築前に、モニターが何を記録すべきかを決めてください。一般的な方法は、価格と一緒にバリエーションの識別子を保存することです。そうすれば、一つのサイズの変化が商品全体の変化に見えることがありません。「〜から」の価格や、取り消し線の付いた元の価格には注意してください。誤った数値を拾うパーサーは、誤ったアラートを生みます。各値の横にラベルのテキストも保存しておくと、アラートがおかしく見えたときに、何が読み取られたかを確認できます。

礼儀正しくスケジュールする

各商品は、その価格が実際にどれくらいの頻度で動くかに合った間隔で確認してください。毎日変わる商品に、毎時の確認は必要ありません。各訪問にジッター(ばらつき)を加え、サイトごとの1時間あたりのリクエスト数に上限を設け、選んだ間隔に合わせて結果をキャッシュしてください。こうした習慣により、サイトへの負荷が低く保たれ、データの一貫性も保たれます。

ページがブロックしてきたとき

価格ページは自動アクセスの標的になりやすいため、ブロック、レート制限、キャプチャに遭遇することがあります。429 や 503 が返ったら後退し、何度も拒否し続けるサイトへの訪問は止めてください。自動化が許可されているページでキャプチャが出た場合、Scarnox で現在ライブのキャプチャ種別は PopularCaptcha です。トークンのフローは PopularCaptcha の Python ガイド で示しています。追加の仕組みを足す前に、ブロックされずにスクレイピングする を読んでください。多くの場合、追加のツールよりも訪問ペースを整えるほうが問題を解決します。

ページによっては、価格が JavaScript で描画されます。そのような場合は、JavaScript サイトのスクレイピング のアプローチに従ってください。

責任を持ったスクレイピング

次のステップ

クレジットカード不要、無料トライアルクレジット付きで、アカウントを作成し、自動化が許可されているページで PopularCaptcha のフローを試せます。現在の料金は料金ページをご覧ください。