Bỏ để qua phần nội dung

Walmart là nhà bán lẻ lớn nhất thế giới với hơn 10,000 cửa hàng trên 24 quốc gia. Với lượng hàng tồn kho khổng lồ và dữ liệu sản phẩm phong phú, Walmart là mục tiêu cực kỳ có giá trị cho việc quét web.

Trong hướng dẫn toàn diện này, chúng tôi sẽ hướng dẫn cách xây dựng một công cụ quét web để trích xuất dữ liệu sản phẩm Walmart trên quy mô lớn.

Giới thiệu chung

Dưới đây là tổng quan nhanh về các bước chính mà chúng tôi sẽ đề cập:

  • Tìm sản phẩm để cạo
    • Sử dụng API tìm kiếm Walmart
    • Phân tích các trang danh mục
    • Xử lý giới hạn kết quả
  • Quét trang sản phẩm
    • Phân tích dữ liệu sản phẩm
    • Quét phương tiện truyền thông, giá cả, thông số kỹ thuật, v.v.
  • Tránh chặn
    • Sự chậm trễ ngẫu nhiên
    • Sử dụng proxy
    • Bắt chước các trình duyệt thực
  • Putting It All Together
    • API tìm kiếm → URL sản phẩm → thu thập dữ liệu
    • Xử lý tập kết quả lớn

Cuối cùng, bạn sẽ có một công cụ quét Walmart đầy đủ chức năng bằng Python, sẵn sàng trích xuất hàng nghìn sản phẩm. Bắt đầu nào!

Thành lập

Chúng tôi sẽ sử dụng Python cùng với một số gói chính:

  • yêu cầu – để thực hiện các yêu cầu HTTP tới API và trang web của Walmart
  • Beautifulsoup4 – Phân tích cú pháp HTML
  • gấu trúc – để thao tác dữ liệu

Cài đặt chúng qua pip:

pip install requests beautifulsoup4 pandas

Chúng tôi cũng sẽ sử dụng người ủy nhiệm để tránh các khối có thể được mua từ nhiều nhà cung cấp khác nhau.

Tìm sản phẩm để cạo

Bước đầu tiên là khám phá các URL hoặc ID sản phẩm để đưa vào công cụ quét của chúng tôi. Có một số cách tiếp cận chúng ta có thể sử dụng:

Sử dụng API tìm kiếm

Walmart cung cấp API tìm kiếm trả về dữ liệu JSON có cấu trúc. Chúng ta có thể truy vấn API này để tìm sản phẩm phù hợp với từ khóa.

Hãy thử dùng "laptop":

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 này trả về các kết quả được phân trang ở định dạng JSON có cấu trúc chứa:

  • productId – ID Walmart cho sản phẩm đó
  • title - tên của sản phẩm
  • description - mô tả văn bản ngắn
  • price - giá hiện tại
  • Và hơn thế nữa…

Chúng tôi có thể lặp qua các trang để thu thập ID và dữ liệu.

Một hạn chế là API chỉ cho phép tìm nạp tối đa 1000 kết quả. Để có được phạm vi phủ sóng nhiều hơn, chúng tôi cũng sẽ phải sử dụng các phương pháp khác.

Phân tích các trang chuyên mục

Walmart cũng cung cấp các trang danh mục có thể duyệt mà chúng tôi có thể phân tích cú pháp:

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

Các trang này chứa lưới sản phẩm mà chúng tôi thấy trên trang Walmart.

Để trích xuất sản phẩm, chúng ta sẽ sử dụng 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)

Điều này phân tích các sản phẩm ở chế độ xem Lưới/Danh sách, lấy tiêu đề và URL.

Sau đó, chúng tôi có thể cung cấp các URL vào trình quét sản phẩm của mình.

Các trang danh mục có thể chứa hàng nghìn sản phẩm trên nhiều trang nên phương pháp này có độ bao phủ lớn.

Xử lý các giới hạn

Giữa API tìm kiếm và các trang danh mục, chúng ta có thể khám phá 10,000 sản phẩm. Nhưng có một số giới hạn cần xem xét:

  • API tìm kiếm chỉ cho phép tìm nạp 1000 kết quả
  • Mỗi trang danh mục có tối đa 24 trang, ~50 sản phẩm mỗi trang

Vì vậy, để có được một bản thu thập toàn diện, chúng ta sẽ phải sáng tạo:

  • Sử dụng nhiều truy vấn tìm kiếm với bộ lọc thu hẹp
  • Quét trên nhiều trang danh mục
  • Mở rộng phạm vi, ví dụ. quét tất cả máy tính xách tay trên khắp Điện tử

Với một chút lặp lại, chúng tôi có thể xây dựng một kho lớn gồm hơn 10,000 URL sản phẩm phù hợp để cung cấp cho công cụ quét của chúng tôi.

Quét trang sản phẩm

Sau khi có URL hoặc ID sản phẩm, chúng tôi có thể lấy dữ liệu từ chính các trang sản phẩm.

Các trang sản phẩm của Walmart có rất nhiều thông tin mà chúng ta có thể trích xuất:

  • Miêu tả Tiêu đề
  • Hình ảnh
  • Giá, dữ liệu bán hàng
  • Thông số kỹ thuật
  • Thông tin người bán
  • Đánh giá
  • CÁC SẢN PHẨM CÓ LIÊN QUAN
  • Còn hàng

Và nhiều hơn nữa.

Chúng ta hãy đi qua một số phần quan trọng.

Cạo chi tiết sản phẩm

Các trang sản phẩm chứa một đối tượng JavaScript được gọi là window.__WML_REDUX_INITIAL_STATE__ với phần lớn dữ liệu có cấu trúc:

<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>

Chúng ta có thể trích xuất cái này và phân tích JSON để lấy các trường như:

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" 

Trường JSON này chứa hầu hết thông tin cốt lõi của sản phẩm mà chúng tôi muốn trích xuất.

Phương tiện cạo

Các hình ảnh giống như phương tiện sản phẩm được chứa trong một khối tập lệnh khác, imageAssets:

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.imageAssets = [
  {
    "assetSize": "medium",
    "assetUrl": "https://i5.walmartimages.com/...", 
    "baseAsset": {...},
    "thumbnailUrl": "https://i5.walmartimages.com/..." 
  },
  {...}
];
</script>

Chúng tôi có thể tìm kiếm và lặp lại các nội dung để tìm các URL có kích thước khác nhau:

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"

Điều này cho phép chúng tôi có được tất cả hình ảnh sản phẩm ở các độ phân giải khác nhau.

Quét giá và hàng tồn kho

Để biết các chi tiết chính như giá cả và tình trạng còn hàng, dữ liệu được chứa trong một thẻ tập lệnh khác:

<script>
window.__WML_REDUX_INITIAL_STATE__.pdpData.item.priceInfo =  {
  "priceDisplayCodes": {
    "rollback": true,
    "reducedPrice": true    
  },
  "currentPrice": {
    "currencyUnit": "USD", 
    "price": 399
  }
  ...

Chúng tôi có thể phân tích các trường giá:

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}")

Và tương tự đối với tình trạng hàng tồn kho, có trong availabilityStatus:

in_stock = product_data["availabilityStatus"] == "IN_STOCK"

Kết hợp tất cả những thứ này lại với nhau, chúng ta có thể xây dựng các công cụ lưu trữ để biết chi tiết sản phẩm, phương tiện truyền thông, giá cả, hàng tồn kho, v.v.

Tránh khối

Khi quét Walmart trên quy mô lớn, chúng ta có thể gặp phải tình trạng chặn do quá nhiều yêu cầu. Dưới đây là một số mẹo để tránh điều này:

  • Giới hạn tỷ lệ yêu cầu – bám sát tối đa 2-3 yêu cầu mỗi giây

  • Ngẫu nhiên hóa sự chậm trễ – chèn ngẫu nhiên độ trễ 2-5 giây giữa các yêu cầu

  • Xoay tác nhân người dùng – giả mạo các tác nhân người dùng trình duyệt máy tính để bàn khác nhau

  • Sử dụng proxy – định tuyến lưu lượng truy cập thông qua các dịch vụ proxy dân cư

  • Thử lại trên các khối – nếu bị chặn, hãy tạm dừng quét trong hơn 30 phút

Với những biện pháp phòng ngừa này, chúng ta có thể thu mua hàng nghìn sản phẩm Walmart một cách an toàn.

Một số dịch vụ proxy trả phí cũng cung cấp các tiêu đề và IP luân phiên nâng cao để tránh bị chặn. Những thứ này có thể giúp cạo ở quy mô lớn hơn.

Putting It All Together

Cuối cùng, hãy liên kết các thành phần chính lại với nhau thành một công cụ quét web Walmart hoàn chỉnh.

Dòng chảy chung sẽ là:

  1. Khám phá các sản phẩm bằng API tìm kiếm và trang danh mục
  2. Thu thập URL sản phẩm
  3. Lặp lại qua các URL để quét từng trang sản phẩm
  4. Trích xuất chi tiết, phương tiện, giá cả, hàng tồn kho, v.v.
  5. Lưu dữ liệu sản phẩm cóp nhặt vào CSV/JSON

Đây là mã ví dụ:

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))

Điều này thực hiện các phần chính mà chúng tôi đã đề cập:

  • Tạo URL sản phẩm để đưa vào máy cạp
  • Phân tích từng trang sản phẩm bằng BeautifulSoup
  • Trích xuất chi tiết, phương tiện, giá cả, hàng tồn kho
  • Thêm proxy và độ trễ ngẫu nhiên để tránh bị chặn
  • Lưu dữ liệu cóp nhặt vào tập tin

Với cấu trúc này, chúng tôi có thể cạo và trích xuất hàng nghìn sản phẩm Walmart một cách mạnh mẽ.

Mã đầy đủ sẽ chứa tính năng xử lý lỗi nâng cao hơn, đa luồng, v.v. Nhưng điều này bao gồm logic cốt lõi và quy trình làm việc.

Tổng kết

Trong hướng dẫn này, chúng tôi đã hướng dẫn cách xây dựng một trình quét web toàn diện cho dữ liệu sản phẩm Walmart bằng Python.

Các kỹ thuật chính bao gồm:

  • Sử dụng API tìm kiếm và các trang danh mục của Walmart để tạo URL sản phẩm
  • Phân tích trang sản phẩm và trích xuất chi tiết, phương tiện, giá cả và hàng tồn kho
  • Tránh chặn bằng proxy, độ trễ và giả mạo
  • Liên kết tìm kiếm → tìm kiếm sản phẩm → lưu quy trình làm việc

Những cách tiếp cận này có thể trích xuất hàng ngàn sản phẩm Walmart một cách mạnh mẽ. Dữ liệu sau đó có thể được sử dụng để theo dõi giá, nghiên cứu thị trường, dropshipping và hơn thế nữa.

Với một số cải tiến như đa luồng và lưu trữ cơ sở dữ liệu, bạn sẽ có giải pháp thu thập dữ liệu Walmart mạnh mẽ sẵn sàng để triển khai trên quy mô lớn.

tags:

Tham gia vào cuộc đối thoại

Chúng tôi sẽ không công khai email của bạn. Các ô đánh dấu * là bắt buộc *