Извлечение данных с 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 комментариев