Hướng dẫn thu thập đánh giá Amazon bằng Python

4 tháng 11 2024
4 phút đọc
Tóm tắt được tạo bởi AI:

Việc thu thập đánh giá Amazon bằng Python có thể rất hữu ích — dù bạn đang phân tích đối thủ, kiểm tra xem khách hàng thực sự nói gì hay khám phá xu hướng thị trường. Nếu bạn đang tự hỏi làm thế nào để thu thập đánh giá Amazon bằng Python, hướng dẫn ngắn này sẽ chỉ cho bạn quy trình thực hành sử dụng gói Requests và BeautifulSoup để tự động lấy nội dung đánh giá.

Bước 1. Cài đặt các thư viện cần thiết

Trước hết, bạn cần cài đặt một vài thư viện. Hai thư viện cốt lõi — Requests cho các lệnh mạng và BeautifulSoup cho việc duyệt cây HTML — đều có thể được cài đặt chỉ với một dòng lệnh trong terminal:

pip install requests
pip install beautifulsoup4

Bước 2. Cấu hình quy trình thu thập dữ liệu

Chúng ta sẽ tập trung vào các đánh giá trên Amazon bằng Python và xem xét từng giai đoạn của quy trình thu thập dữ liệu theo từng bước.

Hiểu cấu trúc của trang web

Hiểu cấu trúc HTML của trang là cần thiết để xác định các thành phần đánh giá. Phần đánh giá bao gồm các trường như tên người đánh giá, điểm sao và bình luận viết; những mục này phải được xác định thông qua công cụ kiểm tra của trình duyệt.

Tiêu đề sản phẩm và URL:

1.png

Đánh giá tổng:

2.png

Phần đánh giá:

3.png

Tên tác giả:

4.png

Đánh giá:

5.png

Bình luận:

6.png

Gửi yêu cầu HTTP

Headers đóng vai trò quan trọng. Chuỗi User-Agent và các header khác được thiết lập để bắt chước trình duyệt thông thường và giảm khả năng bị phát hiện. Nếu bạn muốn làm việc này đúng cách, làm theo một hướng dẫn thu thập dữ liệu Amazon bằng Python sẽ chỉ cho bạn cách thiết lập các header này cùng với proxy để giữ cho các yêu cầu mượt mà và ít bị phát hiện.

Proxies

Proxy cho phép luân phiên IP để giảm nguy cơ bị cấm và giới hạn tần suất. Chúng đặc biệt quan trọng cho việc thu thập dữ liệu quy mô lớn.

Headers yêu cầu hoàn chỉnh

Khi bao gồm các header khác nhau như Accept-Encoding, Accept-Language, Referer, Connection và Upgrade-Insecure-Requests sẽ giả lập một yêu cầu trình duyệt hợp lệ, giảm khả năng bị đánh dấu là bot.

import requests

url = "https://www.amazon.com/Portable-Mechanical-Keyboard-MageGee-Backlit/product-reviews/B098LG3N6R/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&reviewerType=all_reviews"

# Example of a proxy provided by the proxy service
proxy = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}

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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Send HTTP GET request to the URL with headers and proxy
try:
    response = requests.get(url, headers=headers, proxies=proxy, timeout=10)
    response.raise_for_status()  # Raise an error if the request failed

except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

Bước 3. Trích xuất chi tiết sản phẩm bằng BeautifulSoup

Sau khi trang được tải, BeautifulSoup chuyển đổi mã HTML thô thành một cấu trúc cây có thể tìm kiếm. Từ cấu trúc đó, trình thu thập dữ liệu lấy các liên kết sản phẩm chuẩn, tiêu đề trang và bất kỳ tổng điểm đánh giá nào hiển thị.

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.content, 'html.parser')

# Extracting common product details
product_url = soup.find('a', {'data-hook': 'product-link'}).get('href', '')
product_title = soup.find('a', {'data-hook': 'product-link'}).get_text(strip=True)
total_rating = soup.find('span', {'data-hook': 'rating-out-of-text'}).get_text(strip=True)

Bước 4. Trích xuất dữ liệu đánh giá bằng BeautifulSoup

Chúng ta quay lại cùng cấu trúc HTML đó, lần này tập trung vào việc thu thập tên người đánh giá, xếp hạng sao và các bình luận bằng văn bản — tất cả đều được thực hiện bằng Python để thu thập đánh giá Amazon một cách hiệu quả với các bộ chọn được xác định trước.

reviews = []
review_elements = soup.find_all('div', {'data-hook': 'review'})
for review in review_elements:
    author_name = review.find('span', class_='a-profile-name').get_text(strip=True)
    rating_given = review.find('i', class_='review-rating').get_text(strip=True)
    comment = review.find('span', class_='review-text').get_text(strip=True)

    reviews.append({
        'Product URL': product_url,
        'Product Title': product_title,
        'Total Rating': total_rating,
        'Author': author_name,
        'Rating': rating_given,
        'Comment': comment,
    })

Bước 5. Lưu dữ liệu vào CSV

Công cụ csv.writer tích hợp sẵn của Python có thể lưu dữ liệu đánh giá đã thu thập vào tệp .csv để phân tích sau này.

import csv

# Define CSV file path
csv_file = 'amazon_reviews.csv'

# Define CSV fieldnames
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Writing data to CSV file
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    for review in reviews:
        writer.writerow(review)

print(f"Data saved to {csv_file}")

Mã hoàn chỉnh

Một khối mã được trình bày, kết hợp các bước tạo yêu cầu, phân tích và xuất tệp, bao quát toàn bộ quy trình thu thập dữ liệu trong một tập lệnh có thể chạy được duy nhất:

import requests
from bs4 import BeautifulSoup
import csv
import urllib3

urllib3.disable_warnings()

# URL of the Amazon product reviews page
url = "https://www.amazon.com/Portable-Mechanical-Keyboard-MageGee-Backlit/product-reviews/B098LG3N6R/ref=cm_cr_dp_d_show_all_btm?ie=UTF8&reviewerType=all_reviews"

# Proxy provided by the proxy service with IP-authorization
path_proxy = 'your_proxy_ip:your_proxy_port'
proxy = {
   'http': f'http://{path_proxy}',
   'https': f'https://{path_proxy}'
}

# Headers for the HTTP request
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-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Send HTTP GET request to the URL with headers and handle exceptions
try:
   response = requests.get(url, headers=headers, timeout=10, proxies=proxy, verify=False)
   response.raise_for_status()  # Raise an error if the request failed

except requests.exceptions.RequestException as e:
   print(f"Error: {e}")

# Use BeautifulSoup to parse the HTML and grab the data you need
soup = BeautifulSoup(response.content, 'html.parser')

# Extracting common product details
product_url = soup.find('a', {'data-hook': 'product-link'}).get('href', '')  # Extract product URL
product_title = soup.find('a', {'data-hook': 'product-link'}).get_text(strip=True)  # Extract product title
total_rating = soup.find('span', {'data-hook': 'rating-out-of-text'}).get_text(strip=True)  # Extract total rating

# Extracting individual reviews
reviews = []
review_elements = soup.find_all('div', {'data-hook': 'review'})
for review in review_elements:
   author_name = review.find('span', class_='a-profile-name').get_text(strip=True)  # Extract author name
   rating_given = review.find('i', class_='review-rating').get_text(strip=True)  # Extract rating given
   comment = review.find('span', class_='review-text').get_text(strip=True)  # Extract review comment

   # Store each review in a dictionary
   reviews.append({
       'Product URL': product_url,
       'Product Title': product_title,
       'Total Rating': total_rating,
       'Author': author_name,
       'Rating': rating_given,
       'Comment': comment,
   })

# Define CSV file path
csv_file = 'amazon_reviews.csv'

# Define CSV fieldnames
fieldnames = ['Product URL', 'Product Title', 'Total Rating', 'Author', 'Rating', 'Comment']

# Writing data to CSV file
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
   writer = csv.DictWriter(file, fieldnames=fieldnames)
   writer.writeheader()
   for review in reviews:
       writer.writerow(review)

# Print confirmation message
print(f"Data saved to {csv_file}")

Các proxy đáng tin cậy cải thiện cơ hội vượt qua các chặn và giúp giảm khả năng bị phát hiện bởi bộ lọc chống bot. Đối với việc thu thập dữ liệu, thường ưu tiên proxy cư trú (residential proxies) vì yếu tố tin cậy của chúng, trong khi proxy ISP tĩnh (static ISP proxies) cung cấp tốc độ và độ ổn định.

Kết luận

Việc thu thập (scraping) đánh giá sản phẩm trên Amazon bằng Python hoàn toàn khả thi, và Python cung cấp các công cụ cần thiết để thực hiện điều đó. Chỉ với vài thư viện và một chút rà soát cẩn thận trên trang, bạn có thể thu thập được nhiều thông tin hữu ích: từ những gì khách hàng thực sự nghĩ đến việc phát hiện các lỗi của đối thủ.

Tất nhiên, có một số khó khăn: Amazon không ưa thích các trình thu thập dữ liệu. Vì vậy nếu bạn cố gắng thu thập đánh giá sản phẩm Amazon ở quy mô lớn theo phong cách Python, bạn sẽ cần proxy để giữ dưới tầm radar. Các lựa chọn đáng tin cậy nhất là proxy cư trú (residential proxies — điểm tin cậy cao, IP luân phiên) hoặc proxy ISP tĩnh (static ISP proxies — nhanh và ổn định).

Nội dung của bài viết:

Các bài viết gần đây

Quay lại blog
Quay lại blog