Python Kullanarak eBay Verileri Nasıl Kazınır?

Yorumlar: 0

eBay, kayıtlı kullanıcıları arasında geniş bir ürün yelpazesinde ticaret fırsatları sunan tanınmış bir çevrimiçi platformdur. Bu kılavuzda, Python kullanarak eBay listelerinden nasıl veri kazıyacağımızı açıklayacağız. Bu nedenle, listelemenin kendisinden ve daha ince ayrıntılar için sırayla her bir ürüne giderek elde edilebilecek ayrıntılarla ilgileneceğiz.

Gereksinimler

Başlamak için aşağıdaki Python kütüphanelerinin kurulu olduğundan emin olun:

  • Requests: HTTP istekleri yapmak için.
  • lxml: HTML içeriğini ayrıştırmak için.
  • Pandas: Verileri bir CSV dosyasına kaydetmek için.

Bu kütüphaneleri kullanarak yükleyin:


pip install requests lxml pandas

Sayfalama için eBay URL Yapısını Anlama

eBay'de ürün ararken, her sayfa URL'si sayfalandırılmış sonuçlar arasında gezinmek için değiştirilebilir. Örneğin:

  • Sayfa 1: https://www.ebay.com/sch/i.html?_nkw=laptop
  • Sayfa 2: https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn=2

_pgn parametresi, birden fazla liste sayfası arasında gezinmek için kullanılır ve kapsamlı verilerin alınmasını sağlar. Kazıma işlemine başlayalım.

Adım 1: eBay'e talep gönderme

Başlamak için, eBay'in anti-bot önlemleri tarafından tespit edilmeyi ve potansiyel engellemeyi önlemeye yardımcı olan gerçek bir tarayıcı isteğini taklit etmek için başlıklar ayarlayacağız. Ardından, her ürün için bağlantıları toplamak üzere listeleme sayfasına bir istek göndereceğiz.


import requests
from lxml.html import fromstring

# Gerçek bir tarayıcıyı simüle etmek için başlıkları tanımlayın
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

# Arama sorgusu için istek parametreleri
params = {
    '_nkw': 'laptop',
}

# eBay listeleme sayfasına bir istek gönderin
listing_page_response = requests.get('https link', params=params, headers=headers)
listing_parser = fromstring(listing_page_response.text)

Adım 2: Listeleme sayfasını ayrıştırma

Listeleme sayfasında, tek tek ürünlerin URL'lerini çıkaracağız. Bu, ürün başlığı, fiyatı ve daha fazlası gibi belirli ayrıntıları toplamak için her ürün sayfasını ziyaret etmemizi sağlar.


# Ürün bağlantılarını ayıklamak için listeleme sayfasını ayrıştırın
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Bulunan bağlantılardan bir örnek çıktı
print("Product Links:", links[:5])  # Display the first five product links

Adım 3: Ürün verilerini kazıma

Ürün URL'leri elimizdeyken, her bir ürün sayfasını ziyaret edeceğiz ve aşağıdaki ayrıntıları çıkaracağız:

  • Ürün başlığı;
  • Fiyat;
  • Nakliye maliyeti;
  • Ürün durumu;
  • Mevcut miktar;
  • Satılan miktar;
  • Ödeme seçenekleri;
  • İade politikası.

Ardından, her bağlantıda döngü oluşturacağız ve ürün sayfasında gerekli bilgileri bulmak için XPath ifadelerini kullanacağız.


product_data = []

for url in links:
    # Ürün sayfasına bir istek gönderin
    product_page_response = requests.get(url, headers=headers)
    product_parser = fromstring(product_page_response.text)
    
    # XPath kullanarak veri ayıklama
    try:
        product_title = product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0]
        price = product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0]
        shipping_cost = product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        product_condition = product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0]
        available_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0]
        sold_quantity = product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1]
        payment_options = ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label'))
        return_policy = product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        
        # Verileri bir sözlükte saklama
        product_info = {
            'Title': product_title,
            'Price': price,
            'Shipping Cost': shipping_cost,
            'Condition': product_condition,
            'Available Quantity': available_quantity,
            'Sold Quantity': sold_quantity,
            'Payment Options': payment_options,
            'Return Policy': return_policy,
        }
        product_data.append(product_info)
    
    except IndexError as e:
        print(f"An error occurred: {e}")

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

Verileri topladıktan sonra Pandas kullanarak bir CSV dosyasına kaydedebiliriz.


import pandas as pd

# Verileri DataFrame'e dönüştürme
df = pd.DataFrame(product_data)

# CSV'ye Kaydet
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

eBay'de hız sınırlama ve algılamayı atlama

eBay aşırı talepleri önlemek için hız sınırlaması kullanır. İşte tespit edilmekten kaçınmak için birkaç yöntem:

  • Proxy'leri kullanın: Farklı IP adresleri arasında geçiş yapın.
  • İstek Aralıklarını Ayarlayın: İstekler arasında gecikmeler uygulayın.
  • Kullanıcı Aracılarını Rastgele Ayarla: Algılanmayı önlemek için kullanıcı aracısı dizesini değiştirin.

Bu en iyi uygulamaları izleyerek engellenme riskini en aza indirebilir ve verileri verimli bir şekilde kazımaya devam edebilirsiniz.

Tamamlanmış kod

İşte eBay verilerini kazımak ve bir CSV dosyasına kaydetmek için tam kod:


import requests
import random
from lxml.html import fromstring
import pandas as pd

useragents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36']

# İstek için başlıkları tanımlama
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': random.choice(useragents),
}

# Arama sorgusu parametreleri
params = {'_nkw': 'laptop'}
proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# Listeleme sayfasını getir
listing_page_response = requests.get('https://www.ebay.com/sch/i.html', params=params, headers=headers, proxies=proxies)
listing_parser = fromstring(listing_page_response.text)
links = listing_parser.xpath('//div[@class="s-item__info clearfix"]/a[@_sp="p2351460.m1686.l7400"]/@href')

# Ürün verilerini ayıklayın
product_data = []
for url in links:
    product_page_response = requests.get(url, headers=headers, proxies=proxies)
    product_parser = fromstring(product_page_response.text)
    try:
        product_info = {
            'Title': product_parser.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()')[0],
            'Price': product_parser.xpath('//div[@data-testid="x-price-primary"]/span/text()')[0],
            'Shipping Cost': product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values--shipping"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0],
            'Condition': product_parser.xpath('//div[@class="x-item-condition-text"]/div/span/span[2]/text()')[0],
            'Available Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[0],
            'Sold Quantity': product_parser.xpath('//div[@class="x-quantity__availability"]/span/text()')[1],
            'Payment Options': ', '.join(product_parser.xpath('//div[@class="ux-labels-values col-12 ux-labels-values__column-last-row ux-labels-values--payments"]/div[2]/div/div//span/@aria-label')),
            'Return Policy': product_parser.xpath('//div[@class="ux-layout-section ux-layout-section--returns"]//div[@class="ux-labels-values__values-content"]/div/span/text()')[0]
        }
        product_data.append(product_info)
    except IndexError:
        continue

# CSV'ye Kaydet
df = pd.DataFrame(product_data)
df.to_csv('ebay_product_data.csv', index=False)
print("Data saved to ebay_product_data.csv")

Python ile eBay'i kazımak, ürünler, fiyatlandırma ve trendler hakkında verimli veri toplamaya olanak tanır. Bu kılavuzda, listeleri kazıma, sayfalandırmayı işleme, başlıkları ayarlama ve tespit edilmekten kaçınmak için proxy kullanma konularını ele aldık. Sorumlu istek aralıkları ve proxy rotasyonu kullanarak eBay'in hizmet koşullarına saygı göstermeyi unutmayın. Bu araçlarla artık pazar bilgileri için eBay verilerini kolayca toplayabilir ve analiz edebilirsiniz. Mutlu kazımalar!

Yorumlar:

0 yorumlar