Cách cạo các trang web thương mại điện tử với Python

Bình luận: 0

Để phân tích cạnh tranh, giám sát giá và nghiên cứu thị trường, điều quan trọng là phải loại bỏ dữ liệu sản phẩm từ các trang web thương mại điện tử. Bạn có thể sử dụng Python để cạo dữ liệu từ các trang sản phẩm một cách hiệu quả. Trong hướng dẫn này, chúng tôi sẽ trình bày cách cạo thông tin sản phẩm từ các cửa hàng trực tuyến bằng cách sử dụng kết hợp các yêu cầu và LXML.

Thương mại điện tử Cạo liên quan đến việc trích xuất các chi tiết sản phẩm như tên, giá cả và ID từ các cửa hàng trực tuyến. Python, với các thư viện đa năng, làm cho nhiệm vụ này hiệu quả và đơn giản. Trong hướng dẫn này, chúng tôi sẽ quét thông tin sản phẩm từ trang web của Costco.

Viết tập lệnh để trích xuất dữ liệu sản phẩm

Trước khi lặn vào quy trình cạo, đảm bảo bạn đã cài đặt các thư viện Python cần thiết:

pip install requests
pip install lxml

Chúng tôi sẽ tập trung vào việc trích xuất tên sản phẩm, tính năng sản phẩm và thương hiệu sản phẩm từ các trang sản phẩm cụ thể trên trang web.

Bước 1. Hiểu cấu trúc HTML của trang web

Để trích xuất dữ liệu từ bất kỳ trang web nào, bạn cần hiểu cấu trúc của trang web. Mở một trang web và kiểm tra các yếu tố bạn muốn cạo (ví dụ: tên sản phẩm, tính năng thương hiệu, v.v.).

Bước 2. Gửi các yêu cầu HTTP

Trước tiên, chúng tôi sẽ sử dụng thư viện yêu cầu để gửi HTTP nhận được yêu cầu đến các trang sản phẩm. Chúng tôi cũng sẽ thiết lập các tiêu đề yêu cầu bắt chước yêu cầu trình duyệt thực.


import requests

# Danh sách các URL sản phẩm để cạo
urls = [
    "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
    "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

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',
}

# Lặp qua từng url và gửi yêu cầu nhận
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # Xử lý thêm sẽ được thêm vào trong các bước tiếp theo
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Bước 3. Trích xuất dữ liệu bằng XPath và LXML

Sử dụng LXML, chúng tôi sẽ trích xuất các điểm dữ liệu cần thiết từ HTML được phân tích cú pháp.

from lxml import html

# Liệt kê để lưu trữ dữ liệu cào
scraped_data = []

# Lặp qua từng url và gửi yêu cầu nhận
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # Phân tích nội dung HTML với LXML
        tree = html.fromstring(html_content)
        
        # Trích xuất dữ liệu bằng cách sử dụng XPath
        product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
        product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
        product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
        
        # Nối dữ liệu trích xuất vào danh sách
        scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# In dữ liệu được cạo
for item in scraped_data:
    print(item)

Bước 4. Giải quyết các vấn đề tiềm ẩn

Các trang web thường thực hiện các biện pháp chống BOT. Sử dụng proxy và các đại lý người dùng xoay có thể giúp tránh phát hiện.

Sử dụng proxy với sự ủy thác IP:


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)

Đại lý người dùng xoay:


import random

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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # Thêm nhiều đại lý người dùng khi cần thiết
]

headers['user-agent'] = random.choice(user_agents)

response = requests.get(url, headers=headers)

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

Cuối cùng, chúng tôi sẽ lưu dữ liệu được quét vào tệp CSV để phân tích thêm.

import csv

csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Viết dữ liệu vào tệp CSV
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for item in scraped_data:
            writer.writerow(item)
    print(f"Data saved to {csv_file}")
except IOError:
    print(f"Error occurred while writing data to {csv_file}")

Hoàn thành mã


import requests
import urllib3
from lxml import html
import csv
import random
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
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

# tiêu đề
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',
}

# Danh sách các tác nhân người dùng cho các yêu cầu xoay
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 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   # Thêm nhiều đại lý người dùng khi cần thiết
]


# Danh sách các proxy cho các yêu cầu xoay
proxies = [
    {'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
    # Thêm nhiều proxy khi cần thiết
]

# Liệt kê để lưu trữ dữ liệu cào
scraped_data = []

# Lặp qua từng url và gửi yêu cầu nhận
for url in urls:
   # Chọn một tác nhân người dùng ngẫu nhiên cho các tiêu đề yêu cầu
   headers['user-agent'] = random.choice(user_agents)
   # Chọn một proxy ngẫu nhiên cho yêu cầu
   proxy = random.choice(proxies)

   # Gửi HTTP Nhận yêu cầu đến URL với các tiêu đề và proxy
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Lưu trữ nội dung HTML từ phản hồi
       html_content = response.content
       # Phân tích nội dung HTML với LXML
       tree = html.fromstring(html_content)

       # Trích xuất dữ liệu bằng cách sử dụng XPath
       product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
       product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
       product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()

       # Nối dữ liệu trích xuất vào danh sách
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # In thông báo lỗi nếu yêu cầu không thành công
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Thiết lập tệp CSV
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# Viết dữ liệu vào tệp CSV
try:
   with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
       writer = csv.DictWriter(file, fieldnames=fieldnames)
       writer.writeheader()
       for item in scraped_data:
           writer.writerow(item)
   print(f"Data saved to {csv_file}")
except IOError:
   # In thông báo lỗi nếu ghi vào tệp không thành công
   print(f"Error occurred while writing data to {csv_file}")

Sử dụng Python để cạo từ các trang web thương mại điện tử như Costco là một phương pháp hiệu quả để thu thập thông tin sản phẩm để phân tích nó cũng như đưa ra các quyết định chiến lược. Việc sử dụng đúng các thư viện, ví dụ: các yêu cầu cũng như LXML dẫn đến các quy trình trích xuất tự động có thể xử lý nội dung HTML mà không quên việc triển khai API chống BOT một cách hiệu quả. Cần lưu ý rằng các giao thức cạo đạo đức phải luôn luôn được tuân theo.

Bình luận:

0 Bình luận