ウォルマートは、10,000 か国に 24 店舗以上を展開する世界最大の小売業者です。ウォルマートはその膨大な在庫と豊富な商品データを考慮すると、Web スクレイピングの対象として非常に貴重です。
この包括的なガイドでは、ウォルマートの製品データを大規模に抽出するための Web スクレイパーを構築する方法を説明します。
概要
ここで説明する主要な手順の概要を次に示します。
- スクレイピングする製品を見つける
- ウォルマート検索 API の使用
- カテゴリページの解析
- 結果の制限への対処
- 製品ページのスクレイピング
- 製品データの解析
- スクレイピングメディア、価格、仕様など
- ブロッキングの回避
- 遅延のランダム化
- プロキシの使用
- 実際のブラウザを模倣する
- すべてをまとめる
- 検索API → 製品URL → スクレイピング
- 大きな結果セットの処理
最終的には、数千の商品を抽出できる完全に機能する Python の Walmart スクレーパーが完成します。始めましょう!
使用します Python いくつかの主要なパッケージとともに:
- リクエスト – Walmart の API および Web ページへの HTTP リクエストを行うため
- 美しいスープ4 – HTML解析
- パンダ – データ操作用
pip 経由でインストールします。
pip install requests beautifulsoup4 pandas
私たちも使います プロキシ ブロックを回避するためのもので、さまざまなプロバイダーから購入できます。
スクレイピングする製品を見つける
最初のステップは、スクレイパーにフィードする製品の URL または ID を検出することです。使用できるアプローチがいくつかあります。
検索APIの使用
Walmart は、構造化された JSON データを返す検索 API を提供しています。この API にクエリを実行して、キーワードに一致する製品を見つけることができます。
「ラップトップ」で試してみましょう。
import requests
api_url = "https://www.walmart.com/terra-firma/api/search"
params = {
"query": "laptop",
"sort": "price_low",
"page": 1,
" affiliateId": "test",
}
response = requests.get(api_url, params=params)
data = response.json()
print(data["items"][0]["productId"])
# prints a product ID, e.g. 1GY23EA#ABA
この API は、以下を含む構造化された JSON 形式でページ分割された結果を返します。
productId
– その商品のウォルマートIDtitle
– 製品の名前description
– 短いテキストの説明price
– 現在の価格- そして、もっと...
ページを反復処理して ID とデータを収集できます。
制限の 1000 つは、API では最大 XNUMX 件の結果しか取得できないことです。さらに多くの範囲をカバーするには、他のアプローチも使用する必要があります。
カテゴリページの解析
Walmart では、解析できる閲覧可能なカテゴリ ページも提供しています。
https://www.walmart.com/browse/electronics/laptops/3944_3951_132959?povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&povid=113750++2019-11-04+15%3A05%3A24.517-06%3A00&affinityOverride=default
これらのページには、ウォルマートのサイトで見られる製品グリッドが含まれています。
製品を抽出するには、Beautiful Soup を使用します。
from bs4 import BeautifulSoup
import requests
url = "https://www.walmart.com/browse/electronics/laptops/3944_3951_132959"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
products = soup.select(".search-result-gridview-item")
for product in products:
title = product.select_one(".search-result-product-title").text
link = product.select_one(".search-result-product-title")["href"]
print(title, link)
これにより、グリッド/リスト ビューの製品が解析され、タイトルと URL が取得されます。
その後、URL を製品スクレーパーにフィードできます。
カテゴリ ページには、多数のページにまたがる数千の商品を含めることができるため、この方法は広範囲に適用されます。
限界への対処
検索 API とカテゴリ ページの間で、何万もの製品を見つけることができます。ただし、考慮すべき制限がいくつかあります。
- Search API では 1000 件の結果しか取得できません
- 各カテゴリ ページには最大 24 ページがあり、50 ページあたり最大 XNUMX 個の商品が含まれます
したがって、包括的なスクレイピングを行うには、創造性を発揮する必要があります。
- 絞り込みフィルターを使用して複数の検索クエリを使用する
- 複数のカテゴリページをスクレイピング
- 範囲を拡大します。電子機器全体のすべてのラップトップをスクレイピング
少し反復することで、スクレーパーへのフィードに適した 10,000 を超える製品 URL の大規模なコーパスを構築できます。
製品ページのスクレイピング
製品の URL または ID を取得したら、製品ページ自体からデータをスクレイピングできます。
Walmart の商品ページには、抽出できる豊富な情報が含まれています。
- タイトル説明
- 画像
- 価格、販売データ
- 仕様
- 販売者情報
- レビュー
- 関連製品
- 在庫状況
そして、もっと。
いくつかの重要な部分をスクレイピングしてみましょう。
スクレイピング製品の詳細
製品ページには、と呼ばれる JavaScript オブジェクトが含まれています。 window.__WML_REDUX_INITIAL_STATE__
多くの構造化データの場合:
<script>
window.__WML_REDUX_INITIAL_STATE__ = {
"product": {
"id": "1GY23EA#ABA",
"usItemId": "497219257",
"name": "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home",
"description": "A laptop with the performance you need and..."
...
}
...
}
</script>
これを抽出し、JSON を解析して次のようなフィールドを取得できます。
import json
import requests
from bs4 import BeautifulSoup
product_url = "https://www.walmart.com/ip/497219257"
response = requests.get(product_url)
soup = BeautifulSoup(response.text, ‘html.parser‘)
data = soup.find("script", {"id": "__WML_REDUX_INITIAL_STATE__"})
product_data = json.loads(data.contents[0])["product"]
title = product_data["name"]
walmart_id = product_data["usItemId"]
description = product_data["description"]
print(title)
# "HP 14-inch Laptop, Intel Core i3-1005G1, 4GB SDRAM, 128GB SSD, Pale Gold, Windows 10 Home"
この JSON フィールドには、抽出したい主要な製品情報のほとんどが含まれています。
メディアのスクレイピング
画像などの製品メディアは別のスクリプト ブロックに含まれており、 imageAssets
:
<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.imageAssets = [
{
"assetSize": "medium",
"assetUrl": "https://i5.walmartimages.com/...",
"baseAsset": {...},
"thumbnailUrl": "https://i5.walmartimages.com/..."
},
{...}
];
</script>
アセットをスクレイピングして反復処理して、さまざまなサイズの URL を見つけることができます。
images = []
for asset in product_data["imageAssets"]:
img_url = asset["assetUrl"]
images.append(img_url)
print(images[0])
# "https://i5.walmartimages.com/asr/e95444a3-2e8b-41d2-a585-4f3ea9fc51b6.345fba144e9df8a6d290b2ed3857e90b.jpeg"
これにより、すべての製品画像をさまざまな解像度で取得できるようになります。
価格と在庫のスクレイピング
価格や入手可能性などの重要な詳細については、データはさらに別のスクリプト タグに含まれています。
<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.priceInfo = {
"priceDisplayCodes": {
"rollback": true,
"reducedPrice": true
},
"currentPrice": {
"currencyUnit": "USD",
"price": 399
}
...
価格設定フィールドを解析できます。
price_data = product_data["priceInfo"]
regular_price = price_data["wasPrice"]["price"] # 499
sale_price = price_data["currentPrice"]["price"] # 399
on_sale = "rollback" in price_data["priceDisplayCodes"] # True
print(f"On sale for {sale_price}, regular {regular_price}")
また、在庫状況についても同様に、 availabilityStatus
:
in_stock = product_data["availabilityStatus"] == "IN_STOCK"
これらをすべて組み合わせると、製品の詳細、メディア、価格設定、在庫などのスクレーパーを構築できます。
ブロックを避ける
Walmart を大規模にスクレイピングすると、リクエストが多すぎるためブロックに遭遇する可能性があります。これを回避するためのヒントをいくつか示します。
リクエストレートの制限 – 最大 2 秒あたり 3 ~ XNUMX リクエストに固執する
遅延をランダム化する – リクエスト間にランダムな 2 ~ 5 秒の遅延を挿入します
ユーザーエージェントをローテーションする – 異なるデスクトップブラウザのユーザーエージェントになりすます
プロキシを使用する – 住宅用プロキシ サービスを介してトラフィックをルーティングします
ブロックの再試行 – ブロックされている場合は、スクレイピングを 30 分以上一時停止します
これらの予防策を講じることで、何千ものウォルマート製品を安全にスクレイピングすることができます。
一部の有料プロキシ サービスでは、ブロックを回避するための高度なローテーション IP とヘッダーも提供しています。これらは、大規模なスクレイピングに役立ちます。
すべてをまとめる
最後に、主要なコンポーネントを結合して完全な Walmart Web スクレーパーを作成しましょう。
一般的な流れは次のようになります。
- 検索 API とカテゴリ ページを使用して製品を発見する
- 製品URLを収集する
- URL を反復処理して各製品ページをスクレイピングします
- 詳細、メディア、価格、在庫などを抽出します。
- スクレイピングした商品データをCSV/JSONに保存
コード例は次のとおりです。
from bs4 import BeautifulSoup
import requests, json, time, random
# Product URL extraction functions...
def scrape_search_api(query):
# Search API logic...
def scrape_category_pages(url):
# Category parsing logic...
product_urls = []
product_urls.extend(scrape_search_api("laptops"))
product_urls.extend(scrape_category_pages("https://www..."))
# Add proxies here...
for url in product_urls:
response = requests.get(url)
soup = BeautifulSoup(response.text, ‘html.parser‘)
# Extract product data...
product = {
"name": name,
"description": description,
"price": price,
"images": images,
"in_stock": in_stock
}
# Save product to CSV, database, etc...
# Random delay
time.sleep(random.uniform(2, 5))
これにより、これまで説明した主要な部分が実装されます。
- スクレーパーにフィードする製品 URL の生成
- BeautifulSoup で各商品ページを解析する
- 詳細、メディア、価格設定、在庫の抽出
- ブロックを回避するためにプロキシとランダムな遅延を追加する
- スクレイピングしたデータをファイルに保存する
この構造により、数千のウォルマート製品を堅牢にスクレイピングして抽出することができます。
完全なコードには、より高度なエラー処理、マルチスレッドなどが含まれますが、これはコア ロジックとワークフローをカバーします。
まとめ
このガイドでは、Python を使用して Walmart 製品データ用の包括的な Web スクレイパーを構築する手順を説明しました。
主なテクニックには次のものが含まれます。
- Walmart の検索 API とカテゴリ ページを使用して商品 URL を生成する
- 製品ページを解析し、詳細、メディア、価格、在庫を抽出する
- プロキシ、遅延、なりすましによるブロックの回避
- 検索→プロダクトスクレイピング→保存のワークフローをまとめる
これらのアプローチにより、何千ものウォルマート商品を確実に抽出できます。データは価格監視、市場調査、ドロップシッピングなどに使用できます。
マルチスレッドやデータベース ストレージなどのいくつかの機能強化により、大規模な展開に対応できる強力な Walmart スクレイピング ソリューションが手に入ります。