Витяг даних з AliExpress з використанням Python

Коментарі: 0

Витяг інформації з торгових онлайн-платформ, таких як AliExpress, являє собою процес для збору даних про товари, моніторингу коливань цін, аналізу відгуків та інших аспектів. У цій статті розглядається процес отримання інформації про товари, такої як назва, ціна, рейтинг тощо, а також скрапінг відгуків. Демонструється методика створення динамічного скрапера, який приймає URL товару, автоматично витягує його ID і зберігає дані у форматі CSV.

Для візуалізації динамічного контенту в посібнику використовується Playwright, а для вилучення даних про відгуки - бібліотека requests.

Попередні налаштування

Перед початком роботи переконайтеся, що встановлено такі бібліотеки Python:

  • Playwright: використовується для взаємодії з браузером і візуалізації динамічного контенту.
  • Requests: використовується для отримання відгуків через API AliExpress.
  • lxml: для парсингу HTML-контенту.
  • Pandas: використовується для збереження даних у файл CSV.

Для встановлення цих пакетів виконайте такі команди:


# Встановлення Playwright
pip install playwright


# Встановлення Requests
pip install requests


# Встановлення lxml для парсингу HTML
pip install lxml


# Встановлення Pandas для маніпуляції даними та збереження
pip install pandas

Далі потрібно встановити необхідні бінарні файли браузера:


playwright install

Ця команда завантажить і налаштує необхідний браузер для коректної роботи Playwright.

Крок 1. Надсилання запитів за допомогою Playwright

Сторінки товарів AliExpress є динамічними, що означає завантаження вмісту через JavaScript. Для роботи з таким контентом буде використовуватися Playwright - бібліотека Python, що дає змогу керувати браузером у режимі без відтворення інтерфейсу та взаємодіяти з динамічним вмістом. Ось як можна відправити запит і перейти на сторінку товару:


from playwright.async_api import async_playwright

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

# Приклад URL
url = 'URL'

Крок 2. Витяг даних про товар

Отримавши вміст сторінки, можна витягти дані про товар за допомогою lxml і XPath-запитів. Будуть зібрані такі деталі, як назва товару, ціна, рейтинг, кількість відгуків і кількість проданих одиниць.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # Витяг даних про товар з використанням 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

Цей код використовує XPath для вилучення релевантних даних про товар з HTML-контенту сторінки.

Крок 3. Скрапінг відгуків

AliExpress надає окремий API-ендпойнт для отримання відгуків про товари. Можна динамічно витягти ідентифікатор з URL і використовувати його для отримання відгуків через requests.

У цій функції:

  1. ID товару витягується динамічно з URL товару.
  2. Відгуки витягуються з використанням API для відгуків AliExpress.
  3. Тексти відгуків витягуються і повертаються у вигляді списку.

import requests

def extract_product_id(url):
    # Витяг ID товару з 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']

    # Витяг тексту відгуків
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

Крок 4. Збереження даних у файл CSV

Після скрапінгу даних про товар і відгуки ці дані зберігаються у файл CSV з використанням бібліотеки pandas. Дані про товар та відгуки зберігаються в окремі файли CSV, імена яких включають ID товару для зручності ідентифікації.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Збереження даних про товар у CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # Збереження відгуків у 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}.")

Крок 5. Динамічний витяг ID товару

Як виглядає повний динамічний робочий процес:

  1. Передайте будь-який URL товару AliExpress.
  2. Ідентифікатор товару витягується з URL.
  3. Скрапер витягує дані про товар та відгуки.
  4. Дані зберігаються у файлах CSV, у назви яких включено ідентифікатор товару.

# Витяг ID товару з URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Фінальна версія коду


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

# Отримання вмісту сторінки за допомогою Playwright
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

# Витяг даних про товар
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
    }

# Витяг ID товару з URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# Скрапінг відгуків
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]

# Збереження даних про товар і відгуки в 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')

# Основна функція
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)

# Запуск скрапера
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

Етичні аспекти скрапінгу

Під час скрапінгу даних важливо дотримуватися таких рекомендацій:

  1. Дотримання умов обслуговування AliExpress. Завжди перевіряйте умови обслуговування перед скрапінгом сайту. Уникайте порушення їхніх правил, щоб не отримати заборону на доступ.
  2. Регулювання частоти запитів: Відправлення занадто великої кількості запитів за короткий час може перевантажити сервери. Рекомендується додавати затримки між запитами.
  3. Персональні дані: Не збирайте персональні дані без належної згоди.

Дотримання цих рекомендацій допоможе вести етичний і відповідальний скрапінг, знижуючи ризики блокувань і правових наслідків недотримання умов угоди з платформою AliExpress.

Коментарії:

0 Коментаріїв