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()