Python kullanarak Yelp nasıl kazınır

Yorumlar: 0

Yelp'ten veri kazımak, ad, URL, mutfaklar ve derecelendirmeler gibi ayrıntılar dahil olmak üzere yerel restoranlar hakkında değerli bilgiler sağlayabilir. Bu eğitimde requests ve lxml Python kütüphaneleri kullanılarak Yelp arama sonuçlarının nasıl kazınacağı gösterilecektir. Proxy kullanımı, başlıkların işlenmesi ve XPath ile veri ayıklama dahil olmak üzere çeşitli teknikler ele alınacaktır.

Adım 1: Ortamın ayarlanması

Kazıma işlemine başlamadan önce Python'un ve gerekli kütüphanelerin kurulu olduğundan emin olun:

pip install requests
pip install lxml

Bu kütüphaneler Yelp'e HTTP istekleri göndermemize, HTML içeriğini ayrıştırmamıza ve ihtiyacımız olan verileri çıkarmamıza yardımcı olacaktır.

Adım 2: Yelp'e bir talep gönderme

Öncelikle, HTML içeriğini almak için Yelp arama sonuçları sayfasına bir GET isteği göndermemiz gerekiyor. İşte nasıl yapılacağı:

import requests

# Yelp arama sayfası URL'si
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# HTML içeriğini almak için bir GET isteği gönderin
response = requests.get(url)

# İsteğin başarılı olup olmadığını kontrol edin
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

HTTP başlıklarını anlama

Bir web sitesine istekte bulunurken, uygun HTTP başlıklarını eklemek çok önemlidir. Başlıklar, isteği yapan tarayıcı veya aracı tanımlayan kullanıcı aracısı gibi istekle ilgili meta veriler içerebilir. Bu başlıkların eklenmesi, hedef web sitesi tarafından engellenmeyi veya yavaşlatmayı önlemeye yardımcı olabilir.

Başlıkları şu şekilde ayarlayabilirsiniz:

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': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    '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/127.0.0.0 Safari/537.36',
}

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

Proxy rotasyonunu uygulama

Çok sayıda sayfayı kazırken, IP adresinizin hedef site tarafından engellenme riski vardır. Bunu önlemek için proxy sunucularının kullanılması önerilir. Bu kılavuz için, otomatik rotasyon özelliğine sahip dinamik proxy sunucularının kullanılması tavsiye edilir. Bu şekilde, proxy sunucu ayarlarını yalnızca bir kez yapmanız gerekir ve rotasyon, IP adresini periyodik olarak değiştirerek erişimin korunmasına yardımcı olur ve engellenme olasılığını azaltır.

proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

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

Adım 3: HTML içeriğini lxml ile ayrıştırma

HTML içeriğine sahip olduğumuzda, bir sonraki adım onu ayrıştırmak ve ilgili verileri çıkarmaktır. Bu amaç için lxml kütüphanesini kullanacağız.

from lxml import html

# HTML içeriğini lxml kullanarak ayrıştırma
parser = html.fromstring(response.content)

Kazınacak Öğelerin Belirlenmesi

Arama sonuçları sayfasındaki restoran listelerini tek tek hedeflememiz gerekiyor. Bu öğeler XPath ifadeleri kullanılarak tanımlanabilir. Yelp için, listeler genellikle belirli bir data-testid özniteliğine sahip bir div öğesine sarılır.

# Bireysel restoran öğelerini ayıklayın
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

Veri ayıklama için XPath kullanımı

XPath, bir HTML belgesindeki düğümlerde gezinmek ve seçmek için güçlü bir araçtır. Bu eğitimde, her restoran öğesinden restoran adını, URL'yi, mutfakları ve derecelendirmeyi çıkarmak için XPath ifadelerini kullanacağız.

İşte her bir veri noktası için özel XPath'ler:

  1. Restoran Adı: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()
  2. Restoran URL'si: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href
  3. Mutfaklar: .//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()
  4. Değerlendirme: .//div[@class="y-css-9tnml4"]/@aria-label

Adım 4: Her bir restoran listesinden veri çıkarma

Artık HTML içeriğine sahip olduğumuza ve potansiyel IP engellemesini hallettiğimize göre, her restoran listesinden gerekli verileri çıkarabiliriz.

restaurants_data = []

# Her restoran öğesi üzerinde yineleme
for element in elements:
    # Restoran adını çıkarın
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Restoran URL'sini çıkarın
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Mutfakları ayıklayın
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Derecelendirmeyi çıkarın
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Verileri saklamak için bir sözlük oluşturun
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Restoran bilgilerini listeye ekleyin
    restaurants_data.append(restaurant_info)

Adım 5: Verileri JSON olarak kaydetme

Verileri çıkardıktan sonra, yapılandırılmış bir formatta kaydetmemiz gerekir. JSON bu amaç için yaygın olarak kullanılan bir formattır.

import json

# Verileri bir JSON dosyasına kaydedin
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Tamamlanmış kod

import requests
from lxml import html
import json

# Yelp arama sayfası URL'si
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Tarayıcı isteğini taklit etmek için üstbilgileri ayarlama
headers = {
    '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',
    'Accept-Language': 'en-US,en;q=0.5'
}

# Gerekirse proxy'leri ayarlayın
proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

# HTML içeriğini almak için bir GET isteği gönderin
response = requests.get(url, headers=headers, proxies=proxies)

# İsteğin başarılı olup olmadığını kontrol edin
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

# HTML içeriğini lxml kullanarak ayrıştırma
parser = html.fromstring(response.content)

# Bireysel restoran öğelerini ayıklayın
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

# Çıkarılan verileri tutmak için bir liste başlatın
restaurants_data = []

# Her restoran öğesi üzerinde yineleme
for element in elements:
    # Restoran adını çıkarın
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Restoran URL'sini çıkarın
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Mutfakları ayıklayın
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Derecelendirmeyi çıkarın
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Verileri saklamak için bir sözlük oluşturun
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Restoran bilgilerini listeye ekleyin
    restaurants_data.append(restaurant_info)

# Verileri bir JSON dosyasına kaydedin
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Kullanıcıların HTTP başlıklarını uygun şekilde yapılandırması ve kısıtlamaları aşmak ve engellemeyi önlemek için proxy'leri kullanması çok önemlidir. Optimize edilmiş ve daha güvenli bir kazıma deneyimi için IP rotasyonunu otomatikleştirmeyi düşünün. Dinamik yerleşik veya mobil proxy'ler kullanmak bu süreci önemli ölçüde geliştirerek tespit edilme ve engellenme olasılığını azaltabilir.

Yorumlar:

0 yorumlar