booking.com bot korumalı bir site olduğundan Selenium veya Playwright gibi tarayıcı otomasyonları kullanmak daha güvenlidir.
booking.com scraping işlemlerinde sınırları zorlamadan, sleep() ile bekleyerek ve sayfa sayısını aşırı yükseltmeden ilerle. Aksi takdirde geçici ban yiyebilirsin.
Gerekli paketleri aşağıdaki gibi kurman gerekiyor.
pip install selenium pandas googletrans==4.0.0-rc1 undetected-chromedriver
Aşağıdaki uygulama başlangıç aşamasında yardımcı olacaktır, kendi isteklerine göre daha da geliştirebilirsin.
Uygulama;
import time
import pandas as pd
from googletrans import Translator
from selenium import webdriver
from selenium.webdriver.common.by import By
import undetected_chromedriver as uc
# Tarayıcı ve çevirmen başlat
options = uc.ChromeOptions()
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = uc.Chrome(options=options)
translator = Translator()
# Yorum verilerini çek
def scrape_reviews(booking_url, max_pages=3):
all_reviews = []
driver.get(booking_url)
time.sleep(5) # Sayfanın yüklenmesini bekle
for page in range(max_pages):
print(f"--- Sayfa {page+1} ---")
time.sleep(2)
reviews = driver.find_elements(By.CLASS_NAME, 'review_list_new_item_block')
for r in reviews:
try:
name = r.find_element(By.CLASS_NAME, 'bui-avatar-block__title').text.strip()
nationality = r.find_element(By.CLASS_NAME, 'bui-avatar-block__subtitle').text.strip()
score = r.find_element(By.CLASS_NAME, 'bui-review-score__badge').text.strip()
date = r.find_element(By.CLASS_NAME, 'c-review-block__date').text.strip()
try:
stay_info = r.find_element(By.CLASS_NAME, 'c-review-block__stay-date').text.strip()
except:
stay_info = ''
review_parts = r.find_elements(By.CLASS_NAME, 'c-review__body')
review_text = ' '.join([p.text.strip() for p in review_parts if p.text.strip()])
# Otomatik çeviri
detected = translator.detect(review_text).lang
if detected != "en":
review_en = translator.translate(review_text, dest='en').text
else:
review_en = review_text
all_reviews.append({
'Name': name,
'Nationality': nationality,
'Score': score,
'Date': date,
'Stay Info': stay_info,
'Review Original': review_text,
'Review (EN)': review_en
})
except Exception as e:
print(f"Yorum parse hatası: {e}")
continue
# Sonraki sayfaya geç
try:
next_btn = driver.find_element(By.CSS_SELECTOR, 'a.pagenext')
driver.execute_script("arguments[0].click();", next_btn)
except:
print("Daha fazla sayfa yok.")
break
return all_reviews
Çalıştırmak için;
if __name__ == "__main__":
# Örnek Booking yorum sayfası (bir otelin yorum sekmesiyle biten URL)
url = "https://www.booking.com/hotel/fr/example.tr.html#tab-reviews" # Gerçek URL ile değiştir
yorumlar = scrape_reviews(url, max_pages=5)
df = pd.DataFrame(yorumlar)
df.to_csv("booking_yorumlar.csv", index=False, encoding='utf-8-sig')
print("Yorumlar başarıyla CSV'ye kaydedildi.")
driver.quit()