Cara mengikis data AliExpress menggunakan Python

Komentar: 0

Mengungkap informasi dari pengecer elektronik seperti AliExpress dapat sangat bermanfaat untuk mengumpulkan informasi produk, memantau fluktuasi harga, mengumpulkan ulasan, dan sebagainya. Pada artikel ini, kita akan mengeksplorasi proses memperoleh informasi tentang produk (seperti nama, harga, peringkat, dll.) dan juga mengulas ulasan produk scraping. Kami juga akan mendemonstrasikan cara membuat scraper dinamis dengan mengoper URL produk, secara otomatis mengambil ID produk, dan menyimpan data ke dalam file CSV.

Tutorial ini akan menggunakan Playwright untuk merender konten dinamis dan permintaan untuk mengambil data ulasan. Kami juga akan memastikan scraper beretika dan mematuhi praktik terbaik.

Persyaratan

Sebelum memulai, pastikan Anda telah menginstal pustaka Python berikut ini:

  • Playwright: digunakan untuk berinteraksi dengan peramban dan merender konten dinamis.
  • Requests: digunakan untuk mengambil ulasan melalui API AliExpress.
  • lxml: untuk mem-parsing konten HTML.
  • Pandas: digunakan untuk menyimpan data ke file CSV.

Anda dapat menginstal paket-paket ini dengan menjalankan perintah berikut:


# Menginstal Playwright
pip install playwright


# Menginstal Requests
pip install requests


# Instal lxml untuk mengurai HTML
pip install lxml


# Instal Panda untuk manipulasi dan penyimpanan data
pip install pandas

Setelah menginstal Playwright, Anda juga perlu menginstal binari peramban yang diperlukan:


playwright install

Ini akan mengunduh dan menyiapkan browser yang diperlukan agar Playwright berfungsi dengan baik.

Langkah 1. Mengirim permintaan dengan Playwright

Halaman produk AliExpress bersifat dinamis, artinya halaman tersebut memuat konten melalui JavaScript. Untuk menanganinya, kita akan menggunakan Playwright, sebuah pustaka Python yang memungkinkan Anda untuk mengontrol peramban tanpa kepala dan berinteraksi dengan konten dinamis.

Berikut ini cara Anda mengirim permintaan dan menavigasi ke halaman produk:


from playwright.async_api import async_playwright

async def get_page_content(url):
    async with async_playwright() as p:
        # Luncurkan browser dengan proxy jika diperlukan (dapat dihapus jika tidak menggunakan proxy)
        browser = await p.firefox.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto(url, timeout=60000)

        # Mengekstrak konten halaman
        content = await page.content()
        await browser.close()
        
        return content

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

Langkah 2. Mengekstrak data produk

Setelah kita memiliki konten halaman, kita dapat mengekstrak data produk menggunakan kueri lxml dan XPath. Kita akan mengumpulkan detail seperti judul produk, harga, peringkat, jumlah ulasan, dan jumlah barang yang terjual.


from lxml.html import fromstring

def extract_product_data(content):
    parser = fromstring(content)
    
    # Mengekstrak detail produk menggunakan 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


Kode ini menggunakan XPath untuk mengekstrak detail produk yang relevan dari konten HTML halaman.

Langkah 3. Mengikis ulasan produk

AliExpress memiliki titik akhir API terpisah untuk mengambil ulasan produk. Anda dapat mengekstrak ID produk dari URL secara dinamis dan menggunakannya untuk mengambil ulasan melalui permintaan. Dalam fungsi ini:

  1. ID produk diekstrak dari URL produk secara dinamis.
  2. Kami mengambil ulasan menggunakan API ulasan AliExpress.
  3. Teks ulasan diekstrak dan dikembalikan sebagai daftar.

import requests

def extract_product_id(url):
    # Ekstrak ID produk dari 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']

    # Ekstrak teks ulasan saja
    review_texts = [review['buyerFeedback'] for review in reviews]
    
    return review_texts

Langkah 4. Menyimpan data ke dalam file CSV

Setelah mengikis detail produk dan ulasan, kita menyimpan data ini ke dalam file CSV menggunakan pustaka pandas.


import pandas as pd

def save_to_csv(product_data, reviews, product_id):
    # Menyimpan detail produk ke CSV
    df_product = pd.DataFrame([product_data])
    df_product.to_csv(f'product_{product_id}_data.csv', index=False)

    # Menyimpan ulasan ke 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}.")

Detail produk dan ulasan disimpan ke dalam file CSV terpisah dengan ID produk yang disertakan dalam nama file untuk memudahkan identifikasi.

Langkah 5. Pengambilan ID produk dinamis

Berikut adalah cara kerja alur kerja dinamis yang lengkap:

  1. Kirimkan URL produk AliExpress apa pun.
  2. Id produk diekstrak dari URL.
  3. Pengikis mengambil data dan ulasan produk.
  4. Data disimpan ke dalam file CSV dengan menyertakan ID produk.

# Ekstrak ID produk dari URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

Kode lengkap akhir


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

# Dapatkan konten halaman menggunakan 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

# Ekstrak data produk
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
    }

# Ekstrak ID produk dari URL
def extract_product_id(url):
    return url.split('/')[-1].split('.')[0]

# Mengikis ulasan
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]

# Menyimpan data dan ulasan produk ke 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')

# Fungsi utama
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)

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

Pertimbangan etis

Saat mengambil data, penting untuk mengikuti pedoman etika:

  1. Hormati ketentuan layanan AliExpress: Selalu periksa persyaratan layanan sebelum melakukan scraping pada sebuah situs web. Hindari melanggar aturan mereka untuk mencegah pemblokiran.
  2. Batasi permintaan Anda: Mengirim terlalu banyak permintaan dalam waktu singkat dapat membebani server mereka. Pertimbangkan untuk menambahkan penundaan di antara permintaan.
  3. Hindari data pribadi: Jangan mengumpulkan atau mengorek informasi pribadi tanpa persetujuan yang tepat.

Mengikuti panduan ini akan membantu Anda mengikis secara etis dan bertanggung jawab, meminimalkan risiko bagi pengguna dan sistem AliExpress.

Komentar:

0 komentar