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.
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.
Ö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")
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)
Ç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)
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)
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]
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:
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)
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")
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