2026年にWalmartの商品を調査する際、個人で65インチテレビの値下げを追う場合でも、EC担当者が価格・在庫・レビューの変化を継続的に把握する場合でも、すべての商品ページを毎日手作業で確認するのは現実的ではありません。Pythonとウェブスクレイピングの基礎知識があれば、定型的な確認作業を自動化し、分析に必要なデータを効率よく収集できます。
私は長年、ビジネスユーザー向けの自動化・AIツールを開発してきました。Walmartスクレイピングは、商品調査に伴う反復作業をコードで効率化する方法の一つです。本記事では、Walmartスクレイピングの基本、2026年のビジネスにおける活用場面、Pythonでの実装手順を、実際のコード例とともに解説します。
Walmartスクレイピングの仕組みと2026年の前提
Walmartスクレイピングとは、Walmartのウェブサイトから商品情報・価格・レビューなどを自動で抽出する手法です。手作業でコピーする代わりに、Pythonスクリプトでページを取得し、必要なデータを抽出して保存します。
Pythonは、Requests、BeautifulSoup、pandasなど、ページ取得・HTML解析・データ整理に使えるライブラリが充実しています。コードが比較的読みやすく、個人の小規模な検証からチームでの処理まで段階的に組み立てやすい点が特徴です。
ただし、個人利用として数商品の価格を追跡する場合と、ビジネス利用として数千SKUを競合調査で監視する場合では、必要な設計や運用負荷が大きく異なります。参照先では、2026年時点でWalmartが一般向けの公式スクレイピングAPIを公開していないとされているため、対象ページの構造やアクセス条件を踏まえた実装が必要です(参考)。
Walmartスクレイピングの主な業務用途と価値
Walmartはアメリカ最大の小売チェーンで、オンライン売上も2023年に820億ドル超に到達し、EC比率も**全体の約18%**まで拡大しています(参考)。そのため、商品、価格、レビュー、トレンドに関するデータを分析できる対象として注目されています。
Walmartスクレイピングの主な業務用途は次のとおりです。
- 価格監視・競合分析:Walmartの価格やプロモーション、商品ラインナップの変化を把握し、自社の価格戦略を検討する材料にする(参考)。
- 商品リサーチ・市場トレンド分析:Walmartの品揃えや仕様、カテゴリの動きを分析し、新規商品や市場機会の検討に用いる(参考)。
- 在庫・ストック状況の把握:在庫切れや補充状況を追跡し、需要予測や供給計画の判断材料にする(参考)。
- レビュー・顧客の声分析:レビューを収集・分析し、商品改善や課題把握に活用する(参考)。
- マーケティング・コンテンツ最適化:「ベストセラー」商品や訴求ポイント、コンテンツの構成を調査する(参考)。
- 出品者・ベンダー分析:有力なサードパーティ出品者や無許可出品の把握に用いる(参考)。

下の表は、主な活用例、対象部門、期待される業務効果を整理したものです。
| 活用例 | 対象部門 | 主な効果・ROI |
|---|---|---|
| 価格監視 | 価格・営業チーム | 競合価格の即時把握、動的価格設定、利益率維持 |
| 品揃え・カタログ分析 | 商品企画・MD | 品揃えの隙間発見、新商品投入、カタログ充実 |
| 在庫状況トラッキング | オペレーション・SCM | 需要予測精度向上、欠品回避、流通最適化 |
| レビュー・顧客の声 | 商品開発・CX | データに基づく商品改善、顧客満足度向上 |
| 市場トレンド分析 | 戦略・市場調査 | トレンド把握、戦略立案、新規参入判断 |
| コンテンツ・価格戦略 | マーケ・EC | 価格最適化、効果的なコンテンツ学習 |
| 出品者監視 | 営業・パートナー | パートナー発掘、ブランド保護、無許可出品監視 |
手作業で多数のページを巡回する代わりに、スクリプトで処理を自動化すれば、より多くの商品を同じ手順で収集できます。参照先では、数千件のリストを短時間で取得できる可能性が示されていますが、実際の処理時間は対象ページ、アクセス制限、実行環境によって異なります(参考)。
AIでWalmartデータをスクレイピング Walmartの商品・価格・レビュー情報を2クリックで取得。コード不要。 Get Started Free
Walmartスクレイピングは、EC、営業、市場調査チームが定型的なデータ収集を効率化する手段になります。取得したデータの品質を検証し、分析や意思決定に利用できる状態へ整えることが重要です。
Pythonで始めるwalmartスクレイピング:準備するもの
最初にPythonの実行環境と、ページ取得・解析・出力に使うライブラリを準備します。この記事で使用するものは次のとおりです。
- Python 3.9以上(本文のコード例が想定する範囲。2026年時点では3.12や3.13が候補です)
- Requests:ウェブページ取得用
- BeautifulSoup (bs4):HTML解析用
- pandas:データ整理・エクスポート用
- json:JSONデータ処理(標準搭載)
- 開発者ツール付きブラウザ:ページ構造の確認(F12キー)
- pip:パッケージ管理
インストールコマンド:
pip install requests beautifulsoup4 pandas
プロジェクトごとに依存関係を分ける場合は、仮想環境を作成します。
python3 -m venv walmart-scraper
source walmart-scraper/bin/activate # Mac/Linux
# または
walmart-scraper\Scripts\activate.bat # Windows
動作確認:
import requests, bs4, pandas
print("Libraries loaded successfully!")
このメッセージが出れば準備OKです。
ステップ1:Pythonでwalmartスクレイパーのセットアップ
まずは作業環境を整えましょう:
- プロジェクト用フォルダ作成(例:
walmart_scraper/) - エディタを開く(VSCode、PyCharm、Notepad++など)
- 新しいスクリプト作成(例:
walmart_scraper.py)
テンプレート例:
import requests
from bs4 import BeautifulSoup
import pandas as pd
import json
これでWalmartの商品ページ取得の準備ができました。
ステップ2:PythonでWalmart商品ページを取得
WalmartのHTMLはrequests.get(url)で取得できます。ただし、自動アクセスが制限される場合があるため、対象サイトの利用条件とアクセス頻度を踏まえて実行します。
リクエストには、User-AgentやAccept-Languageなど、通常のHTTP通信で必要となるヘッダーを明示します。
例:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"
}
response = requests.get(url, headers=headers)
html = response.text
requests.Session()を使うとCookieや共通ヘッダーを同じセッション内で維持できます。
session = requests.Session()
session.headers.update(headers)
session.get("<https://www.walmart.com/>") # Cookie取得
response = session.get(product_url)
取得後はresponse.status_codeが200かを検証します。CAPTCHAや想定外のページが返った場合は処理を停止し、リクエスト間隔、対象範囲、利用条件を見直します。IPを切り替えて取得を継続する前に、対象サイトと利用サービスの規約を照合する必要があります。Walmartでは複数の信号を用いた自動アクセス対策が使われているとされています(詳細)。
Walmartのボット対策への対応
Walmartでは、AkamaiやPerimeterXなどのサービスを含む仕組みにより、IP、ヘッダー、Cookie、TLS指紋などが判定に使われているとされています。アクセスを設計する際は、次の点を検討します。
- 用途に合ったヘッダーを設定する
- リクエスト間隔を3〜6秒空ける
- 遅延をランダム化する
- 大量取得時は、契約条件に合うプロキシの利用を検討する
- CAPTCHAが表示されたら処理を停止する
curl_cffiなどのライブラリが選択肢になる場合もあります。ただし、必要な対策は対象ページ、アクセス量、実行環境によって異なるため、ヘッダーと遅延だけで十分とは限りません。
ステップ3:BeautifulSoupでWalmart商品データを抽出
次に、取得したレスポンスから商品データを抽出します。Walmartの商品ページでは、Next.jsの<script id="__NEXT_DATA__">タグ内に商品情報を含むJSONが配置される構成が見られます。ただし、この構造はページ種別やサイト更新によって変わる可能性があります。
取得例:
from bs4 import BeautifulSoup
import json
soup = BeautifulSoup(html, "html.parser")
script_tag = soup.find("script", {"id": "__NEXT_DATA__"})
if script_tag:
json_text = script_tag.string
data = json.loads(json_text)
このdataから商品情報を取得します。本文で想定する商品ページの例では、次のパスを使用します。
product_data = data["props"]["pageProps"]["initialData"]["data"]["product"]
必要な項目を抽出:
name = product_data.get("name")
price_info = product_data.get("price", {})
current_price = price_info.get("price")
currency = price_info.get("currency")
rating_info = product_data.get("rating", {})
average_rating = rating_info.get("averageRating")
review_count = rating_info.get("numberOfReviews")
description = product_data.get("shortDescription") or product_data.get("description")
JSONを使うと、画面上の個別HTML要素を一つずつ解析する場合より、関連データをまとめて扱いやすいことがあります。一方で、JSONのキーや階層も変更される可能性があるため、値が取得できない場合に備えた検証が必要です。ページ上に表示されていない項目が含まれる場合もあります(参考)。
動的コンテンツやJSONデータの扱い
レビューや在庫状況などは、JavaScriptや内部通信を通じて動的に読み込まれる場合があります。__NEXT_DATA__に含まれる項目はページによって異なるため、必要な値が見つからない場合は、ブラウザの開発者ツールで通信内容を調べます。確認したエンドポイントへリクエストを送る場合も、認証条件、対象サイトの利用規約、アクセス頻度を踏まえて設計します。
ステップ4:Walmartデータの保存・エクスポート
抽出したデータはCSVやExcel、JSONなどで保存できます。pandasを使った例:
import pandas as pd
product_record = {
"商品名": name,
"価格(USD)": current_price,
"評価": average_rating,
"レビュー数": review_count,
"説明": description
}
df = pd.DataFrame([product_record])
df.to_csv("walmart_products.csv", index=False)
複数商品を取得する場合は、各レコードをリストに追加し、最後にDataFrameへ変換します。
Excelならdf.to_excel("walmart_products.xlsx", index=False)(openpyxlが必要)、JSONならdf.to_json("walmart_products.json", orient="records", indent=2)。
出力後の検証: エクスポートしたファイルを開き、必要な列に値が入っているかを照合します。キー名の変更などにより、すべての値が「None」になる場合があります。
ステップ5:walmartスクレイパーの拡張・スケールアップ
複数商品ページを一括取得するには、URLをリスト化して順番に処理します。
product_urls = [
"<https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/720559357>",
"<https://www.walmart.com/ip/SAMSUNG-65-Class-QLED-4K-Q60C/180355997>",
# ...他のURL
]
all_records = []
for url in product_urls:
resp = session.get(url)
# ...前述の抽出処理...
all_records.append(product_record)
time.sleep(random.uniform(3, 6)) # アクセス間隔を調整
URLリストがない場合は、検索結果ページから商品リンクを抽出し、順次処理する方法もあります(参考)。
注意: 短時間に多数のページへアクセスすると、IPブロックやCAPTCHAが発生しやすくなります。プロキシが必要かどうかは、取得規模、対象サイトの規約、利用するサービスの契約条件に応じて判断します。
プロキシやスクレイパーAPIの活用
プロキシを使うと、契約したサービスの範囲内で接続元IPを切り替えられます。リクエスト時には次のように指定します。
proxies = {
"http": "<http://your.proxy.address>:port",
"https": "<https://your.proxy.address>:port"
}
response = session.get(url, proxies=proxies)
大規模な処理では、スクレイパーAPIも選択肢になります。プロキシ管理、CAPTCHA対応、JavaScriptレンダリングなどを提供するサービスがありますが、対応範囲は製品、プラン、対象サイトによって異なります。URLを送信して結果を受け取る方式は、基盤を自作せずに処理を始めたい場合に向いています。
比較表:
| アプローチ | メリット | デメリット | おすすめ用途 |
|---|---|---|---|
| Python+プロキシ自作 | 柔軟・小規模なら低コスト | 保守・プロキシ費用・ブロックリスク | 開発者・カスタム用途 |
| サードパーティスクレイパーAPI | 対応範囲内でプロキシ管理や大規模処理を委ねやすい | 大量利用時はコスト増・柔軟性低 | ビジネス・大規模・迅速なデータ取得 |
開発環境を用意せずにデータ取得を試したい場合は、ThunderbitのAIウェブスクレイパー拡張機能も候補になります。対象ページが製品の対応範囲にある場合、画面上の操作から取得を始められ、コードや自前のプロキシ設定にかかる作業を減らせます。まず1ページで抽出項目、取得精度、出力結果を検証してから利用範囲を広げます。
Thunderbit AIウェブスクレイパーでWalmartを試す
Walmartスクレイピングの主な課題と対応方針
Walmartスクレイピングでは、アクセス制限、ページ構造の変更、データ量、利用条件などを運用前に整理する必要があります。主な課題と対応方針は次のとおりです。
- 強力なボット対策:IP・ヘッダー・Cookie・TLS指紋・JavaScriptチェックなど。→用途に合うヘッダー、セッション、遅延を設定し、プロキシは規約と契約条件を踏まえて検討する(詳細)。
- CAPTCHA:頻繁に表示される場合は処理を停止する。外部サービスを利用する場合は、費用と利用条件を比較する(詳細)。
- サイト構造の変更:JSON構造が変わった場合は、取得結果を記録して抽出処理を修正する。処理をモジュール化すると、変更箇所を切り分けやすい。
- ページネーション・サブページ:多数のページを処理する場合はページ送りと終了条件を実装する(参考)。
- データ量・レート制限:大規模取得ではバッチ処理や途中保存を取り入れ、全件を一度にメモリへ保持しない。
- 法的・倫理的配慮:公開ページ上のデータであっても、取得・保存・利用の可否は対象データ、利用目的、管轄、Walmartの利用規約によって異なる。商用利用では、アクセス頻度、著作権、個人情報、サーバー負荷を含めて事前に整理する。
管理型ツールへの切り替え時期は? CAPTCHA対応や保守に継続的な工数がかかる場合は、ThunderbitやスクレイパーAPIなどを比較対象にします。ノーコードツールは、開発担当者を置かずに小規模な取得を試したいチームの候補になりますが、対象ページ、取得量、必要な制御によって適否は異なります(Thunderbitの事例)。
Pythonによるwalmartスクレイピング:フルコード例
ここまでの内容をまとめた、Walmart商品ページ用のPythonスクリプト例です:
import requests
from bs4 import BeautifulSoup
import json
import pandas as pd
import time
import random
# セッションとヘッダー設定
session = requests.Session()
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"
})
# Cookie取得のためホームページ訪問
session.get("<https://www.walmart.com/>")
# 取得対象URLリスト
product_urls = [
"<https://www.walmart.com/ip/Apple-AirPods-Pro-2nd-Generation/720559357>",
"<https://www.walmart.com/ip/SAMSUNG-65-Class-QLED-4K-Q60C/180355997>",
# 必要に応じて追加
]
all_products = []
for url in product_urls:
try:
response = session.get(url)
except Exception as e:
print(f"リクエストエラー: {url}: {e}")
continue
if response.status_code != 200:
print(f"取得失敗: {url} (ステータス {response.status_code})")
continue
soup = BeautifulSoup(response.text, "html.parser")
script_tag = soup.find("script", {"id": "__NEXT_DATA__"})
if not script_tag:
print(f"データスクリプトが見つかりません: {url}")
continue
try:
data = json.loads(script_tag.string)
except json.JSONDecodeError as e:
print(f"JSONパースエラー: {url}: {e}")
continue
try:
product_info = data["props"]["pageProps"]["initialData"]["data"]["product"]
except KeyError:
print(f"JSON内に商品データが見つかりません: {url}")
continue
name = product_info.get("name")
brand = product_info.get("brand", {}).get("name") or product_info.get("brand", "")
price_obj = product_info.get("price", {})
price = price_obj.get("price")
currency = price_obj.get("currency")
orig_price = price_obj.get("priceStrikethrough") or price_obj.get("price_strikethrough")
rating_obj = product_info.get("rating", {})
avg_rating = rating_obj.get("averageRating")
review_count = rating_obj.get("numberOfReviews")
desc = product_info.get("description") or product_info.get("shortDescription") or ""
product_record = {
"URL": url,
"商品名": name,
"ブランド": brand,
"価格": price,
"通貨": currency,
"元値": orig_price,
"平均評価": avg_rating,
"レビュー数": review_count,
"説明": desc
}
all_products.append(product_record)
# ランダム遅延でブロック回避
time.sleep(random.uniform(3.0, 6.0))
df = pd.DataFrame(all_products)
print(df.head(5))
df.to_csv("walmart_scrape_output.csv", index=False)
カスタマイズ例:
product_urlsにURLを追加- 抽出項目をニーズに合わせて調整
- 遅延時間もリスクに応じて調整
このコード例は、本文で示したJSON階層を前提としています。商品ページの構造が変わった場合は、エラーログとレスポンス内容を記録し、キーの位置や取得項目を見直してください。
まとめ:Walmartスクレイピングを段階的に導入する
本記事の要点は次のとおりです。
- Walmartスクレイピングは、価格・商品・レビュー情報の収集を効率化する手段です。競合分析、商品開発、価格戦略の判断材料を整える用途に使えます。
- Pythonによる実装:Requests、BeautifulSoup、pandasを組み合わせ、ページ取得、JSON解析、データ出力の流れを構築できます。
- アクセス制限への対応:ヘッダー、セッション、遅延、必要に応じたプロキシを検討し、CAPTCHAや想定外の応答が出た場合は処理を停止します。
__NEXT_DATA__のJSONからデータ抽出:本文のページ例では構造化データを利用できますが、キーや階層の変更を前提に検証処理を入れます。- pandasでCSV、Excel、JSONにエクスポートできます。
- 大規模化ではプロキシやスクレイパーAPIも比較対象になります。非開発者の場合、対象ページが対応範囲にあれば、ThunderbitのAIウェブスクレイパーでWalmartを含むサイトから2クリックで取得を始められます。ExcelやGoogle Sheets、Airtable、Notionへの出力にも対応していますが、利用できる出力先や無料枠の条件はプランによって異なります(詳細)。
最初は1商品を対象に、商品名、価格、レビュー数などの取得値を元ページと照合し、必要な出力形式で保存できるかを検証します。Walmartの利用規約、アクセス頻度、サーバー負荷にも配慮し、安定して取得できる条件を記録してから対象件数を増やします。コードの保守にかかる工数が大きい場合は、管理型ツールやAPIと比較してください。Thunderbitを利用する場合も、対象ページと現在の製品仕様に応じて抽出結果が異なるため、まず1ページで適合性を確かめられます(Chrome拡張はこちら)。
他のウェブスクレイピングガイドもチェック Thunderbitブログでウェブスクレイピングや自動化、AI活用術をさらに学べます。 Get Started Free
ウェブスクレイピングやデータ自動化、AI活用の実例は、Thunderbitブログでも紹介しています。
取得結果が安定しない場合は、レスポンス内容、ステータスコード、JSON構造を記録し、通信、ページ構造、抽出処理のどこで問題が起きているかを切り分けます。
Thunderbit AIウェブスクレイパーでWalmartを試す Get Started Free
よくある質問(FAQ)
1. PythonでWalmartのデータをスクレイピングするのは合法ですか?
合法性は、取得するデータ、利用目的、アクセス方法、契約条件、適用される法域によって異なります。公開ページ上のデータであっても、一律に問題がないとは限りません。Walmartの利用規約を読み、リクエスト頻度、サーバー負荷、著作権、個人情報、商用利用の条件を整理したうえで判断してください。
2. PythonスクレイピングでWalmartからどんなデータが取得できますか?
本文のページ例では、商品名、価格、ブランド情報、説明文、カスタマーレビュー、評価、在庫状況などが、<script id="__NEXT_DATA__">タグ内の構造化JSONに含まれる場合があります。取得できる項目とJSON階層は、ページ種別やサイト更新によって変わります。
3. Walmartのスクレイピングでブロックされないコツは?
ブロックを確実に回避できる方法はありません。用途に合うヘッダー、セッション維持、3〜6秒のランダム遅延、短時間の大量リクエストを避ける設計などを組み合わせ、CAPTCHAや想定外の応答が出た場合は処理を停止します。大規模案件では、契約条件に合うスクレイパーAPIやThunderbitのようなツールも比較対象になります。
4. 数百〜数千件のWalmart商品ページを一括取得できますか?
技術的には複数ページを順番に処理できますが、実行可能な件数はアクセス制限、リクエスト制御、対象サイトの規約、利用するプロキシやスクレイパーAPIの契約条件によって異なります。小規模なテストでエラー率と取得精度を測定してから、バッチ単位で対象を増やします。
5. コードが書けなくてもWalmartをスクレイピングできますか?
ThunderbitのAIウェブスクレイパー拡張機能は、コードを書かずにWalmartの商品ページからデータ取得を試したい場合の候補です。対象ページが現在の対応範囲にある場合、画面上で抽出項目を設定し、Excel、Notion、Sheetsなどへ出力できます。アクセス制限への対応、利用できる出力先、取得量は対象ページ、製品仕様、プランによって異なるため、最初に1ページで取得結果を検証してください。


