Python ile E-Ticaret web siteleri nasıl kazınır?

Yorumlar: 0

Rekabet analizi, fiyat izleme ve pazar araştırması için e-ticaret web sitelerinden ürün verilerini kazımak önemlidir. Ürün sayfalarından verimli bir şekilde veri kazımak için Python kullanabilirsiniz. Bu kılavuzda, istek ve lxml kombinasyonunu kullanarak çevrimiçi mağazalardan ürün bilgilerinin nasıl kazınacağını göstereceğiz.

E-ticaret kazıma, çevrimiçi mağazalardan adlar, fiyatlar ve kimlikler gibi ürün ayrıntılarını çıkarmayı içerir. Python, çok yönlü kütüphaneleri ile bu görevi verimli ve basit hale getirir. Bu kılavuzda, Costco'nun web sitesinden ürün bilgilerini kazıyacağız.

Ürün verilerini ayıklamak için bir komut dosyası yazma

Kazıma işlemine başlamadan önce, gerekli Python kütüphanelerinin kurulu olduğundan emin olun:

pip install requests
pip install lxml

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

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

Herhangi bir web sitesinden veri çekmek için web sayfasının yapısını anlamanız gerekir. Bir web sitesi sayfası açın ve kazımak istediğiniz öğeleri inceleyin (örneğin, ürün adı, marka özellikleri, vb.).

Adım 2. HTTP istekleri gönderme

İlk olarak, ürün sayfalarına HTTP GET istekleri göndermek için requests kütüphanesini kullanacağız. Ayrıca istek başlıklarını gerçek bir tarayıcı isteğini taklit edecek şekilde ayarlayacağı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 ayıklama

lxml kullanarak, ayrıştırılmış HTML'den gerekli veri noktalarını çıkaracağız.

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. Olası sorunların ele alınması

Web siteleri genellikle anti-bot önlemleri uygular. Proxy kullanmak ve kullanıcı aracılarını döndürmek tespit edilmekten kaçınmaya 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ı Aracıları:


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

Son olarak, kazınan verileri daha fazla analiz için bir CSV dosyasına kaydedeceğiz.

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


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"
]

# başlıklar
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 saklayı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}")

Costco gibi e-ticaret sitelerinden kazıma yapmak için Python kullanmak, ürün bilgilerini analiz etmek ve stratejik kararlar almak için toplamak için etkili bir yöntemdir. Lxml'nin yanı sıra Requests gibi kütüphanelerin doğru kullanımı, bir anti-bot API'sinin etkili bir şekilde uygulanmasını unutmadan HTML içeriklerini işleyebilen otomatik çıkarma işlemleriyle sonuçlanır. Etik kazıma protokollerine her zaman uyulması gerektiği unutulmamalıdır.

Yorumlar:

0 yorumlar