Python ile E-Ticaret Web Siteleri Nasıl Kazınır?

Yorumlar: 0

Ürün ayrıntıları için e-ticaret veri kazıma, rekabet analizi, fiyat izleme ve pazar araştırması yapmak için kullanışlıdır. Ürün sayfalarından veri kazıma Python kullanılarak rahatlıkla yapılabilir. Bu e-ticaret kazıma eğitimi, çevrimiçi mağazalardan istek ve lxml kombinasyonunu kullanarak nasıl bilgi toplayacağınızı gösterecektir.

E-ticaret için web sayfalarının kazınması, internetteki mağazalardan başlık, fiyat veya tanımlayıcı numarası gibi ürün bilgilerinin alınmasını içerir. Python'da bulunan çok sayıda kütüphane bunu sadece kolay değil aynı zamanda oldukça verimli hale getirir. Bu makalede, Python kullanarak e-ticaret web sitelerini kazımaya odaklanacağız. Costco'nun web sitesi bizim nesnemiz olacak.

E-ticaret Veri Kazıma için Script Yazma

Öncelikle, bu betik için ihtiyaç duyacağımız tüm mevcut Python e-ticaret kazıma araçlarına veya kütüphanelerine sahip olduğumuzdan emin olalım:


pip install requests
pip install lxml

Web sitesindeki belirli sayfalardan ürün adlarını, özelliklerini ve markalarını çıkarmaya odaklanacağız.

Adım 1. Web sitesinin HTML yapısını anlama

Bir e-ticaret ürün kazıyıcı oluşturmaya başlamak için öncelikle belirli bir web sayfasının nasıl yapılandırıldığını anlamanız gerekir. Web sitesine gidin ve bilgi toplamak istediğiniz sayfayı açın ve gerekli öğeleri (ör. ürünün adı, özellikleri, markası vb.) inceleyin.

Adım 2. HTTP istekleri gönderme

İlk olarak, özellikle ürün sayfaları için GET göndermek üzere requests kütüphanesini içe aktaracağız. Ayrıca, istek başlıklarını bir tarayıcı isteğine benzeyecek şekilde yapılandıracağız.


import requests

# Kazınacak ürün URL'lerinin listesi
urls = [
    "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
    "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

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-US,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
    'sec-ch-ua-mobile': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Her URL'de döngü oluşturun ve bir GET isteği gönderin
for url in urls:
    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        html_content = response.text
        # Diğer işlemler sonraki adımlarda eklenecektir
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

Adım 3. XPath ve lxml kullanarak veri çıkarma

Lxml ile html'den istenen bilgileri çıkaracağız. E-ticaret veri kazıma ile uğraşırken çok önemlidir.


from lxml import html

# Kazınmış verileri depolamak için liste
scraped_data = []

# Her URL'de döngü oluşturun ve bir GET isteği gönderin
for url in urls:
    response = requests.get(url)
    if response.status_code == 200:
        html_content = response.content
        # HTML içeriğini lxml ile ayrıştırma
        tree = html.fromstring(html_content)
        
        # XPath kullanarak veri ayıklama
        product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
        product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
        product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()
        
        # Çıkarılan verileri listeye ekleme
        scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
    else:
        print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# Kazınan verileri yazdırma
for item in scraped_data:
    print(item)

Adım 4. Potansiyel sorunların ele alınması

Python ile bir e-ticaret web sitesini kazımaya çalıştığımızda, çoğu web sitesinin bir çeşit anti-bot yazılımına sahip olduğunu anlamamız gerekir. Proxy kullanmak ve kullanıcı aracılarını döndürmek şüphelerini hafifletmeye yardımcı olabilir.

IP yetkilendirmesi ile proxy kullanma:


proxies = {
    'http': 'http://your_proxy_ip:your_proxy_port',
    'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get(url, proxies=proxies)

Dönen Kullanıcı Temsilcileri:


import random

user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    # Gerektiğinde daha fazla kullanıcı aracısı ekleyin
]

headers['user-agent'] = random.choice(user_agents)

response = requests.get(url, headers=headers)

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

Sonunda, çıkarılan veriler bir CSV formatında saklanacak, böylece daha sonra daha gelişmiş bir e-ticaret veri kazıma işlemi için analiz edebileceğim.


import csv

csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# CSV dosyasına veri yazma
try:
    with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
        writer = csv.DictWriter(file, fieldnames=fieldnames)
        writer.writeheader()
        for item in scraped_data:
            writer.writerow(item)
    print(f"Data saved to {csv_file}")
except IOError:
    print(f"Error occurred while writing data to {csv_file}")

Kodu tamamlayın

İşte etkili e-ticaret veri kazıma için komut dosyasının son sürümü. Kolay kullanım için kopyalayıp yapıştırabilirsiniz.


import requests
import urllib3
from lxml import html
import csv
import random
import ssl

ssl._create_default_https_context = ssl._create_stdlib_context
urllib3.disable_warnings()

# Kazınacak ürün URL'lerinin listesi
urls = [
   "https://www.costco.com/kirkland-signature-men's-sneaker.product.4000216649.html",
   "https://www.costco.com/adidas-ladies'-puremotion-shoe.product.4000177646.html"
]

# headers
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-US,en;q=0.9',
   'cache-control': 'no-cache',
   'dnt': '1',
   'pragma': 'no-cache',
   'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
   'sec-ch-ua-mobile': '?0',
   'sec-fetch-dest': 'document',
   'sec-fetch-mode': 'navigate',
   'sec-fetch-site': 'same-origin',
   'sec-fetch-user': '?1',
   'upgrade-insecure-requests': '1',
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
}

# Dönen istekler için kullanıcı aracılarının listesi
user_agents = [
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   # Gerektiğinde daha fazla kullanıcı aracısı ekleyin
]


# Dönen talepler için vekillerin listesi
proxies = [
    {'http': 'http://your_proxy_ip:your_proxy_port', 'https': 'https://your_proxy_ip:your_proxy_port'},
    {'http': 'http://your_proxy_ip2:your_proxy_port2', 'https': 'https://your_proxy_ip2:your_proxy_port2'},
    # Gerektiğinde daha fazla proxy ekleyin
]

# Kazınmış verileri depolamak için liste
scraped_data = []

# Her URL'de döngü oluşturun ve bir GET isteği gönderin
for url in urls:
   # İstek üstbilgileri için rastgele bir kullanıcı aracısı seçin
   headers['user-agent'] = random.choice(user_agents)
   # İstek için rastgele bir proxy seçin
   proxy = random.choice(proxies)

   # URL'ye üstbilgiler ve proxy ile HTTP GET isteği gönderme
   response = requests.get(url, headers=headers, proxies=proxy, verify=False)
   if response.status_code == 200:
       # Yanıttaki HTML içeriğini depolayın
       html_content = response.content
       # HTML içeriğini lxml ile ayrıştırma
       tree = html.fromstring(html_content)

       # XPath kullanarak veri ayıklama
       product_name = tree.xpath('//h1[@automation-id="productName"]/text()')[0].strip()
       product_feature = tree.xpath('//ul[@class="pdp-features"]//li//text()')
       product_brand = tree.xpath('//div[@itemprop="brand"]/text()')[0].strip()

       # Çıkarılan verileri listeye ekleme
       scraped_data.append({'Product Name': product_name, 'Product Feature': product_feature, 'Brand': product_brand})
   else:
       # İstek başarısız olursa hata mesajı yazdır
       print(f"Failed to retrieve {url}. Status code: {response.status_code}")

# CSV dosya kurulumu
csv_file = 'costco_products.csv'
fieldnames = ['Product Name', 'Product Feature', 'Brand']

# CSV dosyasına veri yazma
try:
   with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
       writer = csv.DictWriter(file, fieldnames=fieldnames)
       writer.writeheader()
       for item in scraped_data:
           writer.writerow(item)
   print(f"Data saved to {csv_file}")
except IOError:
   # Dosyaya yazma başarısız olursa hata mesajı yazdır
   print(f"Error occurred while writing data to {csv_file}")

Python e-ticaret kazıyıcı şimdi tamamlandı.

E-ticaret Veri Kazıma: Son Düşünceler

Costco'nun çevrimiçi mağazası için bir e-ticaret web kazıyıcısının kullanımı, Python'un analiz ve optimum iş kararı verme için ürün verilerini elde etmede ne kadar etkili olabileceğini göstermektedir. Otomatik çıkarıcılar sağlamak için doğru komut dosyaları ve kütüphaneler Requests ve Lxml ile, bir anti-bot API'sinin neden olduğu herhangi bir iş akışı kesintisi olmadan siteyi kazımak mümkündür. Son olarak, e-ticaret web kazıma işlemini gerçekleştirirken her zaman etik düzenlemelere uymak önemlidir.

Yorumlar:

0 yorumlar