Tony Wang7 分で読めます2026年版 Wishのスクレイピング方法 (API & Python)
Wishの商品検索と、価格・バリエーション・セラー情報を含む商品詳細を構造化JSONとして取得する方法。DIY、ノーコード、構造化APIの3つの選択肢を紹介。
Wishを2026年時点で最速にスクレイピングする方法は、Wish自身のページを解析するのではなく、キーワードによる商品検索と商品ごとの詳細情報を正規化されたJSONとして返す構造化APIを呼び出すことです。Wish(ContextLogic Inc.が運営)は、CostcoやTargetのような直販小売業者とは異なる性質を持っています — 超低価格と海外セラーからの長い配送期間を特徴とする、サードパーティセラーによって構成されたディスカウント型マーケットプレイスであり、同じ商品が複数のセラーによって複数の価格で出品されることがあります。このガイドでは、DIY Python、ノーコードツール、構造化されたWish API、そして実際に収集できるものと法的な基本事項について説明します。
Wishのデータをスクレイピングする理由
- セラー間の価格比較 — Wishのマーケットプレイスモデルでは、同じ商品が複数のセラーによって異なる価格で出品されることがあります。検索結果と商品詳細を取得することで、単一のリスティングを鵜呑みにするのではなく、それらを横並びで比較できます。
- ディスカウント価格のリサーチ — 積極的な低価格戦略を軸に構築されたマーケットプレイスで、カテゴリやキーワードのテーマ別に価格がどう変動するかを追跡する。
- バリエーションと在庫のトラッキング — 購入可能なサイズ/カラー/セラーの組み合わせごとに独自の価格・通貨・在庫が紐づくため、リスティング全体とは独立して特定のバリエーションの価格変動や在庫切れを監視できる。
- 評価とレビューのモニタリング — 商品の総合評価とレビュー件数を取得し、時系列でのセンチメントや品質シグナルのリサーチに活用する。
- AIパイプラインとエージェント — 商品カードを画面スクレイピングする代わりに、正規化された検索と詳細のJSONを仕入れや価格比較エージェントに供給する。
Wishをスクレイピングするのは合法ですか?
選択肢1: Pythonで自作する(そしてなぜ壊れるのか)
素朴なスクレイパーは検索ページや商品ページを取得し、レンダリングされたマークアップからリスティングカードを解析しようとします。
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.wish.com/search/wireless%20earbuds",
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
soup = BeautifulSoup(resp.text, "html.parser")
# Product cards, pricing, and variations render from client-side app
# state rather than stable server HTML, so a plain HTML parse mostly
# returns an empty shell
一度はデモとして動きますが、その後すぐに壊れます。
- 商品IDは推測できません。 WishのIDは24文字の16進数文字列です — 信頼できるIDを得られるのは、検索結果の
product_idフィールドから取得するか、商品ページのURLから抽出する場合のみで、リデザインのたびに変わるCSSセレクタからではありません。 - クライアントレンダリングされたアプリの状態。 検索結果と商品詳細 — バリエーションごとの価格・通貨・在庫・セラーの内訳を含む — はJavaScriptの状態からレンダリングされ、確実に選択できるマークアップではありません。
- バリエーションはフラットではなく入れ子です。 1つの商品が、それぞれ独自の価格と在庫を持つ多数の購入可能なサイズ/カラー/セラーの組み合わせを抱えることがあり、これをレンダリングされたHTMLから正しく解析するには、アプリの内部データ構造をリバースエンジニアリングする必要があります。
- マーケットプレイスの自動化対策。 多くの大規模マーケットプレイスと同様、Wishのフロントエンドは繰り返される未認証の自動リクエストに対して防御を行っており、ブラウザベースのスクレイパーはその防御の進化に合わせて継続的なメンテナンスが必要です。
- 外部開発者向けの公認のセルフサーブAPIがありません。 サードパーティとしてプログラムによるカタログアクセスをリクエストできる公開デベロッパーポータルは存在しません — これはまさに構造化スクレイピングAPIが埋めるギャップです。
選択肢2: ノーコードツール
ブラウザ拡張機能やポイント&クリック式のスクレイパーは、1回分の検索ページや商品のスナップショットをエクスポートできますが、DIYと同じクライアントレンダリングの脆さを抱えており、安定したバージョン管理されたスキーマも得られません — 同じ商品のセラー間価格をスケジュールに沿って比較するには、都度のエクスポートではなく実際のエンドポイントが必要です。
選択肢3: 構造化されたWish API
繰り返し使えるワークフローのために、CrawloraのWish APIはキーワード検索と商品の完全な詳細情報を正規化されたJSONとして返します — Wish側の認証情報は不要で、ページの解析を保守する必要もありません。キーワードで検索します。
curl "https://api.crawlora.net/api/v1/wish/search?query=wireless+earbuds" \
-H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"total": 4200,
"offset": 0,
"count": 30,
"products": [
{
"product_id": "5f2e1a9c7b6d4f3e2a1b0c9d",
"title": "Wireless Bluetooth Earbuds with Charging Case",
"price": 6.99,
"currency": "USD",
"rating": 4.1,
"review_count": 2318,
"merchant_id": "5a1e0d2f7c3b9e4a1f0d2c8b",
"url": "https://www.wish.com/product/5f2e1a9c7b6d4f3e2a1b0c9d"
}
]
}
}
queryは必須です。ページネーションは実際のオフセットベースのページ送りで、offsetはcount(デフォルトは30)の正確な倍数である必要があり、オフセットが0以外の場合、ページ送りするたびに追加で1回分の上流リクエストが発生します — 結果セットを深くページ送りする際はこの点を予算に含めましょう。一致する結果がないクエリでも、エラーではなく空のproducts配列を伴う通常の200が返ります。
検索結果(または商品ページのURL)からproduct_idを取得し、購入可能なすべてのバリエーションを含む完全な詳細情報を取得します。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/wish"
hits = requests.get(f"{base}/search", headers=h, params={"query": "wireless earbuds"}).json()["data"]["products"]
product_id = hits[0]["product_id"]
detail = requests.get(f"{base}/product/{product_id}", headers=h).json()["data"]
商品詳細のレスポンスには、説明、在庫切れ状態、総合評価、画像、そして購入可能なすべてのサイズ/カラー/セラーのバリエーション — それぞれに独自の価格・通貨・在庫・セラーが紐づいたもの — が含まれます(実際のフィールドです — ドキュメントで確認してください)。
{
"code": 200,
"msg": "OK",
"data": {
"product_id": "5f2e1a9c7b6d4f3e2a1b0c9d",
"title": "Wireless Bluetooth Earbuds with Charging Case",
"description": "True wireless earbuds with touch controls and a portable charging case.",
"sold_out": false,
"rating": 4.1,
"review_count": 2318,
"images": [
"https://canary.contestimg.wish.com/api/webimage/5f2e1a9c-large.jpg"
],
"variations": [
{
"variation_id": "6a3f2b1c9d8e7f6a5b4c3d2e",
"color": "Black",
"price": 6.99,
"currency": "USD",
"inventory": 143,
"merchant": { "id": "5a1e0d2f7c3b9e4a1f0d2c8b", "name": "TechDeals Direct" }
},
{
"variation_id": "7b4a3c2d1e0f9a8b7c6d5e4f",
"color": "White",
"price": 8.49,
"currency": "USD",
"inventory": 0,
"merchant": { "id": "3c1d0e9f2a7b6c5d4e3f2a1b", "name": "GadgetHub Global" }
}
]
}
}
これがセラー比較のユースケースを1回の呼び出しで実現している例です: 同じイヤホンの2つのバリエーションが、2つの異なるセラーから、それぞれ異なる価格と在庫レベルで出品されています。product_id + variation_idごとに1行として保存し、スケジュールに沿って再取得することで、price・inventory・sold_outの変動を追跡しましょう。
収集できるもの
- 検索結果:
product_id、タイトル、価格、通貨、総合評価、レビュー件数、セラーID、商品URL。実際のオフセット/カウントによるページネーションで取得可能 - 商品詳細: 説明、在庫切れ状態、総合評価、レビュー件数、画像
- バリエーション: 購入可能なすべてのサイズ/カラー/セラーの組み合わせ。それぞれに独自の
variation_id、価格、通貨、在庫、セラーが紐づく
これは公開されている商品ページのデータ — 訪問者なら誰でも見える検索結果と商品詳細 — であり、アカウント・注文・チェックアウト・支払いに関する情報ではありません。
制約とよくある課題
- ページネーションの計算は正確でなければなりません。
offsetはcount(デフォルト30)の正確な倍数である必要があります — 任意のオフセットを指定すると一貫性のないページ送りになり、オフセットが0以外の場合、ページ送りするたびに追加で1回分の上流リクエストが発生するため、深くページ送りする際はクレジットを予算に含めましょう。 - 結果が空でも200が返ります。 一致する結果がないクエリは、エラーではなく空の
products配列を伴う通常の200を返します — これは「結果なし」として扱い、リトライすべき失敗として扱わないようにしましょう。 - 商品IDは2つの場所からしか得られません。 検索結果の
product_idフィールドから得られる24文字の16進数product_idか、商品ページのURLから抽出したものだけです — それ以外に商品を確実に特定する方法はありません。 - マーケットプレイスの流動性。 Wishは複数のセラーが参加するマーケットプレイスであるため、特定のバリエーションの価格・在庫・
sold_out状態は、リスティング全体とは独立して素早く変化することがあります — 取得したデータは常にスナップショットとして扱いましょう。 - 公開データのみが対象です。 これは商品ページと検索ページがすでに公開している情報であり、アカウント・注文・支払いデータへの到達手段ではなく、Wish自身のアクセス利用規約を回避する方法でもありません。
どこで使われるか
- セラー間の価格比較 — 同じ商品の各セラーのバリエーションを並べて、実際に最も安く、在庫があるのはどこかを確認する。
- ディスカウント価格とカタログのリサーチ — 低価格を軸に構築されたマーケットプレイスで、キーワードやカテゴリ別の価格・品揃えのトレンドを追跡する。
- バリエーションと在庫のモニタリング — 特定のサイズ/カラー/セラーの組み合わせについて、価格変動や在庫切れを時系列で監視する。
出典
さっそく始める
まずは無料で試す: 任意の公開URLを無料Webスクレイパーに通すか、アンチボットチェッカーでサイトがボットをブロックするかどうかを確認しましょう — サインアップ不要です。
Playgroundで検索・商品詳細の各エンドポイントをテストし、APIドキュメントでリクエストとレスポンスのスキーマを確認し、料金ページでクレジットコストも確認しましょう。Wishは、私たちが扱う他のサードパーティマーケットプレイスと並ぶ存在です — クローゼット・ソーシャルセリング側についてはPoshmarkをスクレイピングする方法とMercariをスクレイピングする方法を、別のピアツーピアマーケットプレイスについてはVintedをスクレイピングする方法をご覧ください。あわせてWebスクレイピングapiの選び方とWebスクレイピングは合法かもご覧ください。
よくある質問
Wishの検索はページネーションに対応していますか?
はい — /wish/searchは実際のオフセットベースのページネーションを使用します。offsetは最初のページで使用したcount(デフォルトは30)の正確な倍数である必要があり、offsetが0以外の場合、ページ送りするたびに追加で1回分の上流リクエストが発生します。一致する結果がないクエリでも、空のproducts配列を伴う通常の200が返ります。
APIでWish商品のすべてのバリエーションを取得できますか?
はい — /wish/product/{id}は、購入可能なすべてのサイズ/カラー/セラーのバリエーションを返し、それぞれに独自の価格・通貨・在庫・セラーが紐づきます — SKUが1つしかない商品でも要素1つのリストが返ります。
Wish APIの利用にアカウントやAPIキーは必要ですか?
呼び出し側にWishのアカウントやAPIキーは不要です — 必要なのはCrawloraのAPIキーのみです。