Python kullanarak Booking.com verileri nasıl kazınır

Yorumlar: 0

Bu makalede, Python ile Booking.com web sitesinden nasıl veri toplayacağımızı göstereceğiz. Otel adları, derecelendirmeler, fiyatlar, konum adresleri ve açıklamaları dahil ancak bunlarla sınırlı olmamak üzere bilgi elde edeceğiz. Sağlanan kod, HTML içeriğini ayrıştırarak ve gömülü JSON verilerini çıkararak otel sayfalarından veri almanıza olanak tanır.

Gerekli kütüphanelerin yüklenmesi

Booking.com'dan veri kazımak için kodu çalıştırmadan önce, gerekli Python kütüphanelerini yüklemeniz gerekir. Gerekli bağımlılıkları nasıl yükleyebileceğinizi aşağıda bulabilirsiniz:

  1. Requests Kütüphane: Bu, web sitesine HTTP istekleri göndermek ve sayfaların HTML içeriğini almak için kullanılır.
  2. LXML Kütüphane: Bu, HTML içeriğini ayrıştırmak ve XPath kullanarak veri çıkarmak için kullanılır.
  3. JSON: JSON verilerini işlemek için kullanılan yerleşik Python modülü.
  4. CSV: Kazınmış verileri bir CSV dosyasına yazmak için kullanılan yerleşik Python modülü.

Gerekli kütüphaneleri yüklemek için pip kullanabilirsiniz:


pip install requests lxml

Bunlar ihtiyacınız olan tek harici kütüphanelerdir ve geri kalanı (json, csv) Python ile önceden yüklenmiş olarak gelir.

URL'yi ve veri yapısını anlama

Booking.com'dan veri kazırken, web sayfasının yapısını ve çıkarmak istediğiniz veri türünü anlamak önemlidir. Booking.com'daki her otel sayfası, ad, konum ve fiyatlandırma gibi ayrıntıların kolayca çıkarılmasını sağlayan bir format olan JSON-LD biçiminde gömülü yapılandırılmış veriler içerir. Bu verileri kazıyacağız.

Adım Adım Kazıma Süreci

Booking.com dinamik bir site olduğundan ve otomatik eylemlerle mücadele etmek için önlemler uyguladığından, engelleme riski olmadan sorunsuz kazıma sağlamak için uygun HTTP başlıklarını ve proxy'leri kullanacağız.

Üstbilgiler ile HTTP İstekleri Gönderme

Üstbilgiler tarayıcıdaki bir kullanıcı oturumunu taklit eder ve Booking.com'un kazıma önleme sistemleri tarafından tespit edilmesini önler. Düzgün yapılandırılmış başlıklar olmadan, sunucu otomatik komut dosyalarını kolayca tanımlayabilir ve bu da IP engellemesine veya captcha zorluklarına yol açabilir.

Booking.com'un kazıma önleme mekanizmaları tarafından engellenmekten kaçınmak için, web sitesinde gezinen meşru bir kullanıcıyı simüle etmek için özel başlıklar kullanacağız. İşte uygun başlıklarla bir HTTP isteğini nasıl gönderebileceğiniz:


import requests
from lxml.html import fromstring

urls_list = ["https links"]

for url in urls_list:
    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': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
        '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/130.0.0.0 Safari/537.36',
    }

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

Vekillerin önemi

Booking.com gibi katı istek oranı sınırları uygulayan veya IP adreslerini izleyen siteleri kazırken proxy kullanmak gereklidir. Proxy'ler istek yükünün farklı IP adreslerine dağıtılmasına yardımcı olarak engellemeleri önler. Bu amaçla, hem ücretsiz proxy'ler hem de kullanıcı adı ve şifre veya IP adresi ile kimlik doğrulaması olan ücretli proxy hizmetleri kullanılabilir. Örneğimizde ikinci seçeneği kullanıyoruz.


proxies = {
    'http': '',
    'https': ''
}
response = requests.get(url, headers=headers, proxies=proxies)

HTML'yi ayrıştırma ve JSON verilerini çıkarma

İsteği gönderdikten sonra, otel ayrıntılarını içeren gömülü JSON-LD verilerini bulmak için lxml kullanarak HTML içeriğini ayrıştırıyoruz. Bu adım, otel adları, fiyatlar, konumlar ve daha fazlasını içeren yapılandırılmış verileri web sayfasından çıkarır.


parser = fromstring(response.text)

# Gömülü JSON verilerini ayıklayın
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])

Otel bilgilerini çıkarma

Ayrıştırılmış JSON verilerine sahip olduğumuzda, otel adı, adres, derecelendirme ve fiyatlandırma gibi ilgili alanları çıkarabiliriz. Aşağıda JSON'dan otel bilgilerini çıkarmak için kod bulunmaktadır:


name = json_data['name']
location = json_data['hasMap']
priceRange = json_data['priceRange']
description = json_data['description']
url = json_data['url']
ratingValue = json_data['aggregateRating']['ratingValue']
reviewCount = json_data['aggregateRating']['reviewCount']
type_ = json_data['@type']
postalCode = json_data['address']['postalCode']
addressLocality = json_data['address']['addressLocality']
addressCountry = json_data['address']['addressCountry']
addressRegion = json_data['address']['addressRegion']
streetAddress = json_data['address']['streetAddress']
image_url = json_data['image']
room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")

# Verileri all_data listesine ekler
all_data.append({
    "Name": name,
    "Location": location,
    "Price Range": priceRange,
    "Rating": ratingValue,
    "Review Count": reviewCount,
    "Type": type_,
    "Postal Code": postalCode,
    "Address Locality": addressLocality,
    "Country": addressCountry,
    "Region": addressRegion,
    "Street Address": streetAddress,
    "URL": url,
    "Image URL": image_url,
    "Room Types": room_types
})

Verileri CSV'ye kaydetme

Veriler çıkarıldıktan sonra, daha fazla analiz için bir CSV dosyasına kaydedebiliriz:


# Tüm URL'ler işlendikten sonra, verileri bir CSV dosyasına yazın
with open('booking_data.csv', 'w', newline='') as csvfile:
    fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code", 
                  "Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
    
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    # Başlığı yazın
    writer.writeheader()
    
    # Veri satırlarını yazın
    writer.writerows(all_data)

Tamamlanmış kod

İşte tüm bölümleri birleştiren tam kod:


import requests
from lxml.html import fromstring
import json
import csv

# Kazınacak otel URL'lerinin listesi
urls_list = [
    "Https link", 
    "Https link"
]

# Kazınan tüm verileri tutmak için boş bir liste başlatın
all_data = []

proxies = {
    'http': ''
}

# Veri kazımak için her URL'de döngü
for url in urls_list:
    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': '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
        '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/130.0.0.0 Safari/537.36',
    }

    # Talebin web sitesine gönderilmesi
    response = requests.get(url, headers=headers, proxies=proxies)
    
    # HTML içeriğini ayrıştırma
    parser = fromstring(response.text)
    
    # Gömülü JSON verilerini ayıklayın
    embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
    json_data = json.loads(embeded_jsons[0])

    # Tüm otel ayrıntılarını JSON'dan çıkarın
    name = json_data['name']
    location = json_data['hasMap']
    priceRange = json_data['priceRange']
    description = json_data['description']
    url = json_data['url']
    ratingValue = json_data['aggregateRating']['ratingValue']
    reviewCount = json_data['aggregateRating']['reviewCount']
    type_ = json_data['@type']
    postalCode = json_data['address']['postalCode']
    addressLocality = json_data['address']['addressLocality']
    addressCountry = json_data['address']['addressCountry']
    addressRegion = json_data['address']['addressRegion']
    streetAddress = json_data['address']['streetAddress']
    image_url = json_data['image']

    room_types = parser.xpath("//a[contains(@href, '#RD')]/span/text()")
    
    # Verileri all_data listesine ekler
    all_data.append({
        "Name": name,
        "Location": location,
        "Price Range": priceRange,
        "Rating": ratingValue,
        "Review Count": reviewCount,
        "Type": type_,
        "Postal Code": postalCode,
        "Address Locality": addressLocality,
        "Country": addressCountry,
        "Region": addressRegion,
        "Street Address": streetAddress,
        "URL": url,
        "Image URL": image_url,
        "Room Types": room_types
    })

# Tüm URL'ler işlendikten sonra, verileri bir CSV dosyasına yazın
with open('booking_data.csv', 'w', newline='') as csvfile:
    fieldnames = ["Name", "Location", "Price Range", "Rating", "Review Count", "Type", "Postal Code", 
                  "Address Locality", "Country", "Region", "Street Address", "URL", "Image URL", "Room Types"]
    
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    
    # Write the header
    writer.writeheader()
    
    # Write the rows of data
    writer.writerows(all_data)

print("Data successfully saved to booking_data.csv")

Bu makale, Python kullanarak Booking.com'dan otel verilerinin nasıl kazınacağını gösterdi. Kazıma karşıtı önlemleri atlamak için uygun HTTP başlıklarını ve proxy'leri kullanmanın önemini vurguladık. Çıkarılan veriler daha fazla analiz için bir CSV dosyasına kaydedilebilir. Web sitelerini kazırken, ihlalden kaçınmak için her zaman hizmet şartlarını kontrol edin.

Yorumlar:

0 yorumlar