Python ile Walmart verilerini kazıma kılavuzu

Yorumlar: 0

Web kazıma, iş dünyasında analiz, araştırma ve istihbarat gibi farklı amaçlar için web sitelerinden veri çıkarmanın güçlü bir yoludur. Bu eğitim, temel stratejilere ve tekniklere odaklanarak Python'da Walmart ürün bilgilerini kazımanıza yardımcı olur. Walmart kazıma, Walmart siteleri altındaki çeşitli sayfalarda bulunan isim, fiyat veya yorumlar gibi ürünlerin ayrıntılarını çıkarabileceğimiz bir örnek sunar.

Bu kılavuz HTTP istekleri yapmak için requests kütüphanesini ve HTML içeriğini ayrıştırmak için lxml kütüphanesini kullanacaktır.

Ortamı ayarlama

Başlamadan önce, makinenizde Python'un kurulu olduğundan emin olun. Gerekli kütüphaneleri pip kullanarak yükleyebilirsiniz:

pip install requests
pip install  lxml
pip install urllib3

Daha sonra, gerekli kütüphaneleri içe aktaralım:

  • istekler: web sayfalarını almak üzere HTTP istekleri yapmak için;
  • lxml: HTML içeriğini ayrıştırmak için;
  • csv: çıkarılan verileri bir CSV dosyasına yazmak için;
  • random: rastgele proxy'ler ve User-Agent dizeleri seçmek için.
import requests
from lxml import html
import csv
import random
import urllib3
import ssl

Ürün URL'lerini tanımlayın

Kazınacak Walmart ürün URL'lerinin listesi.

product_urls = [
    'link with https',
    'link with https',
    'link with https'
]

Kullanıcı Aracısı dizeleri ve proxy'ler

Bir web sitesini kazımak için, gerçek bir tarayıcıdan gelen bir isteği taklit etmek amacıyla başta User-Agent başlığı olmak üzere doğru başlıkların kullanılması çok önemlidir. Dahası, döndürülebilir proxy sunucuları kullanarak site sahipleri tarafından uygulanan anti-bot önlemleri nedeniyle kısıtlanmaktan kaçınılabilir. Aşağıda, IP adresine dayalı yetkilendirme gerektiren proxy sunucularının nasıl entegre edileceğine ilişkin bir açıklama ile birlikte User-Agent dizelerinin örnekleri bulunmaktadır.

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 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]

İstekler için başlıklar

Tarayıcı isteklerini taklit etmek ve tespit edilmekten kaçınmak için başlıkları ayarlayı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',
    'dnt': '1',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    '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',
}

Veri depolamayı başlatın

Ürün ayrıntılarını saklamak için boş bir liste oluşturun.

product_details = []

URL sayfaları için numaralandırma işlemi aşağıdaki gibi çalışır: Her URL sayfası için rastgele seçilen bir Kullanıcı Aracısı ve proxy kullanılarak bir GET isteği gönderilir. HTML yanıtı alındıktan sonra, ürün adı, fiyatı ve yorumları gibi ayrıntıları çıkarmak için ayrıştırılır. Çıkarılan veriler bir sözlük olarak saklanır ve daha sonra daha önce oluşturulan bir listeye eklenir.

for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # URL'ye bir HTTP GET isteği gönderin
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # HTML içeriğini lxml kullanarak ayrıştırma
   parser = html.fromstring(response.text)
   # Ürün başlığını çıkar
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Ürün fiyatını çıkarın
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # İnceleme ayrıntılarını çıkarın
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Çıkarılan ayrıntıları bir sözlükte saklayın
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Ürün ayrıntılarını listeye ekleme
   product_details.append(product_detail)

Başlık:

1.png

Fiyat:

2.png

Ayrıntıları gözden geçirin:

3.png

Verileri CSV'ye kaydet

  1. Yazmak için yeni bir CSV dosyası açın.
  2. CSV dosyası için alan adlarını (sütunlar) tanımlayın.
  3. Sözlükleri CSV dosyasına yazmak için bir csv.DictWriter nesnesi oluşturun.
  4. Başlık satırını CSV dosyasına yazın.
  5. Ürün_detayları listesi boyunca döngü yapın ve her ürün sözlüğünü CSV dosyasına bir satır olarak yazın.
with open('walmart_products.csv', 'w', newline='') as csvfile:
    fieldnames = ['title', 'price', 'review_details']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for product_detail in product_details:
        writer.writerow(product_detail)

Tam kod:

İşte daha iyi anlamanıza yardımcı olmak için yorumlarla birlikte kodun tamamı:

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

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


# Kazınacak ürün URL'lerinin listesi
product_urls = [
   'link with https',
   'link with https',
   'link with https'
]

# Anonimlik için rastgele Kullanıcı Aracısı dizeleri
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 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
   'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

# IP rotasyonu için proxy listesi
proxy = [
    '<ip>:<port>',
    '<ip>:<port>',
    '<ip>:<port>',
]


# Tarayıcı isteklerini taklit etmek için üstbilgiler
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',
   'priority': 'u=0, i',
   'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
   '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',
}

# Ürün ayrıntılarını saklamak için boş bir liste başlatma
product_details = []

# Her ürün URL'si arasında döngü
for url in product_urls:
   headers['user-agent'] = random.choice(user_agents)
   proxies = {
       'http': f'http://{random.choice(proxy)}',
       'https': f'http://{random.choice(proxy)}',
   }
   try:
       # URL'ye bir HTTP GET isteği gönderin
       response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
       print(response.status_code)
       response.raise_for_status()
   except requests.exceptions.RequestException as e:
       print(f'Error fetching data: {e}')

   # HTML içeriğini lxml kullanarak ayrıştırma
   parser = html.fromstring(response.text)
   # Ürün başlığını çıkar
   title = ''.join(parser.xpath('//h1[@id="main-title"]/text()'))
   # Ürün fiyatını çıkarın
   price = ''.join(parser.xpath('//span[@itemprop="price"]/text()'))
   # İnceleme ayrıntılarını çıkarın
   review_details = ''.join(parser.xpath('//div[@data-testid="reviews-and-ratings"]/div/span[@class="w_iUH7"]/text()'))

   # Çıkarılan ayrıntıları bir sözlükte saklayın
   product_detail = {
       'title': title,
       'price': price,
       'review_details': review_details
   }
   # Ürün ayrıntılarını listeye ekleme
   product_details.append(product_detail)

# Çıkarılan verileri bir CSV dosyasına yazın
with open('walmart_products.csv', 'w', newline='') as csvfile:
   fieldnames = ['title', 'price', 'review_details']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for product_detail in product_details:
       writer.writerow(product_detail)

Eğitimimiz, Walmart'tan ürün verilerini kazımak ve daha sonra analiz etmek üzere CSV formatında kaydetmek için Python kütüphanelerinin nasıl kullanılacağını göstermektedir. Sağlanan komut dosyası temeldir ve kazıma işleminin verimliliğini artırmak için geliştirilebilecek bir temel sunar. Geliştirmeler arasında insan tarama modellerini taklit etmek için istekler arasında rastgele gecikmeler eklemek, tespit edilmekten kaçınmak için Kullanıcı Aracısı ve proxy rotasyonu uygulamak ve olası kazıma kesintilerini veya arızalarını yönetmek için sağlam bir hata işleme sistemi geliştirmek yer alabilir.

Yorumlar:

0 yorumlar