Tony Wang6 分で読めますモバイルアプリAPIの仕組み: アプリのデータがウェブと異なる理由(2026年版)
Yelp、DoorDash、OpenTableのデータが、ウェブページではなくモバイルアプリの裏に存在する理由、そのバックエンドの仕組み、そして正当な方法でアクセスする方法を解説します。
ウェブサイトはブラウザに読み取られるように作られています。URLをリクエストし、HTMLを受け取り、必要な部分をパースします。モバイルアプリはそれとは異なる作られ方をしています — 自身のプライベートなバックエンドをREST または GraphQL API経由で呼び出し、JSONレスポンスをネイティブな画面としてレンダリングします。取得すべきHTMLは存在しません。なぜなら、そもそもページというもの自体が存在しないからです。この一点の違いこそが、「ウェブサイトと同じようにアプリをスクレイピングすればいい」がうまくいかない理由であり、また一部のデータ — 配達プラットフォームのゲスト向け閲覧フィードや、ディレクトリアプリの検索バックエンド — が、同じフィールドを持つ公開ウェブページを一切持たず、アプリの裏側にしか存在しない理由でもあります。
ウェブサイトとアプリ: 2つの異なるデータ形態
| ウェブサイト | モバイルアプリ | |
|---|---|---|
| 取得するもの | レンダリングされた HTML(または HTML + クライアントサイド JS) | プライベートな REST または GraphQL バックエンドからの JSON/protobuf |
| 読み取り方法 | DOM をパースする | DOM は存在しない — バックエンドのレスポンス自体がデータです |
| 認証 | 公開ページでは多くの場合なし | セッショントークン、デバイス/アプリの署名、場合によっては証明書ピンニング |
| 安定性 | レイアウトの変更でセレクタが壊れる | プライベートなスキーマは変更履歴なしに変わる |
| 網羅範囲 | ページがレンダリングするものすべて | 場合によってはそれ以上 — アプリ専用のフィード、フロー、フィールド |
どちらも「同じ会社のデータ」です。しかし配信の仕組み、つまりそこに到達するための方法はまったく異なります。
一部のデータがアプリ内にしか存在しない理由
最もわかりやすい例は、Crawlora自身のAPIカタログに記載されているものです。
- DoorDashの「近くの店舗」探索フィードとそのストア発見フィードは、いずれもDoorDashのエンドポイントのドキュメントがAndroidモバイルのゲストフローと説明しているものを通じて動作します — これは、何も入力しないうちからアプリが表示する、位置情報ベースの閲覧画面です。doordash.comには、同じ作られ方をした「近くを見る」に相当するページはありません。
- Yelpのビジネス検索 — Yelpアプリが使用しているのと同じキーワード・位置情報検索 — は、Crawloraの言葉を借りれば**「Yelpの実際のAndroidアプリのビジネス検索バックエンドを直接」**呼び出します。ウェブ検索が最終的に表示するのと同じ評価、カテゴリー、写真を返しますが、そのリクエスト自体はウェブページの取得ではなく、アプリの形をした呼び出しです。
- Uber EatsとOpenTableも、レストランの発見やライブの予約タイムスロットについて、同様のアプリファーストなフローを実行しています — 分単位で変化する空き状況が、アプリがポーリングしているのと同じバックエンドから提供されています。
これはどれも珍しいことではありません。2026年のコンシューマーアプリは、単にこのように作られています。つまりモバイルファーストのバックエンドがあり、ウェブサイトはそれに遅れて追随するか、同じカタログのより狭い範囲しかカバーしないことがあるのです。
なぜDIYでのリバースエンジニアリングは適切な選択ではないのか
インターセプトプロキシを使って、自分のデバイス・自分のアカウントのネットワークトラフィックを調べることは可能です — これはアプリ開発者やQAチームが自社アプリをデバッグするために使う、標準的で正当な手法です。問題が生じるのは、それを他社のアプリのプライベートなバックエンドから大規模にデータを引き出すための土台として扱ってしまうときです。
- 証明書ピンニング。 多くの本番アプリはTLS証明書をピン留めしているため、アプリ自体を改変しない限り、中間に置いたプロキシは単純に接続に失敗します — これは自分のトラフィックを読むこととは異なる、はるかにリスクの高い行為です。
- 短命な署名付きトークン。 アプリのバックエンドへのリクエストは通常、セッション、デバイス、またはタイムスタンプの窓に紐づいたトークンで署名されています。それを再現するには署名ロジックをリバースエンジニアリングする必要があり、アプリが更新された瞬間に失効します。
- ドキュメント化されず、変化し続けるスキーマ。 プライベートなモバイルAPIには変更履歴がありません。フィールド名、ページネーションの形式、必須ヘッダーは、あなたのスケジュールではなくベンダーのスケジュールで変わります — これはDIYのウェブスクレイパーが直面するのと同じ脆さですが、頼れるドキュメントはさらに少なくなります。
- 利用規約。 意図された用途の範囲外で他社のアプリのバックエンドに自動的にアクセスすることは、そのウェブサイトをスクレイピングする場合と同じ利用規約・許容利用に関する問題を引き起こします — 一般的な枠組みについてはウェブスクレイピングは合法かを参照してください。これはここにも当てはまります。
これは近道ではなく、期限付きの本物のエンジニアリング作業です。
公式デベロッパーAPIが実際にカバーする範囲
「これにはきっとAPIがあるはずだ」と思い込みたくなります。たいていの場合、確かにAPIはあります — ただし、あなたが必要としているものとは違います。
- App Store ConnectとGoogle Play Developer APIは、自分が所有するアプリのデータを管理・閲覧できるようにするものです — 自分自身のレビュー、自分自身の掲載情報です。競合アプリやビジネスの公開カタログについては何も返しません。
- レストランプラットフォーム独自のパートナー/マーチャントAPIは、あなたがマーチャントである場合に自分自身のレストランのメニューや予約をカバーするものであり、プラットフォーム上のすべてのレストランをカバーするわけではありません。
自分が所有していない多数のビジネスにまたがるリサーチ、モニタリング、集計のためには、公式デベロッパーAPIは設計上、適したツールではありません — それらは自分自身のアカウントの範囲に限定されているからです。
現実的な道筋: すでにアプリの言葉を話す構造化API
現実的な落としどころは、ウェブ側にあるのと同じものです。つまり、他社のアプリのバックエンドとのプライベートな統合を自ら保有する代わりに、すでにそれを維持しているプロバイダーを呼び出し、正規化されたJSONを受け取ることです。Crawloraのプラットフォームエンドポイントは、まさに上記の例についてこれを行っています — Yelpのビジネス検索、OpenTableのレストラン検索とライブの空き状況、DoorDashとUber Eatsのストア・メニューデータ — いずれも認証情報不要(元のプラットフォームからのログイン、APIキー、Cookieが不要)で、生のアプリペイロードではなく、ドキュメント化されたフィールドとして返されます。
# Yelp's app-backend business search, as one documented call
curl "https://api.crawlora.net/api/v1/yelp/search?term=pizza&location=Chicago,%20IL" \
-H "x-api-key: $CRAWLORA_API_KEY"
import requests
h = {"x-api-key": "YOUR_API_KEY"}
# OpenTable's live reservation timeslots — the same feed the app polls
slots = requests.get(
"https://api.crawlora.net/api/v1/opentable/search",
headers=h,
params={"term": "dinner", "latitude": 37.7749, "longitude": -122.4194},
).json()["data"]["results"]
トークンの更新、セッション管理、スキーマの変化を維持するのはプロバイダーの問題であり、あなたの問題ではありません — いずれにせよ、あなたが得るのは安定したバージョン管理されたエンドポイントです。
収集できるもの
公開された事実に基づくフィールドのみです: ビジネスの掲載情報(名前、評価、レビュー数、カテゴリー、住所、座標、写真)、レストランのプロフィールとメニュー、ライブの予約または配達の空き状況、そしてストア/メニューデータ — アプリの中で人が実際に目にできるのと同種のフィールドです。レビュアーやユーザーの名前は、それがウェブページから来たものであれアプリの画面から来たものであれ、GDPR/CCPAのもとで個人データにあたります — 適法な根拠のもとで収集し、身元を再公開しないでください。
どのような場面で使われるか
- ローカルビジネス・レストランインテリジェンス — 施設をまたいだ評価、カテゴリー、空き状況。Yelpをスクレイピングする方法とOpenTableをスクレイピングする方法を参照してください。
- レビュー・評判モニタリング — アプリの統合を維持することなく、プラットフォームをまたいでセンチメントを追跡します。レビュー・評判モニタリングのユースケースを参照してください。
- 配達・マーケットプレイスリサーチ — フードデリバリープラットフォームをまたいだストア、メニュー、価格データ。DoorDashをスクレイピングする方法とUber Eatsをスクレイピングする方法を参照してください。
出典
収集を始める
まずは無料で試す: アンチボットチェッカーでサイトやアプリ由来のソースがボットをブロックするかどうかを確認するか、無料ウェブスクレイパーで任意の公開URLを実行できます。サインアップは不要です。
PlaygroundでYelpとOpenTableのエンドポイントをテストし、APIドキュメントでスキーマを確認し、料金を確認してください。あわせてYelpをスクレイピングする方法、OpenTableをスクレイピングする方法、ウェブスクレイピング vs API、そしてウェブスクレイピングは合法かも参照してください。
本記事はhow-to-scrapeガイドシリーズの一部です — 私たちが扱うすべてのプラットフォームを、1つのインデックスにまとめています。
よくある質問
モバイルアプリのデータはなぜウェブサイトのデータと異なるのですか?
ウェブサイトはパース可能なHTMLをレンダリングします。一方でモバイルアプリは自身のプライベートなRESTまたはGraphQLバックエンドを呼び出し、JSONレスポンスをネイティブにレンダリングします — 取得すべきページは存在しません。一部のデータ(チェーン店のゲスト向け閲覧フィード全体、アプリ専用の予約フローなど)は、そのバックエンドを通じてしか流れず、同等の公開ウェブページは存在しません。
アプリのAPIを自分でリバースエンジニアリングすればいいのではないですか?
自分のデバイス・自分のアカウントのトラフィックを調べることは可能ですが、本番のアプリバックエンドはプライベートであるように作られています。証明書ピンニング、短命な署名付きトークン、そして予告なく変化するスキーマを使用しています。それを再現するのは本物の、継続的なエンジニアリング作業であり、他社のアプリに対してそれを行うと、そのウェブサイトをスクレイピングする場合と同じ利用規約上の問題が生じます。
公式のアプリデベロッパーAPIでこれを解決できますか?
自分自身のアプリやアカウントに限ってのみ解決できます。プラットフォームのデベロッパーAPI(App Store Connect、Google Play Developer API、マーチャント自身の注文API)は、自分自身の掲載情報やアカウントを管理できるようにするものであり、他社の公開カタログや検索結果を大規模に返すものではありません。
構造化APIは、リバースエンジニアリングなしでどうやってアプリ専用のデータを取得しているのですか?
すでにプラットフォームのアプリバックエンドと通信しているプロバイダー — 例えばCrawloraのYelp、DoorDash、OpenTable、Uber Eatsの各エンドポイント — が、セッション、トークン、スキーマの変化を1つのドキュメント化されたバージョン管理エンドポイントの裏で処理します。そのため、自らプライベートな統合を維持する代わりに、安定したAPIを呼び出すだけで済みます。
アプリのバックエンドのデータは公開データですか?
ウェブと同じルールが適用されます。事実に基づく、公開されているフィールド(ビジネスの名前、評価、メニュー、住所)は、ログインの背後にあるものより収集のリスクが低く、レビュアーやユーザーの身元は、それがウェブページから来たものであれアプリの画面から来たものであれ、GDPR/CCPAのもとで個人データにあたります。