Jak skrobać dane AliExpress przy użyciu Pythona

Komentarze: 0

Odkrywanie informacji od sprzedawców internetowych, takich jak AliExpress, może być bardzo korzystne dla gromadzenia informacji o produktach, monitorowania wahań cen, zbierania recenzji itp. W tym artykule zbadamy proces pozyskiwania informacji o produktach (takich jak nazwa, cena, ocena itp.), a także przejrzymy recenzje produktów. Zademonstrujemy również, jak sprawić, by scraper był dynamiczny, przekazując adres URL produktu, automatycznie pobierając identyfikator produktu i zapisując dane w pliku CSV.

W tym samouczku użyjemy Playwright do renderowania dynamicznej zawartości i żądań do pobierania danych recenzji. Upewnimy się również, że scraper jest etyczny i zgodny z najlepszymi praktykami.

Wymagania

Zanim zaczniemy, upewnij się, że masz zainstalowane następujące biblioteki Pythona:

  • Playwright: używana do interakcji z przeglądarką i renderowania dynamicznej zawartości.
  • Requests: służy do pobierania recenzji za pośrednictwem interfejsu API AliExpress.
  • lxml: do analizowania zawartości HTML.
  • Pandas: służy do zapisywania danych do pliku CSV.

Możesz zainstalować te pakiety, uruchamiając następujące polecenia:


# Zainstaluj dramatopisarza
pip install playwright


# Żądania instalacji
pip install requests


# Zainstaluj lxml do parsowania HTML
pip install lxml


# Zainstaluj Pandas do manipulacji i zapisywania danych
pip install pandas

Po zainstalowaniu Playwright należy również zainstalować wymagane pliki binarne przeglądarki:


playwright install

Spowoduje to pobranie i skonfigurowanie przeglądarki niezbędnej do prawidłowego działania Playwright.

Krok 1. Wysyłanie żądań za pomocą Playwright

Strony produktów AliExpress są dynamiczne, co oznacza, że ładują zawartość za pomocą JavaScript. Aby sobie z tym poradzić, użyjemy Playwright, biblioteki Pythona, która pozwala kontrolować bezgłową przeglądarkę i wchodzić w interakcje z dynamiczną zawartością.

Oto jak wysłać żądanie i przejść do strony produktu:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # W razie potrzeby uruchom przeglądarkę za pomocą serwera proxy (można go usunąć, jeśli nie jest używany).
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # Wyodrębnianie zawartości strony
        content = await page.content()
        await browser.close()
        
        return content

# Przykładowy adres URL
url = 'https://www.aliexpress.com/item/3256805354456256.html'

Krok 2. Wyodrębnianie danych produktu

Gdy mamy już zawartość strony, możemy wyodrębnić dane produktu za pomocą zapytań lxml i XPath. Zbierzemy szczegóły, takie jak tytuł produktu, cena, ocena, liczba recenzji i liczba sprzedanych produktów.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # Wyodrębnianie szczegółów produktu za pomocą 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


Kod ten wykorzystuje XPath do wyodrębnienia odpowiednich szczegółów produktu z treści HTML strony.

Krok 3. Skrobanie recenzji produktów

AliExpress ma oddzielny punkt końcowy API do pobierania recenzji produktów. Możesz dynamicznie wyodrębnić identyfikator produktu z adresu URL i użyć go do pobrania recenzji za pośrednictwem żądań. W tej funkcji:

  1. Identyfikator produktu jest dynamicznie pobierany z adresu URL produktu.
  2. Pobieramy recenzje za pomocą interfejsu API recenzji AliExpress.
  3. Teksty recenzji są wyodrębniane i zwracane jako lista.

import requests

def extract_product_id(url):
    # Wyodrębnij identyfikator produktu z adresu 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']

    # Tylko fragment tekstu recenzji
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

Krok 4. Zapisywanie danych do pliku CSV

Po zeskrobaniu szczegółów produktu i recenzji, zapisujemy te dane do pliku CSV przy użyciu biblioteki pandas.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Zapisywanie szczegółów produktu w pliku CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # Zapisywanie recenzji do pliku 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}.")

Szczegóły produktu i recenzje są zapisywane w oddzielnych plikach CSV z identyfikatorem produktu zawartym w nazwie pliku w celu łatwej identyfikacji.

Krok 5. Dynamiczne pobieranie ID produktu

Oto jak działa cały dynamiczny przepływ pracy:

  1. Przekaż dowolny adres URL produktu AliExpress.
  2. Identyfikator produktu jest wyodrębniany z adresu URL.
  3. Skrobak pobiera dane produktu i recenzje.
  4. Dane są zapisywane w plikach CSV z dołączonym identyfikatorem produktu.

# Wyodrębnij identyfikator produktu z adresu URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Kompletny kod końcowy


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

# Pobierz zawartość strony za pomocą 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

# Wyodrębnianie danych produktu
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
    }

# Wyodrębnij identyfikator produktu z adresu URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# Recenzje 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]

# Zapisywanie danych produktów i recenzji w pliku 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')

# Główna funkcja
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)

# Uruchom skrobak
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

Uwagi etyczne

Podczas skrobania danych ważne jest przestrzeganie wytycznych etycznych:

  1. Przestrzegaj warunków świadczenia usług AliExpress: Zawsze sprawdzaj warunki korzystania z usługi przed skrobaniem witryny. Unikaj naruszania ich zasad, aby uniknąć zbanowania.
  2. Dław swoje żądania: Wysyłanie zbyt wielu żądań w krótkim czasie może przeciążyć serwery. Rozważ dodanie opóźnień między żądaniami.
  3. Unikaj danych osobowych: Nie zbieraj ani nie zeskrobuj danych osobowych bez odpowiedniej zgody.

Przestrzeganie tych wskazówek pomoże ci skrobać etycznie i odpowiedzialnie, minimalizując ryzyko zarówno dla użytkowników, jak i systemu AliExpress.

Komentarze:

0 komentarze