Python kullanarak AliExpress verileri nasıl kazınır?

Yorumlar: 0

AliExpress gibi e-perakendecilerden bilgi toplamak, ürün bilgisi toplama, fiyat dalgalanmalarını izleme, yorum toplama vb. konularda oldukça faydalı olabilir. Bu makalede, ürünler hakkında bilgi edinme sürecini (ad, fiyat, derecelendirme vb.) ve ayrıca ürün incelemelerini kazıma işlemini inceleyeceğiz. Ayrıca, ürün URL'sini ileterek, ürün kimliğini otomatik olarak alarak ve verileri bir CSV dosyasına kaydederek kazıyıcının nasıl dinamik hale getirileceğini göstereceğiz.

Bu eğitimde dinamik içerik oluşturmak için Playwright'ı ve inceleme verilerini almak için istekleri kullanacağız. Ayrıca kazıyıcının etik olmasını ve en iyi uygulamalara uymasını sağlayacağız.

Gereksinimler

Başlamadan önce, aşağıdaki Python kütüphanelerinin kurulu olduğundan emin olun:

  • Playwright: tarayıcı ile etkileşim kurmak ve dinamik içerik oluşturmak için kullanılır.
  • İstekler: AliExpress API'si aracılığıyla incelemeleri almak için kullanılır.
  • lxml: HTML içeriğini ayrıştırmak için.
  • Pandas: bu, verileri bir CSV dosyasına kaydetmek için kullanılır.

Bu paketleri aşağıdaki komutları çalıştırarak kurabilirsiniz:


# Kurulum Playwright
pip install playwright


# Kurulum Requests
pip install requests


# HTML ayrıştırmak için lxml yükleyin
pip install lxml


# Veri işleme ve kaydetme için Pandas'ı yükleyin
pip install pandas

Playwright'ı yükledikten sonra, gerekli tarayıcı ikili dosyalarını da yüklemeniz gerekecektir:


playwright install

Bu, Playwright'ın düzgün çalışması için gerekli tarayıcıyı indirecek ve kuracaktır.

Adım 1. Playwright ile istek gönderme

AliExpress ürün sayfaları dinamiktir, yani JavaScript aracılığıyla içerik yüklerler. Bunu halletmek için, başsız bir tarayıcıyı kontrol etmenizi ve dinamik içerikle etkileşim kurmanızı sağlayan bir Python kütüphanesi olan Playwright'ı kullanacağız.

İşte bir isteği nasıl gönderebileceğiniz ve ürün sayfasına nasıl gidebileceğiniz:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # Gerekirse tarayıcıyı bir proxy ile başlatın (proxy kullanılmıyorsa kaldırılabilir)
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # Sayfa içeriğini çıkarma
        content = await page.content()
        await browser.close()
        
        return content

# Örnek URL
url = 'https://www.aliexpress.com/item/3256805354456256.html'

Adım 2. Ürün verilerini çıkarma

Sayfa içeriğine sahip olduğumuzda, lxml ve XPath sorgularını kullanarak ürün verilerini çıkarabiliriz. Ürün başlığı, fiyatı, derecelendirmesi, yorum sayısı ve satılan ürün sayısı gibi ayrıntıları toplayacağız.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # XPath kullanarak ürün ayrıntılarını ayıklama
    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


Bu kod, sayfanın HTML içeriğinden ilgili ürün ayrıntılarını çıkarmak için XPath kullanır.

Adım 3. Ürün incelemelerini kazıma

AliExpress, ürün incelemelerini almak için ayrı bir API uç noktasına sahiptir. Ürün kimliğini URL'den dinamik olarak çıkarabilir ve incelemeleri istekler aracılığıyla almak için kullanabilirsiniz. Bu fonksiyonda:

  1. Ürün kimliği, ürün URL'sinden dinamik olarak çıkarılır.
  2. AliExpress inceleme API'sini kullanarak incelemeleri getiriyoruz.
  3. İnceleme metinleri çıkarılır ve bir liste olarak döndürülür.

import requests

def extract_product_id(url):
    # URL'den ürün kimliğini çıkarın
    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']

    # Yalnızca inceleme metnini çıkarın
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

Adım 4. Verileri bir CSV dosyasına kaydetme

Ürün ayrıntılarını ve incelemeleri kazıyarak elde ettikten sonra, pandas kütüphanesini kullanarak bu verileri bir CSV dosyasına kaydediyoruz.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Ürün ayrıntılarını CSV'ye kaydetme
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # İncelemeleri CSV'ye kaydetme
    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}.")

Ürün ayrıntıları ve incelemeler, kolay tanımlama için dosya adına dahil edilen ürün kimliği ile ayrı CSV dosyalarına kaydedilir.

Adım 5. Dinamik ürün kimliği alma

Dinamik iş akışının tamamı şu şekilde çalışır:

  1. Herhangi bir AliExpress ürün URL'sini iletin.
  2. Ürün kimliği URL'den çıkarılır.
  3. Kazıyıcı, ürün verilerini ve incelemelerini getirir.
  4. Veriler, ürün kimliği de dahil olmak üzere CSV dosyalarına kaydedilir.

# URL'den ürün kimliğini çıkarın
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Final complete code


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

# Get page content using 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

# Ürün verilerini ayıklayın
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
    }

# URL'den ürün kimliğini çıkarın
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# İncelemeleri kazıyın
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]

# Ürün verilerini ve incelemeleri CSV'ye kaydetme
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')

# Ana işlev
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)

# Sıyırıcıyı çalıştırın
import asyncio
url = 'https://www.aliexpress.com/item/3256805354456256.html'
asyncio.run(main(url))

Etik hususlar

Veri kazırken etik kurallara uymak önemlidir:

  1. AliExpress'in hizmet şartlarına saygı gösterin: Bir web sitesini kazımadan önce her zaman hizmet şartlarını kontrol edin. Yasaklanmayı önlemek için kurallarını ihlal etmekten kaçının.
  2. İsteklerinizi kısın: Kısa sürede çok fazla istek göndermek sunucularını aşırı yükleyebilir. İstekler arasına gecikmeler eklemeyi düşünün.
  3. Kişisel verilerden kaçının: Uygun izin olmadan kişisel bilgileri toplamayın veya kazımayın.

Bu yönergelere uymak, etik ve sorumlu bir şekilde kazıma yapmanıza yardımcı olacak ve hem kullanıcılar hem de AliExpress sistemi için riskleri en aza indirecektir.

Yorumlar:

0 yorumlar