Tony Wang6 分で読めますInstacartのスクレイピング方法【2026年版】(API & Python)
2026年版Instacartスクレイピングガイド。近隣店舗・リアルタイム価格・検索候補を構造化JSONで取得。DIY・ノーコード・構造化APIを解説。
2026年に Instacart をスクレイピングする最も手早い方法は、Instacart のレンダリング済みページを自分で解析するのではなく、正規化された JSON を返す構造化 API を呼び出すことです。返ってくるのは、近隣店舗、リアルタイムの商品価格、検索候補、部門カテゴリ、そしてトレンドの検索語です。Instacart 自身の API はこのギャップを埋めません。それらはアプリ連携や小売パートナー向けに作られたものであり、サードパーティのデータアクセス向けではないからです。このガイドでは3つのアプローチすべてを取り上げ、それぞれが何を返し、DIY がどこで破綻するか、そして法律上の現実を最初に解説します。
なぜ Instacart をスクレイピングするのか?
Instacart は数千もの食料品・小売・薬局の店舗を1つの配達プラットフォームに集約しており、そのデータは次のような用途に役立ちます。
- 食料品の価格・在庫モニタリング — ある商品の価格、セール状況、在庫レベルが特定の店舗で時間とともにどう変化するかを追跡できます。
- 店舗カバレッジと配達予定時刻のトラッキング — どの小売業者がある郵便番号にサービスを提供しているか、EBT を受け付けているか、どれだけ速く配達できるかを把握できます。
- 商品検索とカテゴリのリサーチ — ある場所の近くで買い物客が何を検索しているか、店舗が部門タクソノミーをどう整理しているかを把握できます。
- マーケットバスケットと CPG リサーチ — 近隣の店舗やチェーン間で同じ商品の価格やプロモーションを比較できます。
Instacart をスクレイピングするのは合法か?
選択肢1: Python で DIY する(そしてなぜ破綻するか)
Instacart の店舗ページはサイト自身の JavaScript アプリの裏側にある内部 API からレンダリングされるため、DIY のスクレイパーはクリーンな HTML を解析するのではなく、その内部 API をリバースエンジニアリングすることになります。
import requests
# Instacart's storefront pages call an internal API scoped to a
# specific postal code and store — there's no stable public endpoint
resp = requests.get("https://www.instacart.com/store/safeway/storefront")
デモは動きますが、その後破綻します。
- サードパーティのデータアクセス向けの公開 API がない。 Instacart Developer Platform(IDP)は、購入可能な Instacart のチェックアウトリンクを別のアプリに埋め込むためのものであり、返ってくるのは商品データではなくランディングページの URL です。Instacart Connect は、小売パートナーが自社店舗の在庫を Instacart に取り込むためのものです。どちらも外部の研究者に Instacart のデータへの読み取りアクセスを付与するものではありません。
- すべてが位置と店舗にスコープされている。 価格、在庫状況、さらには検索候補までもが郵便番号と特定店舗の
shop_idに紐づいており、一度取得すれば済むような単一の「Instacart カタログ」レスポンスは存在しません。 robots.txtと利用規約が明示的にスクレイピングを制限している。 Instacart の利用規約は自動化されたスクレイピング/データマイニングを禁じており、robots.txtはクローラーに対して API パスとほとんどの店舗閲覧/商品パスを許可していません。- 内部スキーマの変化とアンチボット対策。 非公開の店舗 API のレスポンス形状は予告なく変化し、繰り返しの自動リクエストはレート制限を招きます。
選択肢2: ノーコードツール
マーケットプレイスの「Instacart スクレイパー」アクターは、ある店舗の一覧や単一の検索を単発で取得するために存在しますが、DIY と同じ内部 API の脆さを引き継ぎ、同じ利用規約上のリスクを抱えています。
選択肢3: 構造化された Instacart API
繰り返し実行できるワークフローには、Instacart スクレイピング API が店舗探索、商品詳細、検索、カテゴリを正規化された JSON として返し、ログインもクッキーも Instacart アカウントも不要です。郵便番号の近くの店舗を探すには次のようにします。
curl "https://api.crawlora.net/api/v1/instacart/stores?postal_code=94105" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"postal_code": "94105",
"stores": [
{
"shop_id": "9501",
"retailer_location_id": "53",
"retailer_id": "1",
"name": "Safeway",
"slug": "safeway",
"retailer_type": "Grocery - Traditional",
"service_type": "delivery",
"accepts_ebt": true,
"delivery_eta": "By 4:45am"
}
]
}
}
店舗の shop_id と slug を取得したら、検索候補も郵便番号でスコープされます。その1店舗内、あるいは近隣のすべての小売業者を横断して取得することもできます。
curl "https://api.crawlora.net/api/v1/instacart/search-nearby?postal_code=94105&q=milk" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"postal_code": "94105",
"query": "milk",
"suggestions": [
{ "term": "milk", "thumbnail_url": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/thumb_b4aaab37-66cf-46e3-9638-f37987fca803.jpg" },
{ "term": "almond milk", "thumbnail_url": "https://d2lnr5mha7bycj.cloudfront.net/product-image/file/thumb_example.jpg" }
]
}
}
続いて、その店舗における特定の商品のリアルタイム価格・在庫・栄養情報を Python で取得します。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/instacart"
loc = {"shop_id": "9501", "store_slug": "safeway", "postal_code": "94105"}
stores = requests.get(f"{base}/stores", headers=h, params={"postal_code": "94105"}).json()["data"]["stores"]
item = requests.get(f"{base}/item", headers=h, params={
**loc,
"retailer_location_id": "53",
"product_id": "17830663",
}).json()["data"]
商品のレスポンスはそのまま保存できる正規化された JSON です(実際のフィールド)。
{
"id": "items_53-17830663",
"product_id": "17830663",
"name": "Lucerne Blended Plain Yogurt",
"size": "32 oz",
"brand_name": "lucerne",
"price": {
"current_price": 2.99,
"regular_price": 3.99,
"on_sale": true,
"offer_label": "25% off",
"pricing_unit": "32 oz"
},
"available": true,
"stock_level": "inStock",
"dietary_labels": ["low_carb", "low_sugar"],
"nutrition": [
{ "label": "Protein", "value": "7", "unit": "g" },
{ "label": "Calories", "value": "150" }
]
}
これらに加えて、同じキーで /instacart/departments(shop_id/store_slug/postal_code でスコープされた店舗のカテゴリ/サブカテゴリのタクソノミー)、/instacart/search(shop_id/store_slug/q で1店舗に限定したオートコンプリート候補)、/instacart/trending(postal_code の近くで人気の検索語、店舗指定は不要)にもアクセスできます。product_id と shop_id をキーにして商品ごと・取得ごとに1行を保存し、スケジュールを組んで再実行し current_price/on_sale の変化を追跡してください。
収集できるもの
公開されている店舗データです。近隣店舗(shop_id、retailer_location_id、name、小売業態、サービス種別、EBT の利用可否、配達予定時刻)、特定店舗における商品詳細(名前、ブランド、サイズ、現在価格/通常価格、セール状況とオファーラベル、在庫状況、在庫レベル、食事制限ラベル、栄養成分)、検索・オートコンプリートの候補語(1店舗内、または近隣のすべての小売業者を横断)、店舗の部門・サブカテゴリのタクソノミー、そして郵便番号別のトレンド検索語です。あくまで公開されている商品ページのデータのみであり、パーソナルショッパー・顧客・注文情報は含みません。
制約とよくある課題
- 商品カタログを列挙するエンドポイントがない。 検索と search-nearby はオートコンプリートの候補語を返すのであって、id 付きの一致商品のページネーション済み一覧ではありません。
/instacart/item用のproduct_idを特定するには、既知の SKU か別の探索ステップが必要で、単一の検索呼び出しでは済みません。 - チェーン全体ではなく店舗ごと。
shop_idは1つの小売業者の1つの立地にある店舗を指しており、同じチェーンでも異なる郵便番号にあれば、別のshop_idとして独自の価格と在庫情報を持ちます。 - 価格は絶えず変動する。
current_priceとon_saleは頻繁に変わるため、どの取得結果もある時点のスナップショットとして扱い、傾向データを得るにはスケジュールを組んで再実行してください。 - この用途に特化した公式チャネルがない。 Instacart 自身の開発者向け提供(IDP、Connect)はアプリの埋め込みと小売業者の在庫同期を解決するものであり、サードパーティの読み取りアクセスではありません。公式チャネルの登場を待つのではなく、構造化 API を前提に計画してください。
どこで使われるか
- 食料品の価格・在庫モニタリング — 特定店舗のある商品について、
current_price、on_sale、stock_levelを時系列で追跡できます。ecommerce product intelligence のユースケースも参照してください。 - 店舗カバレッジと配達予定時刻のトラッキング — どの小売業者がある郵便番号にサービスを提供し、どれだけ速く配達できるかをマッピングできます。
- 商品検索とカテゴリのリサーチ —
/instacart/trendingと部門タクソノミーを組み合わせて、何が検索されているかと店舗がカタログをどう整理しているかを比較できます。
出典
収集を始める
まずは無料でお試しください: 任意の公開 URL を無料ウェブスクレイパーに通すか、アンチボットチェッカーでサイトがボットをブロックするかどうかを確認できます。サインアップ不要です。
stores と item のエンドポイントをプレイグラウンドで試し、API ドキュメントでスキーマを確認し、料金をご覧ください。あわせて、近接する食料品・配達分野のパターンとしてDoorDash のスクレイピング方法とCostco のスクレイピング方法、そしてウェブスクレイピングは合法かもご覧ください。
よくある質問
Instacartには商品・価格データをスクレイピングするための公開APIがありますか?
ありません。Instacart Developer Platformはショッパブルなチェックアウトリンクを埋め込むアプリ開発者向けで商品データは返しません。Instacart Connectは自社在庫をInstacartに同期する小売パートナー向けです。どちらもInstacartのストアフロントデータへの第三者による読み取りアクセスは許可していません。
APIである地点近くのInstacart店舗を見つけるにはどうすればいいですか?
郵便番号を/instacart/storesに送ると、近隣の小売店ストアフロントが構造化JSONとして返されます — 店名、shop_id、EBT対応の有無、配達予定時刻です。
Instacartの商品のリアルタイム価格を取得できますか?
はい — /instacart/itemはshop_idとproduct_idを指定すると、特定店舗における商品の現在価格、実施中のセール、在庫状況、栄養成分を構造化JSONとして返します。
同じ商品なのにInstacartのデータで価格が異なるのはなぜですか?
価格と在庫状況は単一の全国カタログではなく、特定の郵便番号における特定店舗のshop_idに紐づいています。同じ商品でも異なる店舗(または同じチェーンの異なる郵便番号)では異なるpriceとstock_levelの値が返されることがあります。
Instacartの検索エンドポイントは一致する商品のリストを返しますか?
いいえ — /instacart/searchと/instacart/search-nearbyは(サムネイル付きの)オートコンプリート候補語を返すのであって、ページ分割された商品idのリストではありません。詳細情報のためにproduct_idを解決するには、既知のSKUか別の発見ステップが必要です。
Instacartをスクレイピングするのは合法ですか?
商品の事実情報は著作権保護の対象外であり、hiQ対LinkedIn事件によれば公開データへのアクセスはCFAA違反にはなりませんが、Instacartの利用規約は自動化されたスクレイピング/データマイニングを明示的に禁止しており、robots.txtはAPIパスとほとんどのストアフロントの閲覧/商品パスを除外しています — これは形式的なものではなく実質的な制限として扱ってください。
Instacart APIの利用にアカウントやログインは必要ですか?
呼び出し側にInstacartアカウントやログインは不要です — 必要なのはAPIキーのみです。