Hướng dẫn cạo dữ liệu Walmart với Python

Bình luận: 0

Củ web là một cách mạnh mẽ để trích xuất dữ liệu từ các trang web cho các mục đích khác nhau, chẳng hạn như phân tích, nghiên cứu và trí thông minh trong kinh doanh. Hướng dẫn này giúp bạn cạo thông tin sản phẩm Walmart bằng Python tập trung vào các chiến lược và kỹ thuật chính. Walmart Scraping trình bày một ví dụ trong đó chúng ta có thể khai thác các chi tiết về các sản phẩm như tên, giá cả hoặc đánh giá được tìm thấy tại các trang khác nhau trong các trang web Walmart.

Hướng dẫn này sẽ sử dụng thư viện yêu cầu để thực hiện các yêu cầu HTTP và thư viện LXML để phân tích nội dung HTML.

Thiết lập môi trường

Trước khi chúng tôi bắt đầu, đảm bảo bạn đã cài đặt Python trên máy của bạn. Bạn có thể cài đặt các thư viện cần thiết bằng PIP:

pip install requests
pip install  lxml
pip install urllib3

Tiếp theo, hãy nhập các thư viện cần thiết:

  • Yêu cầu: Để thực hiện các yêu cầu HTTP để truy xuất các trang web;
  • LXML: Đối với nội dung phân tích cú pháp HTML;
  • CSV: Để viết dữ liệu được trích xuất vào tệp CSV;
  • ngẫu nhiên: Để chọn các proxy ngẫu nhiên và chuỗi tác nhân người dùng.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Xác định URL sản phẩm

Danh sách các URL sản phẩm Walmart để cạo.

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

Chuỗi và proxy người dùng

Để cạo một trang web, điều rất quan trọng là người ta sử dụng các tiêu đề phù hợp, đáng chú ý là tiêu đề tác nhân người dùng, để bắt chước yêu cầu từ trình duyệt thực tế. Hơn nữa, người ta có thể tránh bị hạn chế do các biện pháp chống BOT được đưa ra bởi các chủ sở hữu trang web sử dụng các máy chủ proxy có thể xoay. Dưới đây là các ví dụ về các chuỗi tác nhân người dùng cùng với mô tả về cách tích hợp các máy chủ proxy yêu cầu ủy quyền dựa trên đị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>',
]

Tiêu đề cho các yêu cầu

Đặt tiêu đề thành bắt chước các yêu cầu trình duyệt và tránh phát hiện.

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

Tạo một danh sách trống để lưu trữ chi tiết sản phẩm.

product_details = []

Quá trình liệt kê cho các trang URL hoạt động như sau: Đối với mỗi trang URL, yêu cầu GET được gửi bằng cách sử dụng một tác nhân người dùng và proxy người dùng được chọn ngẫu nhiên. Khi nhận được phản hồi HTML, nó được phân tích cú pháp để trích xuất các chi tiết như tên sản phẩm, giá cả và đánh giá. Dữ liệu được trích xuất được lưu trữ dưới dạng từ điển, sau đó được thêm vào danh sách được 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

Xem xét chi tiết:

3.png

Lưu dữ liệu vào CSV

  1. Mở một tệp CSV mới để viết.
  2. Xác định tên trường (cột) cho tệp CSV.
  3. Tạo đối tượng CSV.DictWriter để ghi từ điển vào tệp CSV.
  4. Viết hàng tiêu đề vào tệp CSV.
  5. Vòng lặp qua danh sách sản phẩm_details và viết từng từ điển sản phẩm 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:

Dưới đây là mã hoàn chỉnh với các nhận xét để giúp bạn hiểu rõ hơ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()


# Danh sách các URL sản phẩm để cạo
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)

Hướng dẫn của chúng tôi trình bày cách sử dụng các thư viện Python để cạo dữ liệu sản phẩm từ Walmart và lưu nó ở định dạng CSV để phân tích tiếp theo. Kịch bản được cung cấp là cơ bản và cung cấp một nền tảng có thể được tăng cường để tăng hiệu quả của quá trình cạo. Các cải tiến có thể bao gồm giới thiệu sự chậm trễ ngẫu nhiên giữa các yêu cầu bắt chước các mẫu duyệt người, thực hiện xoay tác nhân người dùng và proxy để tránh phát hiện và phát triển hệ thống xử lý lỗi mạnh mẽ để quản lý các gián đoạn hoặc thất bại tiềm năng.

Bình luận:

0 Bình luận