Yandex.Eda、Delivery Club、SberMarket、そして数十の地域アグリゲーターは、マーケティング担当者、アナリスト、レストランビジネスのオーナーにとってのデータの本当の金鉱です。しかし、メニューの価格や項目を体系的に収集し始めると、サービスがリクエストをブロックし始めます。この記事では、メニューと配達価格のパースを正しく行う方法、使用するツール、そしてプロキシがブロックを回避するのにどのように役立つかを解説します。
なぜレストランのメニューと配達価格をパースするのか
ロシアの食事配達市場は、eコマースの中で最もダイナミックなセグメントの一つです。料理の価格、メニューの構成、配達条件は、文字通り毎日変わります。競合他社が数十社、または数百の項目に及ぶ場合、これらの変化を手動で追跡することは不可能です。ここで自動データ収集が必要になります。
実際にメニューと価格のパースを利用しているのは以下のような人々です:
- レストランやカフェのオーナー — 自分の地域の競合の価格を追跡し、迅速に自社の価格設定を調整します。
- レストランチェーンのマーケティング担当者 — 競合がどのメニュー項目をプロモーションや特別オファーで推進しているかを分析します。
- HoReCa市場のアナリスト — 様々な都市や地域における料理カテゴリーの平均価格に関するレポートを作成します。
- スタートアップのアグリゲーター — 自社のカタログ用にレストランのメニューと価格のデータベースを収集します。
- 投資家やコンサルタント — 新しい店舗やフランチャイズを開設する前に競争環境を評価します。
- アプリ開発者 — カロリー計算や食事計画のアプリ用の料理データベースを作成します。
あなたがレストランビジネスに従事しているか、その分析を行っている場合、競合の価格を定期的に監視することは贅沢ではなく、必要です。人気のある料理で30〜50ルーブルの違いが、注文へのコンバージョンに直接影響を与える可能性があります。自動化なしでは、データ収集をすでに設定している人々に常に一歩遅れを取ることになります。
アグリゲーターから収集するデータ
パーサーを設定する前に、どのデータが必要かを理解することが重要です。アグリゲーターにはいくつかの情報層があり、それぞれが異なるタスクに役立ちます。
| データの種類 | 含まれる内容 | 誰に役立つか |
|---|---|---|
| メニューと項目 | 料理名、説明、成分、重量、カロリー | アプリ開発者、栄養士 |
| 料理の価格 | 現在の価格、割引価格、変更履歴 | レストランオーナー、マーケティング担当者 |
| 配達条件 | 配達料金、最低注文額、配達時間 | アナリスト、スタートアップ |
| プロモーションと特別オファー | 割引、コンボ、プロモ料理、季節のオファー | マーケティング担当者、競争調査 |
| 評価とレビュー | 店舗の評価、レビュー数、品質タグ | 投資家、コンサルタント |
| 地理データ | 住所、配達エリア、サービス地域 | 市場アナリスト、フランチャイズ |
特に価値があるのは、価格の動的モニタリングです。数ヶ月間、データを1日1回収集すると、競合の価格設定パターンを把握できます — 価格を上げるタイミング、プロモーションを開始するタイミング、外部イベント(祝日、スポーツイベント、悪天候)に対する反応など。
Yandex.Eda、Delivery Clubなどの保護の特徴
大手アグリゲーターは、自社のデータを自動収集から積極的に保護しています。これは理解できます。彼らのレストランデータベースと最新の価格は、彼らの競争優位性です。パーサーを設定する前に、どのような保護に直面するかを理解する必要があります。
Yandex.Eda
複数の保護レベルを同時に使用しています。まず、地理的制約が積極的に適用されます:メニューのコンテンツと価格は、あなたのIPアドレスに基づいて表示されます — もしIPがモスクワからであれば、モスクワのレストランが表示されます。次に、サイトはReactで構築されたSPA(シングルページアプリケーション)として機能し、データはHTMLに埋め込まれておらず、APIリクエストを介してロードされます。最後に、疑わしい活動があると、Yandex SmartCaptchaが有効になります。1つのIPからの頻繁なリクエストがあると、サイトへのアクセスが制限されます。
Delivery Club (SberMarket)
類似のアーキテクチャ:データは静的HTMLではなく、内部APIを介して提供されます。サービスは行動パターンを分析します:リクエストがあまりにも速いか、間隔なしで行われる場合 — ブロックされます。また、User-Agentとリクエストヘッダーの分析も行われます。非標準のヘッダーはすぐに疑念を引き起こします。
地域アグリゲーター
Chibbis、Golosoなどのサービスや地域のアグリゲーターは、一般的により弱い保護を持っています。その中の一部は、標準的なツールでパースできるシンプルなHTMLページを使用しています。しかし、ここでも頻繁なリクエストによるIPブロックは標準的な慣行です。
アグリゲーターでのパーサーブロックの主なメカニズム:
- リクエスト制限を超えた場合のIPブロック(レートリミティング)
- 地理的ブロック — 異なるIPに対して異なるコンテンツを表示
- User-AgentとHTTPヘッダーの分析
- 疑わしい活動時のキャプチャ
- データのJavaScriptレンダリング(SPAアーキテクチャ)
- 行動分析:クリック速度、スクロール、間隔
コードなしとコードありのパースツール
良いニュース:レストランのメニューをパースするためにプログラミングスキルは必要ありません。ほとんどのタスクを処理できるノーコードソリューションが存在します。しかし、Yandex.EdaのようなSPAサイトを扱うには、より高度なツールが必要です。
ノーコードツール(プログラミングなし)
Octoparse — 最も人気のあるビジュアルパーサーの一つです。ページの要素をクリックして、コードを書かずにデータ収集のシナリオを構築できます。IPのローテーションを備えたクラウドモードがあります。シンプルな構造のサイトからメニューを収集するのに適しています。
ParseHub — ビジュアルインターフェースを持つ同様のツールです。JavaScriptページでの作業が可能で、現代のアグリゲーターに適用できます。プロキシのサポートもあります。
Apify — 人気のあるサイト用の「アクター」(既製のパーサー)を持つプラットフォームです。一部の配達アグリゲーターには、マーケットプレイスに既製のソリューションがあります。コードなしでウェブインターフェースを介して実行できます。
コードありのツール(開発者向け)
Python + Requests + BeautifulSoup — 静的ページをパースするためのクラシックな組み合わせです。迅速で簡単ですが、JavaScriptレンダリングには対応していません。
Python + SeleniumまたはPlaywright — 実際のブラウザ(Chrome/Firefox)を操作するため、SPAサイトやJavaScript、さらには一部のキャプチャにも対応します。Playwrightはより現代的で迅速なソリューションと見なされています。この組み合わせがYandex.EdaとDelivery Clubで機能します。
Scrapy — Pythonでの大規模パース用のプロフェッショナルフレームワークです。リクエストキュー、プロキシ用のミドルウェア、さまざまな形式へのエクスポートをサポートしています。レストランのデータ収集の大規模プロジェクトに最適な選択です。
| ツール | コードが必要ですか? | JSレンダリング | プロキシ | 適している用途 |
|---|---|---|---|---|
| Octoparse | いいえ | 部分的 | 内蔵ローテーション | 地域アグリゲーター |
| ParseHub | いいえ | はい | 外部プロキシ | ほとんどのアグリゲーター |
| Apify | いいえ | はい | 内蔵 + 外部 | Yandex.Eda、Delivery Club |
| Selenium/Playwright | はい(Python) | はい | 外部プロキシ | 任意のサイト |
| Scrapy | はい(Python) | プラグイン経由 | 外部プロキシ | 大規模データ収集 |
プロキシなしではパースが機能しない理由
これは重要な問題です。多くの初心者アナリストは、自分のIPから直接パーサーを起動し、すぐにブロックに直面します。理由は簡単です:アグリゲーターは短時間に同じアドレスからの数百のリクエストを検知し、自動的にブロックします。アクセスの復旧には数時間から数日かかることがあります。
プロキシは、リクエストを多数の異なるIPアドレスに分散させることでこの問題を解決します。サーバーの観点から見ると、リクエストは異なる場所からの異なるユーザーからの通常のトラフィックのように見えます。しかし、すべてのプロキシがこのタスクに対して同じように効果的であるわけではありません。
レジデンシャルプロキシ
レジデンシャルプロキシは、実際の家庭ユーザーのIPアドレスを使用します。Yandex.EdaやDelivery Clubの観点からは、レストランのメニューを見に来た普通の人です。このようなプロキシは、正しく使用すればほとんどブロックされません。大手アグリゲーターからのデータ収集に最適な選択です。
モバイルプロキシ
モバイルプロキシは、モバイルキャリア(MTS、Beeline、MegaFonなど)のIPアドレスです。その特徴は、1つのモバイルIPが同時に数千の実際のユーザーによって使用される可能性がある(NAT経由)ため、サイトはモバイルアドレスをブロックすることが非常に少ないことです。これは、高頻度のリクエストでのパースに最も信頼性の高いオプションの一つです。
データセンタープロキシ
データセンタープロキシは最も速く、最も安価ですが、そのIPは「人間ではない」として簡単に特定されます。地域アグリゲーターのシンプルな保護には適していますが、Yandex.EdaやDelivery Clubではすぐにブロックされます。それでも、データセンタープロキシは、サイトの構造を初期的に回避し、パーサーを本番稼働前にテストするのに適しています。
メニューのパースに適したプロキシの種類:
- Yandex.Eda、Delivery Club → レジデンシャルまたはモバイルプロキシ
- 地域アグリゲーター(Chibbisなど) → データセンタープロキシまたはレジデンシャル
- ロシア全土のデータ収集(異なる都市) → 都市に基づく地理ターゲティングのあるレジデンシャルプロキシ
- 高頻度モニタリング(毎時) → ローテーション付きのモバイルプロキシ
プロキシを使ったパーサーのステップバイステップ設定
実践的なシナリオを考えてみましょう:あなたは、Yandex.Edaからあなたの都市の20の競合のピザの価格を毎日収集したいと考えています。以下の手順で設定します。
ステップ1. アグリゲーターのAPI構造を調査する
ブラウザでYandex.Edaを開き、F12(DevTools)を押して、Networkタブに移動し、XHR/Fetchでリクエストをフィルタリングします。レストランのページを見つけ、メニューをロードする際にどのAPIリクエストが送信されるかを確認します。通常、api/v1/menu?restaurantId=...のようなものです。これらのリクエストのヘッダーを記録してください — 模倣に必要です。
ステップ2. ツールを選択する
コードを書かない場合は、ApifyまたはParseHubを使用してください。Pythonで書く場合は、JavaScriptサイトでの作業に最適な選択肢はPlaywrightです。必要なツールをインストールし、外部プロキシの接続をサポートしていることを確認してください。
ステップ3. 地理ターゲティング付きのプロキシを取得する
これは重要な点です。Yandex.Edaは、都市に応じて異なるレストランを表示します。もしエカテリンブルクのレストランのメニューをパースする場合は、エカテリンブルクのIPを持つプロキシが必要です。都市に基づく地理ターゲティングのあるレジデンシャルプロキシを使用することで、地元のユーザーが見るコンテンツを正確に取得できます。プロキシ設定時に必要な地域を指定してください。
ステップ4. プロキシのローテーションを設定する
すべてのリクエストに1つのプロキシを使用しないでください。ローテーションを設定してください:5〜10リクエストごとにIPを変更します。Apifyでは、プロキシプールの設定を介してこれを行います。Scrapyでは、ミドルウェアを介して行います。Playwrightでは、ブラウザコンテキストを作成するたびに新しいプロキシを渡します。IPが頻繁に変更されるほど、ブロックのリスクは低くなります。
ステップ5. リクエスト間の遅延を設定する
リクエスト間にランダムな遅延を追加してください — 2〜8秒の間隔で。これは、実際のユーザーの行動を模倣します。1秒未満の間隔でリクエストを行わないでください — これはブロックされる確実な道です。Scrapyでは、DOWNLOAD_DELAYパラメータを使用し、AUTOTHROTTLE_ENABLEDを有効にします。
ステップ6. 正しいリクエストヘッダーを設定する
常にリアルなUser-Agent(ブラウザの文字列)、Accept-Languageヘッダー(例えば、ru-RU,ru;q=0.9)とRefererを渡してください。これらのヘッダーなしのリクエストはボットのように見え、最初にブロックされます。ChromeやFirefoxの最新のUser-Agent文字列を使用してください。
ステップ7. スケジュールとデータの保存を設定する
パーサーを夜間(2:00〜6:00)に実行してください — アグリゲーターのサーバーへの負荷が最小限で、疑わしいトラフィックが目立たなくなります。データをデータベース(PostgreSQL、MySQL)または少なくともタイムスタンプ付きのCSVに保存します。これにより、価格の変動履歴を構築できます。
# Playwright(Python)でのプロキシ設定の例
from playwright.sync_api import sync_playwright
import random
import time
proxies = [
{"server": "http://proxy1.example.com:8080", "username": "user", "password": "pass"},
{"server": "http://proxy2.example.com:8080", "username": "user", "password": "pass"},
# ... さらに多くのプロキシ
]
def parse_restaurant_menu(url):
proxy = random.choice(proxies)
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(
proxy=proxy,
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
)
page = context.new_page()
# ランダムな遅延 2-8秒
time.sleep(random.uniform(2, 8))
page.goto(url)
page.wait_for_selector('.menu-item') # メニューの読み込みを待つ
# 料理のデータ収集
items = page.query_selector_all('.menu-item')
menu_data = []
for item in items:
name = item.query_selector('.item-name').inner_text()
price = item.query_selector('.item-price').inner_text()
menu_data.append({'name': name, 'price': price})
browser.close()
return menu_data
典型的なミスとその回避方法
ツールを正しく設定しても、多くの人が食事配達データのパース時に問題に直面します。ここでは、最も一般的なミスとその解決策を示します。
ミス1: すべてのリクエストに1つのプロキシを使用する
どんなに質の高いレジデンシャルプロキシでも、1つのサイトに対して1日に数百のリクエストがあるとブロックされます。常に10〜20のプロキシのプールを使用し、ローテーションを行ってください。パースするレストランの数が多いほど、必要なプロキシの数も増えます。
ミス2: 地理ターゲティングを無視する
Yandex.EdaとDelivery Clubは、ユーザーの都市に応じて異なるコンテンツを表示します。もしノボシビルスクのレストランのデータを収集したいのに、モスクワのプロキシを使用していると、モスクワのデータが得られます。常にプロキシが必要な地域に合っていることを確認してください。
ミス3: APIではなくHTMLをパースする
初心者のパーサーは、ページのHTMLコードからデータを収集しようとします。しかし、SPAサイト(Yandex.Edaもその一つ)では、データはHTMLに埋め込まれておらず、APIを介してロードされます。DevToolsを使って必要なAPIエンドポイントを見つけ、直接アクセスする方が効率的で安定しており、リソースも少なくて済みます。
ミス4: リクエストの頻度が高すぎる
データを早く収集したいという気持ちは理解できますが、それは即座にブロックにつながります。50のレストランの価格を毎日監視するには、1日に1回パーサーを実行し、リクエスト間に3〜5秒の間隔を設けるだけで十分です。遅延を減らしてプロセスを早めようとしないでください。
ミス5: プロキシの稼働状況を監視しない
プロキシは「死ぬ」ことがあります — ブロックされたり、有効期限が切れたりします。パーサーがブロックされたプロキシで動作し続けると、空のデータやエラーが発生し、問題に気づかないことになります。各実行前にプロキシの稼働状況を確認し、動作しないアドレスを自動的に置き換えるように設定してください。
ミス6: サイト構造の変更を無視する
アグリゲーターは定期的にサイトやAPIを更新します。1ヶ月前に機能していたパーサーが、次の更新後に機能しなくなることがあります。エラー通知を設定し、少なくとも週に一度パーサーの稼働状況を確認してください。収集しているデータの構造に関するドキュメントを手元に置いておいてください。
レストランのメニューのパーサーを起動する前のチェックリスト:
- ✅ 10以上のプロキシのプールがローテーション設定されている
- ✅ プロキシが必要な都市/地域に合っている
- ✅ リクエスト間の遅延が3〜8秒(ランダム)
- ✅ リアルなUser-Agentが設定されている
- ✅ Accept-LanguageとRefererのヘッダーが追加されている
- ✅ タイムスタンプ付きのデータ保存が設定されている
- ✅ エラー監視と通知が有効になっている
- ✅ 夜間に実行が予定されている
結論
レストランのメニューと配達価格のパースは、レストランビジネスやHoReCa市場の分析における競争優位性の実際のツールです。Yandex.Eda、Delivery Club、その他のアグリゲーターは自社のデータを積極的に保護していますが、正しいアプローチ — 適切なツールの選択、遅延の設定、質の高いプロキシの使用 — により、データ収集は安定して機能し、ブロックなしで行えます。
この記事からの重要な結論:JavaScriptレンダリングをサポートするツール(Playwright、Apify)を使用し、プロキシのローテーションを設定し、地理ターゲティングを忘れず、リクエスト間にランダムな遅延を常に追加してください。これが安定したパースの3つの柱です。
Yandex.Eda、Delivery Club、または地域の配達アグリゲーターから定期的にデータを収集する予定がある場合は、レジデンシャルプロキシに注目することをお勧めします — これにより、ブロックに対する最大の耐性が確保され、ロシアの都市に対する地理ターゲティングがサポートされ、特定の地域の価格データを正確に収集するために重要です。
```