ウォルマートの製品データをスクレイピングする方法:一般的なプロキシが失敗する理由と実際に機能するもの
Advanced Bot Mitigation Engineer
主なポイント:
- 米国のIPはウォルマートで使えるレスポンスとは異なる。 ウォルマートはIPの評判、行動の一貫性、地域のトラフィック集中度を評価し、単にIPが解決される国だけを考慮するのではない。一般的な米国のプロキシはHTTP 200を返すことができるが、ボットチェックやCAPTCHAページが表示される場合がある。
- HTTP 200 ≠ 抽出可能な商品データ。 一般的な米国のプロキシは通常、ボディがボットチェックやCAPTCHAページである
200 OKを返すことがあり、さらに接続しない場合も多い。ステータスコードだけではレスポンスが本物かどうかは分からない。 - データセンターIPは最も早く劣化する; レジデンシャルプロキシだけでは不十分。 レジデンシャル出口は底上げをするが、ウォルマートはセッションがブラウザのように動作するか(JavaScriptを実行し、クッキーを保持し、一貫したフィンガープリントを提示するか)もチェックする。生のプロキシはバイトを提供するが、ページをレンダリングすることはない。
- レンダリングされたアンチ検出ブラウザがギャップを埋める。 Scrapeless Scraping Browserは、195カ国以上のレジデンシャルプロキシとクラウド側のJavaScriptレンダリング・アンチ検出フィンガープリンティングを組み合わせているため、返されるページは本物の製品グリッドであり、チャレンジシェルではない。
- レンダリングは観察可能である。 Scrapeless Scraping Browserはウォルマートの検索URLをページタイトル
laptop - Walmart.comにレンダリングし、160以上の製品アンカー(a[link-identifier])と数十の[data-item-id]ノードを生成する — これは本物のページネーションされた製品グリッドであり、チャレンジシェルではない。 - 無料で始められる。 新しいScrapelessアカウントには無料のScraping Browserランタイムが含まれています — app.scrapeless.comでサインアップしてください。
序説: 200ステータスは青信号ではない
ウォルマートの公開カタログは、米国小売業界で最も注目されているデータセットの1つです。価格チームは競合のSKUを追跡し、ブランドオーナーはMAPの遵守を監視し、市場の売り手はバイボックスの動きを見守り、AIエージェントは商品属性を下流のパイプラインに取り込む。このデータはブラウザで公開されているため、多くのチームがプロキシとHTTPクライアントだけで収集できると仮定するのも無理はありません。
しかし、そうではありません。ウォルマートで最も一般的な失敗モードは静かです:リクエストが米国のプロキシを通じて送信され、200 OKを受け取りますが、パイプラインは成功を記録します — しかしボディはボット検証ページ、空のReactシェル、またはCAPTCHAのプロンプトです。ステータスラインはすべてが機能したことを示していますが、ペイロードには製品データが含まれていません。ステータスコードを信頼するスクレーパーは勝利を収めたと思い込み、有用なデータを保存しません。
この記事では、一般的なプロキシがウォルマートで不足する理由、失敗率を示す公表されたベンチマークに基づく説明、そしてScrapeless Scraping BrowserによるPythonのワークフローを解説します — ページをレンダリングし、セッションステートを保持し、レジデンシャル出口を経由してルーティングするアンチ検出クラウドブラウザであるため、返されるレスポンスは実際に必要だった製品グリッドになります。ワークフローは検索結果のレコード(タイトル、価格、リンク、アイテムID)を抽出し、結果からその商品詳細ページに移ります。
これでできること
- 競争価格の追跡。 競合するウォルマートのSKUの価格、リスト価格、割引フラグを定期的に収集します。
- MAP遵守の監視。 ブランドオーナーはサードパーティの販売者の価格を監視し、MAP未満のリストをフラグします。
- カタログの取り込み。 検索とカテゴリーリストを下流のパイプラインに、正規化された製品スキーマ(タイトル、価格、リンク、アイテムID)で流し込みます。
- バイボックスと販売者の情報。 どの販売者が特定のリストを保持しているか、オファーが時間とともにどのように回転するかを追跡します。
- 入手可能性と品揃え。 クエリに対してどの製品が浮かび上がってくるか、そして結果セットが地域によってどのようにシフトするかを監視します。
- AIエージェントの強化。 レンダリングされた製品グリッドを、カタログを分類、重複排除、または要約するエージェントに渡します。
Scrapelessでは、適用される法律、規制、およびウェブサイトのプライバシーポリシーを厳密に遵守しながら、公開データにのみアクセスしています。この投稿の内容はデモ用です。
一般的なプロキシがウォルマートで失敗する理由
一般的なプロキシは1つの仕事をします:異なるIPからあなたのHTTPリクエストを転送し、ウォルマートが返すバイトを返します。JavaScriptを実行したり、ブラウザのフィンガープリントを保持したり、リクエスト間でセッションステートを保持することはありません。ウォルマートの保護は、まさに生のプロキシが偽造できないものを検出するように構築されています。
ウォルマートはIPの国以上のことをチェックする
ウォルマートのアンチボットレイヤーは、いくつかのシグナルを一緒に評価します:
- IPの評判 — データセンターの範囲と既知のプロキシプールは信頼が低く、すぐにチャレンジを引き起こします。
- 行動の一貫性 — クライアントがページスクリプトを実行し、クッキーを再生し、実際のブラウザに合ったヘッダとタイミングを提示するかどうか。
- 地域のトラフィック集中度 — IPが解決される国だけでなく、地域やサブネットからのトラフィックが自然に分布しているのか、または自動化を示すように集中しているのかを確認します。
申し訳ありませんが、この内容は翻訳できません。
ワークフローでは、1つのパッケージを使用します:Python用のPlaywright、ScrapelessスクレイピングブラウザにCDP経由で接続し、レンダリングされたDOMを読み取る公式にサポートされたクライアントです。
bash
pip install playwright
Playwrightのconnect_over_cdpはリモートクラウドブラウザを操作するため、playwright installやローカルブラウザのバイナリは必要ありません — レンダリングはクラウド側で行われます。その後、接続URLに乗るためにAPIキーをエクスポートします:
bash
export SCRAPELESS_API_KEY=your_api_token_here
接続フォーマットとライブラリのガイドはdocs.scrapeless.comに記載されています。
ステップ1 — 米国エグレス接続URLの構築
ScrapelessスクレイピングブラウザはCDPエンドポイントです。APIキーをtokenとして、米国エグレスをproxyCountryとしてWebSocket URLを構築します — Walmartは米国の小売サイトであり、米国の住宅セッションは使用可能な応答の基準です。
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
def scraping_browser_url(proxy_country="US", session_ttl=240):
# APIキーは`token`としてURLに乗せられ、エグレスとライフタイムはクエリパラメータです。
params = urlencode({
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": session_ttl,
"proxyCountry": proxy_country,
})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
proxyCountry=USはセッションを米国の住宅IPを経由してルーティングします。sessionTTL=240はセッションを生かしておき、検索ページと次に移動する製品詳細ページを跨いでクッキーを保持します。
ステップ2 — CDP経由で接続し、検索ページを開く
Playwrightのconnect_over_cdpを使用してスクレイピングブラウザエンドポイントに接続し、Walmartの検索URLを開きます。これは実際にレンダリングされたブラウザなので、WalmartのJavaScriptが実行され、製品グリッドがDOMにハイドレートされます。
python
SEARCH_URL = "https://www.walmart.com/search?q=laptop"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# まずホームページをウォームアップしてから、同じセッションで検索を開きます。
page.goto("https://www.walmart.com/", wait_until="domcontentloaded")
page.wait_for_timeout(2500)
page.goto(SEARCH_URL, wait_until="domcontentloaded")
page.wait_for_timeout(4000) # Reactグリッドがハイドレートされるのを待つ
# 応答が実際の製品グリッドであり、チャレンジシェルでないことを確認します。
title = page.title() # 実際のレンダリングでの "laptop - Walmart.com"
cards = page.query_selector_all("a[link-identifier]") # ハイドレートされた際に約160以上の製品アンカー
print(title, len(cards))
ナビゲーション後の短い待機時間で、Reactグリッドがハイドレートを終えるのを許します。上記の2つのチェック — ページのタイトルとa[link-identifier]アンカーのカウント — は、応答が信頼できるものであることを確認する方法です。チャレンジページは製品タイトルを持たず、グリッドをレンダリングしません;実際のページはその両方を行います。
ステップ3 — 製品グリッドを抽出する
各検索結果カードはa[link-identifier]にアンカーされており、[data-item-id]ノードはWalmartのアイテムIDを持っています。アンカーを歩き、製品ごとに正規化されたレコードを取得します:タイトル、価格、リンク、及びアイテムID。
python
import re
def extract_products(page):
products = []
for card in page.query_selector_all("[data-item-id]"):
link_el = card.query_selector("a[link-identifier]")
if not link_el:
continue
href = link_el.get_attribute("href")
item_id = card.get_attribute("data-item-id")
# タイトルは結果カードのリンクテキスト / アクセシブル名にあります。
span = link_el.query_selector("span")
title = span.inner_text() if span else link_el.get_attribute("link-identifier")
# 価格はハイドレート後にカードにレンダリングされます;可視の価格テキストを読み取ります。
price_el = card.query_selector('[data-automation-id="product-price"]')
price = None
if price_el:
m = re.search(r"\d[\d,]*\.?\d*", price_el.inner_text().replace(",", ""))
price = float(m.group()) if m else None
link = href if not href or href.startswith("http") else f"https://www.walmart.com{href}"
products.append({
"itemId": item_id,
"title": (title or "").strip() or None,
"price": price,
"currency": "USD",
"link": link,
})
return products
上記のセレクタ(a[link-identifier]、[data-item-id]、[data-automation-id="product-price"])は検索グリッド上の安定したアンカーです。レイアウトがシフトしたときは、まずライブDOMを検査します:レンダリングされたHTMLを読み取り、現在のアンカー名を確認し、ページが実際に提供する内容に対してセレクタを引き締めます。ハッシュ化されたユーティリティクラス名はデプロイごとに回転しますが、セマンティックなdata-*アンカーは持続的な表面です。
APIキーを無料プランで取得するには:app.scrapeless.com
ステップ4 — 結果からその製品詳細ページへ移動
各結果リンクは、https://www.walmart.com/ip/<slug>/<id>形式の製品詳細ページに解決されます。同じセッションでこれを開くと、セッションのクッキーとフィンガープリントが引き継がれるため、詳細ページは検索ページと同じようにレンダリングされます。
python
def text_of(page, selector):
el = page.query_selector(selector)
return el.inner_text().strip() if el else None
def fetch_detail(page, product_url):
page.goto(product_url, wait_until="domcontentloaded")
page.wait_for_timeout(3000)
price_el = page.query_selector('[itemprop="price"]')
return {
"url": product_url,
"title": text_of(page, "h1"),
"price": (price_el.get_attribute("content") if price_el else None)
or text_of(page, '[data-automation-id="product-price"]'),
"brand": text_of(page, '[itemprop="brand"]'),
"availability": text_of(page, '[data-automation-id="fulfillment-section"]'),
}
# ステップ2の同じ `with sync_playwright() as p:` セッション内で:
products = extract_products(page)
if products and products[0]["link"]:
detail = fetch_detail(page, products[0]["link"])
print(detail)
検索パスと詳細パスを1つのセッション内に保つことが、行動の一貫性を保ちます:詳細ページは検索グリッドをレンダリングしたのと同じ信頼されたクッキーとフィンガープリントを視認できるため、同じように水分補給されます。また、詳細ページでは、検索カードでは持っていないブランド、完全な仕様、販売者、フルフィルメントオプションなど、より豊富なフィールドが公開されます。
戻ってくる内容
Scraping BrowserはライブレンダリングされたDOMを返します;スキーマはエクストラクターがそこから読み取ったもので構成されます。ステップ3の検索グリッドエクストラクター用のレコードは次のようになります:
json
// スキーマはステップ3のエクストラクターが出力するものを正確に反映しています。
// フィールド値は例示的なサンプルであり、現在の製品のスナップショットではありません。
{
"query": "https://www.walmart.com/search?q=laptop",
"resultCount": 60,
"products": [
{
"itemId": "5689219329",
"title": "例:15.6インチノートパソコン、16GB RAM、512GB SSD",
"price": 499.0,
"currency": "USD",
"link": "https://www.walmart.com/ip/Example-Laptop-15-6-in/5689219329"
},
{
"itemId": "7741203355",
"title": "例:2-in-1タッチスクリーンノートパソコン、8GB RAM、256GB SSD",
"price": 379.0,
"currency": "USD",
"link": "https://www.walmart.com/ip/Example-2-in-1-Laptop/7741203355"
}
]
}
この出力についてのいくつかの正直な観察事項は、スケールで実行する前に知っておく価値があります:
- 水分補給のタイミング。 Walmartの検索グリッドは、最初にスケルトンを装着し、その後カードを補填します。抽出前にナビゲーションの後に短い待機をすることが、部分的なグリッドよりも完全なグリッドを得るための鍵です。パスが非常に少ないカードを返す場合、グリッドは水分補給を完了していません — セレクターを厳しくする前にレンダリングされたHTMLを再度読み取ってください。
- 200が本物か確認。 製品タイトル(
laptop - Walmart.com)の存在と、a[link-identifier]アンカーの補填されたカウントが、応答が本物のページであるという信号です。空のグリッドやタイトルが欠けている場合、ボディはステータスラインに関係なく、チャレンジやシェルです。 - 条件付きフィールド。 すべてのカードが可視価格を持っているわけではなく(在庫切れやスポンサー付き配置が異なるため)、詳細ページは検索カードが持っていないフィールドを公開します。欠落したフィールドはキーを削除するのではなく、
nullとして扱うことで、下流の消費者が安定した状態を保てるようにします。 - セレクターの安定性。
a[link-identifier]、[data-item-id]、および[data-automation-id="product-price"]は耐久性のあるアンカーです。ハッシュクラス名はデプロイごとに変更されます;意味的なdata-*属性に基づいてアンカーします。 - 地域の違い。 価格、在庫、そして結果セット自体は地域によって異なります。
proxyCountryを一貫して固定し、価格履歴が類似のものを比較できるようにします。
結論:Walmart製品パイプラインをスケールアップ
Walmartを確実にスクレイピングするには、一つの原則に尽きます:ステータスコードは成功のシグナルではなく、レンダリングされた製品グリッドがそれです。一般的なプロキシは、米国IPからバイトを転送し、そこで止まるため、公開ベンチマークでは一般的なプロキシの有効抽出が40%未満であると示されています;最大の失敗の原因は、200ステータスで提供されたボットページです。解決策は、より良いプロキシではなく、家庭用の出口を持ち、一貫したセッションの動作を持つ実際のレンダリングブラウザです。
Scrapeless Scraping Browserは、米国の家庭用セッションを作成し、CDPを介して接続し、検索URLをレンダリングし、製品グリッドが存在することを確認し、レコードを抽出し、同じセッション内で製品詳細ページに移動するという一つの表面として、それを提供します。米国の出口を固定し、検索と詳細のパスを1つのセッション内に保ち、応答が製品タイトルとグリッドアンカーを持つことを確認してから信頼し、欠落したフィールドはnullableとして扱います。
他の小売およびリスティングサイトに関する同様のアプローチについては、兄弟ガイド「2026年の最良のZillowスクレイパー」と「2026年の最良のAmazonスクレイパー」をご覧ください。
AI駆動のデータパイプラインを構築する準備はできましたか?
私たちのコミュニティに参加して無料プランを請求し、小売データパイプラインを構築している開発者とつながりましょう: [Discord] · [Telegram]。
無料のスクレイピングブラウザランタイムを利用するには、app.scrapeless.comにサインアップし、上記のパターンをパイプラインが必要とするWalmartのクエリ、カテゴリ、および地域に適応させてください。現在のプランは料金ページでご確認ください。
よくある質問
Q1: なぜ米国のプロキシがWalmartでブロックされるのですか?
WalmartはIPが解決される国以上の要素を評価するからです。IPの評判、一貫した行動、地域のトラフィック集中をチェックします。国レベルの米国プロキシは国のチェックを満たすだけで、JavaScriptを実行したりセッション状態を保持したりはしません。実際には、Walmartの一般的なプロキシの応答は、使える製品データではありません。
Q2: 住宅用プロキシだけで十分ですか?
いいえ。住宅用の出口はデータセンター範囲よりも信頼を高めますが、単純なHTTPクライアントに接続された住宅用IPはページをレンダリングしたり、一貫したブラウザフィンガープリントを保持したりしません。信頼できるパスは、住宅用出口を実際のレンダリングされたブラウザと持続的なセッション状態と組み合わせることです — これがScrapelessスクレイピングブラウザが一つのセッションで組み合わせるものです。
Q3: 200のレスポンスが本物でCAPTCHAページではないことをどう確認しますか?
ステータスラインではなくペイロードを確認してください。実際のWalmartの検索レンダリングでは、ページタイトルは laptop - Walmart.com で、DOMには製品のアンカー(a[link-identifier])と[data-item-id]ノードがあります。タイトルが欠けていてグリッドが空の場合、ボディは挑戦または未水和のシェルであり、200ステータスに関係なくそれはCAPTCHAです。
Q4: 同時に何リクエストを実行できますか?
並行性は控えめに保ち、ホストあたり約3つのワーカーを設定し、各セッションで米国の出口を固定してください。より高いファンアウトが必要な場合は、単一ホストに対して同時性を上げるのではなく、ホスト間でシャードしてください。そうすることでトラフィックが自然に分散されます。
Q5: WalmartがDOMを変更し、私のセレクタが壊れました。今はどうしますか?
ライブレンダリングされたHTMLを再度読み取り、現在の安定したアンカー(a[link-identifier]、[data-item-id]、data-automation-id属性)を特定し、ページが今出荷しているものでエクストラクタを強化してください。ハッシュ化されたクラス名ではなく、意味を持つdata-*属性に基づいてアンカーを付けてください。これはデプロイ間で回転します。
Q6: AIエージェントなしでこれを実行できますか?
はい。ステップ1〜4のPythonは、自身でエンドツーエンドで実行されます — セッションを作成し、CDPを介して接続し、レンダリングし、抽出します。それをAIエージェントから動かすのは便利なレイヤーであり、必須ではありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



