Hướng Dẫn Cách Scrape Dữ Liệu Walmart Với Python

Bình luận: 0

Trí tuệ kinh doanh, nghiên cứu và phân tích chỉ là một vài trong vô số khả năng được mở ra nhờ web scraping. Một thực thể kinh doanh hoàn chỉnh như Walmart cung cấp một cấu trúc hoàn hảo để chúng ta thu thập thông tin cần thiết. Chúng ta có thể dễ dàng scrape dữ liệu Walmart như tên, giá và thông tin đánh giá từ hàng loạt website của họ bằng nhiều kỹ thuật scraping khác nhau.

Trong bài viết này, chúng ta sẽ đi sâu vào quá trình: cách scrape dữ liệu Walmart. Chúng ta sẽ sử dụng requests để gửi các HTTP request và lxml để phân tích cú pháp các tài liệu HTML trả về.

Tại Sao Nên Dùng Python Để Scrape Dữ Liệu Walmart?

Khi nói đến việc scrape dữ liệu sản phẩm trên nhiều trang bán lẻ, Python là một trong những lựa chọn hiệu quả nhất hiện có. Đây là cách nó tích hợp một cách liền mạch vào các dự án trích xuất:

  1. Thư viện nâng cao. Sự tồn tại của requests cho tương tác web và lxml để phân tích HTML giúp bạn có thể scrape các danh mục trực tuyến khổng lồ một cách dễ dàng và hiệu quả.
  2. Dễ sử dụng. Với cú pháp dễ hiểu, người dùng có thể lập trình các quy trình truy xuất dữ liệu với ít hoặc không cần kinh nghiệm trước đó và bắt tay ngay vào công việc.
  3. Hỗ trợ cộng đồng. Độ phức tạp đi kèm với các website bán lẻ đồng nghĩa với việc có vô số tài nguyên và sự hỗ trợ từ cộng đồng để giúp bạn giải quyết các vấn đề phát sinh.
  4. Xử lý dữ liệu. Phân tích chuyên sâu. Với sự hỗ trợ của Pandas để xử lý dữ liệu và Matplotlib để biểu diễn trực quan, Python cho phép người dùng phân tích dữ liệu trên quy mô rộng, bao gồm thu thập và phân tích.
  5. Quản lý nội dung động. Với Selenium, việc tương tác với các phần tử web động trở nên khả thi, đảm bảo rằng dữ liệu rộng lớn thậm chí từ các trang được tải bằng JavaScript cũng được thu thập.
  6. Khả năng mở rộng hiệu quả. Với khả năng quản lý cả tập dữ liệu lớn và nhỏ, Python hoạt động cực kỳ tốt trong thời gian dài, ngay cả khi thực hiện các hoạt động trích xuất dữ liệu chuyên sâu.

Sử dụng ngôn ngữ này cho các dự án bán lẻ không chỉ đơn giản hóa khía cạnh kỹ thuật mà còn tăng hiệu quả cũng như phạm vi phân tích, khiến nó trở thành lựa chọn hàng đầu cho các chuyên gia muốn hiểu sâu về thị trường. Những khía cạnh này có thể đặc biệt hữu ích khi ai đó quyết định scrape dữ liệu Walmart.

Bây giờ, hãy bắt đầu xây dựng công cụ web scraping cho Walmart.

Thiết Lập Môi Trường Để Scrape Dữ Liệu Walmart

Trước hết, hãy đảm bảo rằng Python đã được cài đặt trên máy tính của bạn. Các thư viện cần thiết có thể được tải xuống bằng pip:


pip install requests
pip install lxml
pip install urllib3

Bây giờ hãy import các thư viện sau:

  • requests – để lấy các trang web qua HTTP;
  • lxml – để tạo cây tài liệu HTML;
  • CSV – để ghi dữ liệu thu thập được vào các tệp CSV;
  • random – để chọn proxy và chuỗi user agent.

import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Định Nghĩa Các URL Sản Phẩm

Danh sách các URL sản phẩm để scrape dữ liệu Walmart có thể được thêm như sau.


product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

Chuỗi User-Agent Và Proxy

Khi web scraping Walmart, việc thiết lập đúng các HTTP header, đặc biệt là header User-Agent, là rất quan trọng để giả lập một trình duyệt thực. Hơn nữa, hệ thống chống bot của trang web cũng có thể bị vượt qua bằng cách sử dụng các proxy xoay vòng. Trong ví dụ dưới đây, các chuỗi User-Agent được trình bày cùng với hướng dẫn thêm ủy quyền proxy theo địa chỉ IP.


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

Các Header Cho Request

Các header của request nên được thiết lập sao cho chúng trông như đến từ trình duyệt của người dùng. Điều này sẽ rất hữu ích khi cố gắng scrape dữ liệu Walmart. Dưới đây là một ví dụ về cách nó sẽ trông như thế nào:


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

Khởi Tạo Lưu Trữ Dữ Liệu

Bước đầu tiên là tạo ra một cấu trúc để lưu trữ thông tin sản phẩm.


product_details = []

Liệt kê các trang URL hoạt động theo cách sau: Với mỗi trang URL, một yêu cầu GET được khởi tạo với một User-Agent và một proxy được chọn ngẫu nhiên. Sau khi nhận được phản hồi HTML, nó được phân tích để lấy các chi tiết sản phẩm bao gồm tên, giá và đánh giá. Các chi tiết liên quan được lưu vào cấu trúc dữ liệu từ điển và sau đó được thêm vào danh sách đã tạo trước đó.


for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Gửi HTTP Nhận yêu cầu đến URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Phân tích nội dung HTML bằng LXML
   parser = html.fromstring(response.text)
   # Trích xuất tiêu đề sản phẩm
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Trích xuất giá sản phẩm
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Trích xuất chi tiết đánh giá
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Lưu trữ chi tiết chi tiết trong một từ điển
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Phụ lục chi tiết sản phẩm vào danh sách
   product_details.append(product_detail)

Tiêu đề:

1.png

Giá:

2.png

Chi tiết đánh giá:

3.png

Lưu Dữ Liệu Vào CSV

  1. Tạo một tệp mới, chọn định dạng tệp là CSV và đặt chế độ ghi.
  2. Chỉ định tên trường (các cột) cho tệp CSV.
  3. Để ghi các từ điển vào tệp CSV, tạo một đối tượng csv.DictWriter.
  4. Ghi hàng tiêu đề của tệp CSV.
  5. Với mỗi từ điển trong product_details, lặp qua và ghi từ điển đó dưới dạng một hàng trong tệp CSV.

with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

Mã Hoàn Chỉnh

Khi web scraping Walmart, mã Python hoàn chỉnh sẽ trông giống như đoạn được cung cấp bên dưới. Ở đây cũng có một số chú thích để giúp bạn dễ dàng hiểu từng phần.


import requests
from lxml import html
import csv
import random
import urllib3
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()


# List of product URLs to scrape Walmart data
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Ngẫu nhiên chuỗi tác nhân người dùng để ẩn danh
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# Danh sách proxy cho xoay IP
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Tiêu đề cho các yêu cầu của trình duyệt bắt chước
headers = {
   'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
   'accept-language': 'en-IN,en;q=0.9',
   'dnt': '1',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   'sec-ch-ua-mobile': '?0',
   'sec-ch-ua-platform': '"Linux"',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'none',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
}

# Khởi tạo một danh sách trống để lưu trữ chi tiết sản phẩm
product_details = []

# Vòng lặp qua từng URL sản phẩm
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # Gửi HTTP Nhận yêu cầu đến URL
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # Phân tích nội dung HTML bằng LXML
   parser = html.fromstring(response.text)
   # Trích xuất tiêu đề sản phẩm
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Trích xuất giá sản phẩm
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # Trích xuất chi tiết đánh giá
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Lưu trữ chi tiết chi tiết trong một từ điển
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Phụ lục chi tiết sản phẩm vào danh sách
   product_details.append(product_detail)

# Viết dữ liệu được trích xuất vào tệp CSV
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

Các Gợi Ý Bổ Sung

Đối với những người sử dụng Python để giao tiếp với API scraping của Walmart, việc phát triển các phương pháp mạnh mẽ để scrape hiệu quả giá và kết quả đánh giá của Walmart là rất quan trọng. API này cung cấp một kênh trực tiếp đến dữ liệu sản phẩm phong phú, giúp phân tích thời gian thực về giá cả và phản hồi của khách hàng.

Áp dụng những chiến lược cụ thể này sẽ nâng cao độ chính xác và phạm vi của thông tin thu thập được, cho phép các doanh nghiệp thích ứng nhanh chóng với những thay đổi của thị trường và xu hướng tiêu dùng. Thông qua việc áp dụng chiến lược API của Walmart trong Python, các công ty có thể tối ưu hóa quy trình thu thập dữ liệu, đảm bảo phân tích thị trường toàn diện và ra quyết định sáng suốt.

Kết Luận

Trong hướng dẫn này, chúng tôi đã giải thích cách sử dụng các thư viện Python để scrape dữ liệu Walmart và lưu chúng vào một tệp CSV để phân tích sau. Đoạn mã được cung cấp ở mức cơ bản và đóng vai trò như một điểm khởi đầu mà bạn có thể chỉnh sửa để cải thiện hiệu quả của quá trình scraping. Các cải tiến có thể bao gồm việc thêm khoảng thời gian ngẫu nhiên giữa các request để mô phỏng duyệt web của con người, sử dụng user-agent và proxy để che dấu bot, và triển khai xử lý lỗi nâng cao để đối phó với gián đoạn hoặc thất bại trong quá trình scraping.

Bình luận:

0 Bình luận