2 ポイント 投稿者 GN⁺ 2024-08-07 | 1件のコメント | WhatsAppで共有

スーパーマーケットの価格を追跡する

  • 2022年12月、ギリシャの主要な3つのスーパーマーケットの価格変動を追跡するためにWebサイトを構築した。
  • この過程でさまざまな問題を解決する必要があり、多くの教訓を得た。

JSサイトのスクレイピング

  • 主な問題は、JavaScriptでレンダリングされるWebサイトだった。
  • Playwrightを使ってWebブラウザをプログラムから制御した。
  • PlaywrightはChromium、Safari、Firefoxブラウザをサポートし、Node、Java、.NET、Pythonと一緒に利用できる。
  • 無限スクロールを処理し、製品情報を抽出するコードを書いた。

自動化

  • M1 MacBook Proでスーパーマーケット全体をスクレイピングするのに50分から2時間30分かかった。
  • 開発とテストには良かったが、より恒久的なソリューションが必要だった。

古いノートPCを使う?

  • 2013年製の古いノートPCを使ってみたが、性能は非常に期待外れだった。

クラウドを使う?

  • AWSは高すぎ、Hetznerはずっと安かった。
  • Hetznerのサーバーを使うことに決めた。

古いノートPCとクラウドを使う!

  • クラウドサーバーでスクレイピングを自動化し、古いノートPCはCIサーバーとして使った。
  • Concourseを使ってパイプラインを設定し、毎日スクレイピングジョブを実行した。

IP制限の回避

  • Akamaiのファイアウォールルールにより、居住地以外のIPアドレスからのリクエストはブロックされた。
  • Tailscaleを使って、リクエストが自宅のIPアドレスから来ているように見せた。

失敗の原因と時期

  • スクレイピングプロジェクトはWebサイト開発者の変更による影響を受ける。
  • 失敗には2つの種類がある: breaking change と non-breaking change。
  • フィードバックを早く得ることが重要だ。

最適化

  • メール通知、ヒステリシス、タイムアウト、リトライ設定など、さまざまな最適化を行った。
  • より大きなサーバーの使用とデータフェッチの削減で性能を改善した。

コスト

  • Hetznerでのサーバー利用コストは非常に安い。
  • CloudflareのR2無料ティアを使ってデータ保存コストを削減した。

結論

  • スーパーマーケットの価格変動を追跡するために構築したスクレイピングパイプラインの主要な構成要素を説明している。

GN⁺のまとめ

  • この記事は、スーパーマーケットの価格変動を追跡するためにPlaywrightとクラウドサービスを活用した経験を共有している。
  • JavaScriptでレンダリングされるWebサイトをスクレイピングする方法と、自動化および最適化の方法を扱っている。
  • HetznerとTailscaleを使ってコストを抑え、IP制限を回避する方法を説明している。
  • この記事は、Webスクレイピングと自動化に関心のある人に役立つかもしれない。

1件のコメント

 
GN⁺ 2024-08-07
Hacker Newsの意見
  • 類似した問題を経験したという共有

    • 30か国でレンズ価格比較サイトを運営中
    • WebサイトのHTML変更が大きな問題
    • 100以上のWebサイトでの商品マッチングが初期の大きな障害
    • 正規表現で大半は処理可能だが、手動マッピングが必要
    • スクレイパーとインフラ構築は比較的簡単だが、保守は難しい
    • 商品が消えたときにエラー原因の特定が難しい
    • 面白いプロジェクトだが、挑戦的で面倒な問題解決が必要
  • ニュージーランドで類似プロジェクトを進行中

    • PlaywrightとTypescriptを使用し、クラウドストレージにParquetファイルを保存
    • データ収集のみ行っており、まだ表示はしていない
    • AkamaiやCloudflareのようなリバースプロキシサービスの回避が主な作業
    • ニュージーランドでは少なくとも3つのスタートアップが同じ作業を実施中
    • インフレが多くのイノベーションを刺激している
    • スーパーが価格を複雑に見せるパターンを観察
  • 類似のWebサイトを作って大きな関心を集めた

    • Linodeサーバーで2GB RAM、5 IPv4、1000 IPv6を使用
    • すべての商品を最大40分間隔でスクレイピング
    • curl impersonateとJSONスクレイピングを使用
    • 市場の90%はAjax呼び出しで価格を提供し、残り10%は正規表現を使用
    • Webサイト: economizafloripa.com.br
  • オーストラリアの2大スーパーマーケットは、価格分析AIアルゴリズムを通じて独占的な状態になり得る

    • AIアルゴリズムが協調して利益を最大化する可能性
    • 公開価格データを通じて合法的に、供給コストや商品ごとの利益データを共有して違法に行うことも可能
    • 消費者は最大化された利益分を支払うことになる
  • スウェーデン市場で8年以上活動中

    • Webサイト: matspar.se
    • 顧客は主要なオンラインストアすべての商品を比較し、カートに追加可能
    • 合計価格を比較した後、希望するストアにカートをエクスポート可能
    • 毎日3,000万件以上の価格をスクレイピング
  • 価格の透明性があれば追跡はもっと容易になるはず

    • 例: 別の郵便番号や食料品店でオーツミルクの価格を比較
    • 「Shrinkflation」の追跡可能性(同じ価格で内容量を減らすこと)
    • 価格だけでなくグラム当たりのコストも確認が必要
  • スクレイパーが失敗しないように変更を検知する方法

    • 価格が異常に変化しないよう自動チェックを追加可能
    • 例: 価格が100%以上変わらないこと、アクティブ商品の数が20%以上変わらないこと
  • 新しい地域に引っ越したときの価格追跡経験の共有

    • 2つのスーパーや大型店で安い価格の買い物をする方が簡単
    • ヨーロッパ: Aldi/Lidl、米国: Costco/Trader Joe's
    • オンライン: CamelCamelCamel/Amazon
    • メーカーから直接購入した方が安い場合もある
  • スクレイピングそのものより、ますます高度化するブロッカーを回避する方が難しい

    • 住宅用プロキシを継続的にローテーションし、データスクレイピングのパターンを避ける必要がある
    • 一部のスーパーはネットワークリクエストを隠している
    • モバイルアプリでネットワークリクエストやデータを確認することもブロックされる
    • コストと継続的な開発作業のため、見合わないと判断
  • クライアント側JavaScriptでレンダリングされる問題

    • 皮肉にも、サイトを埋めるデータは単純なJSON形式で提供されており、スクレイピングの信頼性が高い