Cách cạo dữ liệu AliExpress bằng Python

Bình luận: 0

Việc phát hiện ra thông tin từ các nhà bán lẻ điện tử như AliExpress có thể rất có lợi cho việc thu thập thông tin sản phẩm, giám sát biến động giá, thu thập đánh giá, v.v. Trong bài viết này, chúng tôi sẽ khám phá quá trình thu thập thông tin về các sản phẩm (như tên, giá, xếp hạng, v.v.) và cũng xem xét các đánh giá sản phẩm. Chúng tôi cũng sẽ trình bày cách làm cho máy cạo động bằng cách truyền URL sản phẩm, tự động truy xuất ID sản phẩm và lưu dữ liệu vào tệp CSV.

Hướng dẫn này sẽ sử dụng nhà viết kịch để hiển thị nội dung động và yêu cầu tìm nạp dữ liệu xem xét. Chúng tôi cũng sẽ đảm bảo cái cào là đạo đức và tuân thủ các thực tiễn tốt nhất.

Yêu cầu

Trước khi chúng tôi bắt đầu, hãy đảm bảo bạn đã cài đặt các thư viện Python sau:

  • Playwright: Được sử dụng để tương tác với trình duyệt và kết xuất nội dung động.
  • Requests: Được sử dụng để tìm nạp các đánh giá thông qua API AliExpress.
  • lxml: Để phân tích cú pháp nội dung HTML.
  • Pandas: Điều này được sử dụng để lưu dữ liệu vào tệp CSV.

Bạn có thể cài đặt các gói này bằng cách chạy các lệnh sau:


# Cài đặt Playwright
pip install playwright


# Cài đặt Requests
pip install requests


# Cài đặt LXML để phân tích cú pháp HTML
pip install lxml


# Cài đặt gấu trúc để thao tác và lưu dữ liệu
pip install pandas

Sau khi cài đặt Playwright, bạn cũng sẽ cần cài đặt các nhị phân trình duyệt cần thiết:


playwright install

Điều này sẽ tải xuống và thiết lập trình duyệt cần thiết để nhà viết kịch hoạt động đúng.

Bước 1. Gửi yêu cầu với nhà viết kịch

Các trang sản phẩm AliExpress là động, có nghĩa là chúng tải nội dung qua JavaScript. Để xử lý việc này, chúng tôi sẽ sử dụng nhà viết kịch, thư viện Python cho phép bạn điều khiển trình duyệt không đầu và tương tác với nội dung động.

Đây là cách bạn có thể gửi một yêu cầu và điều hướng đến trang sản phẩm:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # Khởi chạy trình duyệt với proxy nếu cần (có thể được xóa nếu không sử dụng proxy)
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # Trích xuất nội dung trang
        content = await page.content()
        await browser.close()
        
        return content

# Ví dụ URL
url = 'https://www.aliexpress.com/item/3256805354456256.html'

Bước 2. Trích xuất dữ liệu sản phẩm

Khi chúng tôi có nội dung trang, chúng tôi có thể trích xuất dữ liệu sản phẩm bằng các truy vấn LXML và XPath. Chúng tôi sẽ thu thập các chi tiết như tiêu đề sản phẩm, giá cả, xếp hạng, số lượng đánh giá và số lượng mặt hàng được bán.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # Trích xuất chi tiết sản phẩm bằng cách sử dụng XPath
    title = parser.xpath('//h1[@data-pl="product-title"]/text()')[0].strip()
    price = parser.xpath('//div[@class="price--current--I3Zeidd product-price-current"]/span/text()')[0].strip()
    rating = ' '.join(parser.xpath('//a[@class="reviewer--rating--xrWWFzx"]/strong/text()')).strip()
    total_reviews = parser.xpath('//a[@class="reviewer--reviews--cx7Zs_V"]/text()')[0].strip()
    sold_count = parser.xpath('//span[@class="reviewer--sold--ytPeoEy"]/text()')[0].strip()

    product_data = {
        'title': title,
        'price': price,
        'rating': rating,
        'total_reviews': total_reviews,
        'sold_count': sold_count
    }

    return product_data


Mã này sử dụng XPath để trích xuất các chi tiết sản phẩm có liên quan từ nội dung HTML của trang.

Bước 3. Đánh giá sản phẩm Scraping

AliExpress có điểm cuối API riêng để tìm nạp các đánh giá sản phẩm. Bạn có thể trích xuất ID sản phẩm từ URL một cách linh hoạt và sử dụng nó để tìm nạp các đánh giá thông qua các yêu cầu. Trong chức năng này:

  1. ID sản phẩm được trích xuất từ ​​URL sản phẩm một cách linh hoạt.
  2. Chúng tôi tìm nạp các đánh giá bằng API đánh giá AliExpress.
  3. Các văn bản đánh giá được trích xuất và trả lại làm danh sách.

import requests

def extract_product_id(url):
    # Trích xuất ID sản phẩm từ URL
    product_id = url.split('/')[-1].split('.')[0]
    return product_id

def scrape_reviews(product_id, page_num=1, page_size=10):
    headers = {
        'accept': 'application/json, text/plain, */*',
        'accept-language': 'en-IN,en;q=0.9',
        'referer': f'https://www.aliexpress.com/item/{product_id}.html',
        'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
    }

    params = {
        'productId': product_id,
        'lang': 'en_US',
        'country': 'US',
        'page': str(page_num),
        'pageSize': str(page_size),
        'filter': 'all',
        'sort': 'complex_default',
    }

    response = requests.get('https://feedback.aliexpress.com/pc/searchEvaluation.do', params=params, headers=headers)
    reviews = response.json()['data']['evaViewList']

    # Chỉ trích xuất văn bản đánh giá
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

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

Sau khi lấy các chi tiết và đánh giá sản phẩm, chúng tôi lưu dữ liệu này vào tệp CSV bằng thư viện Pandas.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Lưu chi tiết sản phẩm vào CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # Lưu đánh giá cho CSV
    df_reviews = pd.DataFrame({'reviews': reviews})
    df_reviews.to_csv(f'product_{product_id}_reviews.csv', index=False)
    
    print(f"Data saved for product {product_id}.")

Các chi tiết và đánh giá của sản phẩm được lưu vào các tệp CSV riêng biệt với ID sản phẩm có trong tên tệp để nhận dạng dễ dàng.

Bước 5. Truy xuất ID sản phẩm động

Tại đây, cách thức hoạt động của công việc động hoàn toàn hoạt động:

  1. Truyền bất kỳ URL sản phẩm AliExpress.
  2. ID sản phẩm được trích xuất từ ​​URL.
  3. Máy cạo lấy dữ liệu sản phẩm và đánh giá.
  4. Dữ liệu được lưu vào các tệp CSV với ID sản phẩm bao gồm.

# Trích xuất ID sản phẩm từ URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Mã hoàn chỉnh cuối cùng


from playwright.async_api import async_playwright
from lxml.html import fromstring
import requests
import pandas as pd

# Nhận nội dung trang bằng nhà viết kịch
async def get_page_content(url):
    async with async_playwright() as p:
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# Trích xuất dữ liệu sản phẩm
def extract_product_data(content):
    parser = fromstring(content)
    title = parser.xpath('//h1[@data-pl="product-title"]/text()')[0].strip()
    price = parser.xpath('//div[@class="price--current--I3Zeidd product-price-current"]/span/text()')[0].strip()
    rating = ' '.join(parser.xpath('//a[@class="reviewer--rating--xrWWFzx"]/strong/text()')).strip()
    total_reviews = parser.xpath('//a[@class="reviewer--reviews--cx7Zs_V"]/text()')[0].strip()
    sold_count = parser.xpath('//span[@class="reviewer--sold--ytPeoEy"]/text()')[0].strip()

    return {
        'title': title,
        'price': price,
        'rating': rating,
        'total_reviews': total_reviews,
        'sold_count': sold_count
    }

# Trích xuất ID sản phẩm từ URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# Đánh giá Scrape
def scrape_reviews(product_id, page_num=1, page_size=10):
    headers = {
        'accept': 'application/json, text/plain, */*',
        'referer': f'https://www.aliexpress.com/item/{product_id}.html',
        'user-agent': 'Mozilla/5.0'
    }
    params = {
        'productId': product_id,
        'lang': 'en_US',
        'page': str(page_num),
        'pageSize': str(page_size),
    }
    response = requests.get('https://feedback.aliexpress.com/pc/searchEvaluation.do', params=params, headers=headers)
    reviews = response.json()['data']['evaViewList']
    return [review['buyerFeedback'] for review in reviews]

# Lưu dữ liệu sản phẩm và đánh giá cho CSV
def save_to_csv(product_data, reviews, product_id):
    pd.DataFrame([product_data]).to_csv(f'product_{product_id}_data.csv', index=False)
    pd.DataFrame({'reviews': reviews}).to_csv(f'product_{product_id}_reviews.csv', index=False)
    print(f'Saved into: product_{product_id}_data.csv')
    print(f'Saved into: product_{product_id}_reviews.csv')

# Chức năng chính
async def main(url):
    content = await get_page_content(url)
    product_data = extract_product_data(content)
    product_id = extract_product_id(url)
    reviews = scrape_reviews(product_id)
    save_to_csv(product_data, reviews, product_id)

# Chạy cái cạp
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

Cân nhắc đạo đức

Khi lấy dữ liệu, điều quan trọng là phải tuân theo các hướng dẫn đạo đức:

  1. Tôn trọng Điều khoản dịch vụ của Aliexpress: Luôn kiểm tra các điều khoản dịch vụ trước khi lấy trang web. Tránh vi phạm các quy tắc của họ để ngăn chặn bị cấm.
  2. Điều tiết yêu cầu của bạn: Gửi quá nhiều yêu cầu trong một thời gian ngắn có thể làm quá tải máy chủ của họ. Xem xét thêm sự chậm trễ giữa các yêu cầu.
  3. Tránh dữ liệu cá nhân: Không thu thập hoặc xóa thông tin cá nhân mà không có sự đồng ý thích hợp.

Thực hiện theo các hướng dẫn này sẽ giúp bạn cào cào về mặt đạo đức và có trách nhiệm, giảm thiểu rủi ro cho cả người dùng và hệ thống AliExpress.

Bình luận:

0 Bình luận