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.
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:
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.
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.
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 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)
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)
İ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])
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
})
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)
İş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