Python ile Amazon ürün verisi kazıma

Yorumlar: 0

Amazon gibi e-ticaret devlerinin verilerine erişmek pazar analizi, fiyatlandırma stratejileri ve ürün araştırması için çok önemlidir. Bu veriler, web sitelerinden büyük miktarda bilgi çıkarmayı içeren bir yöntem olan web kazıma yoluyla toplanabilir. Ancak Amazon, verilerini titizlikle koruduğundan geleneksel kazıma teknikleri genellikle etkisiz kalmaktadır. Bu kapsamlı kılavuzda, Amazon'dan ürün verilerini toplama yöntemlerini inceleyecek ve platformun güçlü kazıma önleme sistemlerini atlatmaya yönelik stratejileri tartışacağız. Bu zorlukların üstesinden gelmeye ve işiniz veya araştırma amaçlarınız için gereken verileri verimli bir şekilde toplamaya yardımcı olabilecek Python, proxy'ler ve gelişmiş kazıma tekniklerinin kullanımını keşfedeceğiz.

Amazon verilerini kazımak için bir Python betiği oluşturma

Amazon'dan başarılı bir şekilde veri kazımak için aşağıda özetlenen yapılandırılmış algoritmayı takip edebilirsiniz. Bu yöntem, gerekli bilgileri verimli ve doğru bir şekilde almanızı sağlar.

Adım 1: Amazon ürün sayfalarına HTTP istekleri gönderme:

  • Amazon ürün sayfalarını hedefleyen HTTP GET isteklerini başlatmak için istekler kütüphanesini kullanın;
  • Ayrıştırmaya hazırlanmak için HTTP yanıtından ham HTML içeriğini yakalayın.

Adım 2: HTML içeriğini ayrıştırma:

  • Alınan ham HTML içeriğini ayrıştırmak için lxml kütüphanesini kullanın;
  • Çıkarmak istediğiniz belirli veri noktalarını bulmak için HTML'yi analiz edin;
  • Bu veri noktalarını tam olarak hedeflemek ve HTML yapısından çıkarmak için XPath sorgularını yürütün.

Adım 3: Verilerin saklanması:

  • Gerekli verileri çıkardıktan sonra, kolay analiz ve diğer uygulamalarla entegrasyonu kolaylaştıran CSV veya JSON gibi erişilebilir formatlarda kaydetmeye devam edin.

Potansiyel engellerin üstesinden gelmek

Amazon, kazıma çabalarını engellemek için bağlantı hızı sınırlamaları, CAPTCHA entegrasyonu ve IP engelleme dahil olmak üzere çeşitli önlemler alır. Kullanıcılar bu engelleri aşmak için yüksek kaliteli proxy'ler kullanmak gibi karşı önlemler alabilirler.

Kapsamlı kazıma faaliyetleri için, önemli miktarda ürün verisi toplamak üzere gelişmiş Python teknikleri kullanılabilir. Bu teknikler, tespitten kaçmaya ve başarılı veri çıkarımı sağlamaya yardımcı olan başlık doldurma ve TLS parmak izini içerir.

Bu adımlar, Python 3.12.2 kullanılarak pratik uygulamasını göreceğimiz makalenin ilerleyen bölümlerinde açıklanmaktadır

Önkoşullar

Bir web kazıma projesi başlatmak için, HTML ayrıştırma için lxml kütüphanesini ve Amazon web sunucusuna yönlendirilen HTTP isteklerini yönetmek için requests kütüphanesini kullanarak temel bir kazıyıcı kurarak başlayacağız.

Odak noktamız, Amazon ürün sayfalarından ürün adları, fiyatlar ve derecelendirmeler gibi temel bilgilerin çıkarılması olacaktır. Ayrıca, HTML'yi verimli bir şekilde ayrıştırmak ve istekleri yönetmek için teknikleri sergileyerek verilerin kesin ve düzenli bir şekilde çıkarılmasını sağlayacağız.

Proje bağımlılıklarını korumak ve çatışmalardan kaçınmak için, bu web kazıma çabası için ayrı bir sanal ortam oluşturulması tavsiye edilir. Sanal ortamlar kurmak için "venv" veya "pyenv" gibi araçların kullanılması önerilir.

Üçüncü taraf kütüphaneleri yükleyin

Aşağıdaki üçüncü parti Python kütüphanelerine ihtiyacınız olacak:

1. requests

HTTP istekleri göndermek ve web içeriğini almak için kullanılır. Genellikle web kazıma ve web API'leri ile etkileşim için kullanılır.

Kurulum:

 pip install requests

2. lxml

XML ve HTML belgelerini ayrıştırmak ve işlemek için bir kütüphane. Web kazıma ve web sayfalarından yapılandırılmış verilerle çalışmak için sıklıkla kullanılır.

Kurulum:

 pip install lxml

Gerekli kütüphaneleri içe aktarma

Burada kazıyıcımızın çalışması için gerekli kütüphaneleri içe aktarmamız gerekiyor. HTTP isteklerini işlemek için bir istek kütüphanesi, CSV dosya işlemini işlemek için CSV kütüphanesi, rastgele değerler oluşturmak ve rastgele seçimler yapmak için rastgele kütüphane, ham HTML içeriğini ayrıştırmak için lxml kütüphanesi ve tür ipucu için Dict ve List içerir.

 import requests
import csv
import random
from lxml import html
from typing import Dict, List

CSV dosyasından girdileri okuma

Aşağıdaki kod parçacığı amazon_product_urls.csv adlı bir CSV dosyasını okur ve her satır bir Amazon ürün sayfasının URL'sini içerir. Kod, satırlar üzerinde yineleme yaparak her satırdan URL'leri çıkarır ve bunları URL adlı bir listeye ekler.

 with open('amazon_product_urls.csv', 'r') as file:
    reader = csv.DictReader(file)
    for row in reader:
        urls.append(row['url'])

HTTP istek başlıkları ve proxy'ler

İstek başlıkları HTTP isteklerinde önemli bir rol oynar, karmaşık istemci ve istek bilgilerini sağlar. Kazıma yaparken, tespit edilmekten kaçınmak ve istediğiniz bilgilere kolayca erişmek için yetkili kullanıcı başlıklarını kopyalamak önemlidir. Yaygın olarak kullanılan başlıkları taklit ederek, kazıyıcılar tespit tekniklerinden kaçınabilir ve etik standartları korurken verilerin tutarlı bir şekilde çıkarılmasını sağlayabilir.

Proxy'ler web kazıma işleminde aracı görevi görür ve kazıyıcının IP adresini maskeleyerek sunucunun tespit edilmesini ve engellenmesini önler. Dönen bir proxy, olası engellemeleri önlemek için her isteği yeni bir IP adresiyle göndermenize olanak tanır. Yerleşik veya mobil proxy'lerin kullanımı, gerçek ana bilgisayar ve sağlayıcı tespiti nedeniyle kazıma karşıtı önlemlere karşı dayanıklılığı güçlendirir.

İstek başlıklarını ve proxy sunucularını IP adresi yetkilendirmesi ile entegre etmek için kod:

 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',
    'dnt': '1',
    'sec-ch-ua': '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
   }
proxies = {'http': '', 'https': ''}

Kullanıcı temsilcisi rotasyonu

Burada, her istek için rastgele bir kullanıcı aracısının seçileceği bir kullanıcı aracısı koleksiyonları listesi oluşturacağız. Her istekten sonra Kullanıcı Aracısını döndürmek gibi bir başlık döndürme mekanizması uygulamak, bot algılama önlemlerini atlatmaya daha fazla yardımcı olabilir.

 useragents = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
        "Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
    ]
headers['user-agent'] = random.choice(useragnets)

Amazon'un ürün sayfasına üstbilgiler ve proxy ile birlikte HTTP istekleri yapın

Özel üstbilgiler, 30 saniyelik bir zaman aşımı ve istek için belirtilen proxy'lerle belirtilen bir URL'ye HTTP GET isteği gönderir.

response = requests.get(url=url, headers=headers, proxies=proxies, timeout=30)

Gerekli veri noktalarının XPath/Seçicilerinin belirlenmesi

Gerekli veri noktaları: başlık, fiyat ve derecelendirmeler. Şimdi, ilgili veri noktalarıyla birlikte ekran görüntülerinde gösterilen öğeler için ilgili XPath'i inceleyelim ve tanımlayalım.

Aşağıdaki ekran görüntüsü, bir Amazon ürün sayfasından ürün başlığını çıkarmak için `//span[@id="productTitle"]/text()` XPath'ini bulmak için kullanılan Chrome DevTools "Inspect" özelliğini göstermektedir.

1.png

Aşağıdaki ekran görüntüsü, bir Amazon ürün sayfasından ürün fiyatını çıkarmak için `//div[@id="corePrice_feature_div"]/div/div/span/span/text()` XPath'ini bulmayı göstermektedir.

2.png

Ekran görüntüsü, bir Amazon ürün sayfasından ürün derecelendirmelerini çıkarmak için `//span[@id="acrPopover"]/@title'` XPath'ini bulmayı göstermektedir.

3.png

Bir web sayfasından belirli bilgileri ayıklamak için XPath ifadeleri sağlayan bir sözlük oluşturun: bir ürünün başlığı, derecelendirmeleri ve fiyatı.

xpath_queries = {'title': '//span[@id="productTitle"]/text()', 'ratings': '//span[@id="acrPopover"]/@title', 'price': '//span[@class="a-offscreen"]/text()'}

HTML yanıtından lxml ayrıştırıcı oluşturma

Aşağıdaki kod, Amazon sunucusuna yapılan GET isteğinden elde edilen HTML içeriğini yapılandırılmış ağaç benzeri bir biçime ayrıştırarak, öğelerinde ve niteliklerinde daha kolay gezinmeye ve bunları manipüle etmeye olanak tanır.

tree = html.fromstring(response.text)

Gerekli verilerin çıkarılması

Aşağıdaki kod parçacığı, bir XPath sorgusu kullanarak ayrıştırılmış HTML ağacından verileri ayıklar ve belirtilen anahtarla bir sözlüğe atar. strip(), varsa baştaki ve sondaki boşlukları kaldırmak için kullanılır. XPath sorgusunun ilk sonucunu alır ve bunu extracted_data sözlüğünde verilen anahtarın altında saklar.

data = tree.xpath(xpath_query)[0].strip()
extracted_data[key] = data

Çıkarılan verileri CSV'ye kaydetme

Aşağıdaki kod, extracted_data sözlüğündeki verileri product_data.csv adlı bir CSV dosyasına yazar. Başlık satırının yalnızca dosya boşsa yazıldığından emin olun. Dosya boş değilse, verileri CSV dosyasına ek bir satır olarak ekler. Bu işlev, CSV dosyasının mevcut metnin üzerine yazılmadan yeni çıkarılan verilerle sürekli olarak güncellenmesini sağlar.

 csv_file_path = 'product_data.csv'
fieldnames = ['title', 'ratings', 'price']
with open(csv_file_path, 'a', newline='') as csvfile:
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    if csvfile.tell() == 0:
        writer.writeheader()
    writer.writerow(extracted_data)

Kod Uygulaması

Lütfen hızlı bir şekilde başlamanıza yardımcı olacak eksiksiz kodumuza bakın. Kod iyi yapılandırılmış ve belgelenmiştir, bu da onu yeni başlayan dostu yapar. Bu kodu çalıştırmak için, kullanıcının aynı dizinde "amazon_product_urls" adlı bir CSV dosyasına sahip olması gerekir. CSV dosyasının yapısı aşağıdadır:

4.png

import requests
import csv
import random
from lxml import html
from typing import Dict, List


def send_requests(
    url: str, headers: Dict[str, str], proxies: Dict[str, str]
) -> List[Dict[str, str]]:
    """
    Başlıklar ve proxy'ler ile birden fazla URL'ye HTTP GET istekleri gönderir.

    Args:
        urls (str): İsteklerin gönderileceği URL.
        headers (Dict[str, str]): İstek başlıklarını içeren sözlük.
        proxies (Dict[str, str]): Proxy ayarlarını içeren sözlük.

    Returns:
        Response: Her URL için yanıt verilerini içeren yanıt nesnesi.
    """
    try:
        response = requests.get(url, headers=headers, proxies=proxies, timeout=30)
        # Yanıt doğrulama
        if len(response.text)> 10000:
            return response
        return None
    except Exception as e:
        print(f"Error occurred while fetching URL {url}: {str(e)}")


def extract_data_from_html(
    response, xpath_queries: Dict[str, str]
) -> Dict[str, List[str]]:
    """
    XPath sorgularını kullanarak HTML içeriğinden veri çıkarır.

    Args:
        response (Response): Yanıt Nesnesi.
        xpath_queries (Dict[str, str]): Veri çıkarma için XPath sorguları içeren sözlük.

    Returns:
        Dict[str, str]: Her XPath sorgusu için çıkarılan verileri içeren sözlük.
    """
    extracted_data = {}
    tree = html.fromstring(response.text)
    for key, xpath_query in xpath_queries.items():
        data = tree.xpath(xpath_query)[0].strip()
        extracted_data[key] = data
    return extracted_data


def save_to_csv(extracted_data: Dict[str, any]):
    """
    DictWriter kullanarak bir sözlüğü CSV dosyasına satır olarak kaydeder.

    Args:
        extracted_data (Dict[str, any]): Bir veri satırını temsil eden sözlük.
    """
    csv_file_path = "product_data.csv"
    fieldnames = ["title", "ratings", "price"]
    with open(csv_file_path, "a", newline="") as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        if csvfile.tell() == 0:
            writer.writeheader()  # Yalnızca dosya boşsa başlık yaz
        writer.writerow(extracted_data)


def main():
    # Bir CSV dosyasından URL'leri okuma
    urls = []
    with open("amazon_product_urls.csv", "r") as file:
        reader = csv.DictReader(file)
        for row in reader:
            urls.append(row["url"])

    # İstek başlıklarını 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",
        "dnt": "1",
        "sec-ch-ua": '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"Windows"',
        "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/123.0.0.0 Safari/537.36",
    }

    useragents = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4591.54 Safari/537.36",
        "Mozilla/5.0 (Windows NT 7_0_2; Win64; x64) AppleWebKit/541.38 (KHTML, like Gecko) Chrome/105.0.1585 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.7863.44 Safari/537.36"
        ]

    # Proxy'leri tanımlama
    proxies = {"http": "IP:Port", "https": "IP:Port"}

    # URL'lere istek gönderme
    for url in urls:
        # Üstbilgilerde kullanıcı aracısı rotasyonu
        headers["user-agent"] = random.choice(useragnets)
        response = send_requests(url, headers, proxies)
        if response:
            # HTML içeriğinden veri çıkarma
            xpath_queries = {
                "title": '//span[@id="productTitle"]/text()',
                "ratings": '//span[@id="acrPopover"]/@title',
                "price": '//span[@class="a-offscreen"]/text()',
            }
            extracted_data = extract_data_from_html(response, xpath_queries)

            # Çıkarılan verileri bir CSV dosyasına kaydetme
            save_to_csv(extracted_data)


if __name__ == "__main__":
    main()

Python aracılığıyla Amazon'u kazımak için proxy önerileri

Kesintisiz veri çıkarımı için Datacenter IPv4, dönen mobil, ISP ve konut proxy'leri dahil olmak üzere farklı proxy çözümleri mevcuttur. Gerçek kullanıcı davranışını simüle etmek için uygun rotasyon mantığı ve kullanıcı aracıları kullanılırken, özel proxy'ler dahili rotasyon ve kapsamlı IP havuzları ile büyük ölçekli kazıma işlemini destekler. Her bir proxy seçeneğinin artılarını ve eksilerini anlamak, kesintisiz veri çıkarımı için çok önemlidir.

Tip Artıları Eksileri
Veri Merkezi Proxyleri

Yüksek hız ve performans.

Uygun maliyetli.

Büyük hacimli talepler için idealdir.

Kolayca tespit edilebilir ve kara listeye alınabilir.

Anti-scraping veya anti-bot sistemlerine karşı güvenilir değildir.

Konut Vekaletnameleri

Gerçek yerleşim IP'leri nedeniyle yüksek meşruiyet.

Konuma özel veri kazıma için geniş küresel IP kullanılabilirliği.

IP döndürme yetenekleri.

Veri merkezi proxy'lerinden daha pahalıdır.

Mobil Proxyler

Son derece meşru IP'ler.

Bloklardan ve doğrulama istemlerinden kaçınmak için etkilidir.

Diğer proxy türlerine göre daha pahalıdır.

Mobil ağa bağımlılık nedeniyle veri merkezi proxy'lerinden daha yavaş.

İSS Proxyleri

Son derece güvenilir IP'ler.

Konut IP'lerinden daha hızlı.

Sınırlı IP kullanılabilirliği.

IP rotasyonu mevcut değil.

Amazon'dan ürün verilerini kazımak, platformun kazıma önleme mekanizmalarında etkili bir şekilde gezinmek için titiz bir hazırlık gerektirir. Python ile birlikte proxy sunucularının kullanılması, verimli veri işleme ve gerekli bilgilerin hedefli bir şekilde çıkarılmasını sağlar. Web kazıma için proxy seçerken performans, maliyet, sunucu güvenilirliği ve projenizin özel gereksinimleri gibi faktörleri göz önünde bulundurmak çok önemlidir. Dinamik proxy'ler kullanmak ve güvenlik önlemlerine karşı stratejiler uygulamak, engellenme riskini en aza indirebilir ve kazıma sürecinin genel verimliliğini artırabilir.

Yorumlar:

0 yorumlar