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.
Başlamadan önce, aşağıdaki Python kütüphanelerinin kurulu olduğundan emin olun:
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.
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'
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.
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:
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
Ü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.
Dinamik iş akışının tamamı şu şekilde çalışır:
# URL'den ürün kimliğini çıkarın
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
# 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))
Veri kazırken etik kurallara uymak önemlidir:
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