In diesem Artikel demonstrieren wir, wie man mit Python Daten von der Booking.com-Website sammelt. Wir werden Informationen erhalten, einschließlich, aber nicht beschränkt auf Hotelnamen, Bewertungen, Preise, Standortadressen und deren Beschreibungen. Mit dem bereitgestellten Code können Sie Daten von Hotelseiten abrufen, indem Sie HTML-Inhalte parsen und eingebettete JSON-Daten extrahieren.
Bevor Sie den Code zum Scrapen von Daten von Booking.com ausführen, müssen Sie die erforderlichen Python-Bibliotheken installieren. Hier erfahren Sie, wie Sie die erforderlichen Abhängigkeiten installieren können:
Um die notwendigen Bibliotheken zu installieren, können Sie pip verwenden:
pip install requests lxml
Dies sind die einzigen externen Bibliotheken, die Sie benötigen, und der Rest (json, csv) wird mit Python vorinstalliert.
Beim Scrapen von Daten von Booking.com ist es wichtig, die Struktur der Webseite und die Art der Daten, die man extrahieren möchte, zu verstehen. Jede Hotelseite auf Booking.com enthält eingebettete strukturierte Daten in Form von JSON-LD, einem Format, das eine einfache Extraktion von Details wie Name, Ort und Preis ermöglicht. Wir werden diese Daten auslesen.
Da Booking.com eine dynamische Website ist und Maßnahmen zur Bekämpfung automatisierter Aktionen implementiert, werden wir geeignete HTTP-Header und Proxys verwenden, um ein reibungsloses Scraping ohne das Risiko einer Blockierung zu gewährleisten.
Header imitieren eine Benutzersitzung in einem Browser und verhindern die Erkennung durch die Anti-Scraping-Systeme von Booking.com. Ohne richtig konfigurierte Header kann der Server automatisierte Skripte leicht erkennen, was zu IP-Blockierung oder Captcha-Herausforderungen führen kann.
Um zu vermeiden, dass sie von den Anti-Scraping-Mechanismen von Booking.com blockiert werden, werden wir benutzerdefinierte Header verwenden, um einen legitimen Benutzer zu simulieren, der die Website besucht. Hier sehen Sie, wie Sie eine HTTP-Anfrage mit den richtigen Headern senden können:
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)
Die Verwendung von Proxys ist notwendig, wenn Sie Websites wie Booking.com scannen, die strenge Limits für die Anfragerate anwenden oder IP-Adressen verfolgen. Proxys helfen dabei, die Last der Anfragen auf verschiedene IP-Adressen zu verteilen und so Blockaden zu verhindern. Zu diesem Zweck können sowohl kostenlose Proxys als auch kostenpflichtige Proxy-Dienste mit Authentifizierung durch Benutzernamen und Passwort oder IP-Adresse verwendet werden. In unserem Beispiel verwenden wir die letztere Option.
proxies = {
'http': '',
'https': ''
}
response = requests.get(url, headers=headers, proxies=proxies)
Nach dem Senden der Anfrage wird der HTML-Inhalt mit lxml geparst, um die eingebetteten JSON-LD-Daten mit den Hoteldetails zu finden. In diesem Schritt werden die strukturierten Daten aus der Webseite extrahiert, die Hotelnamen, Preise, Standorte und vieles mehr enthalten.
parser = fromstring(response.text)
# Eingebettete JSON-Daten extrahieren
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
Sobald wir die geparsten JSON-Daten haben, können wir relevante Felder wie Hotelname, Adresse, Bewertung und Preis extrahieren. Nachfolgend finden Sie den Code zum Extrahieren von Hotelinformationen aus JSON:
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()")
# Anhängen der Daten an die Liste all_data
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
})
Sobald die Daten extrahiert wurden, können wir sie für die weitere Analyse in einer CSV-Datei speichern:
# Nachdem alle URLs verarbeitet wurden, schreiben Sie die Daten in eine CSV-Datei
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)
# Schreiben Sie die Kopfzeile
writer.writeheader()
# Schreiben der Datenzeilen
writer.writerows(all_data)
Hier ist der vollständige Code, der alle Abschnitte kombiniert:
import requests
from lxml.html import fromstring
import json
import csv
# Liste der Hotel-URLs zum Scrapen
urls_list = [
"Https link",
"Https link"
]
# Initialisieren einer leeren Liste, die alle ausgewerteten Daten enthält
all_data = []
proxies = {
'http': ''
}
# Schleife durch jede URL, um Daten zu scrapen
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',
}
# Senden der Anfrage an die Website
response = requests.get(url, headers=headers, proxies=proxies)
# Parsen des HTML-Inhalts
parser = fromstring(response.text)
# Eingebettete JSON-Daten extrahieren
embeded_jsons = parser.xpath('//script[@type="application/ld+json"]/text()')
json_data = json.loads(embeded_jsons[0])
# Extrahieren aller Hoteldetails aus JSON
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()")
# Anhängen der Daten an die Liste all_data
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
})
# Nachdem alle URLs verarbeitet wurden, schreiben Sie die Daten in eine CSV-Datei
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)
# Schreiben Sie die Kopfzeile
writer.writeheader()
# Schreiben der Datenzeilen
writer.writerows(all_data)
print("Data successfully saved to booking_data.csv")
In diesem Artikel wurde gezeigt, wie man Hoteldaten von Booking.com mit Python auslesen kann. Wir haben betont, wie wichtig die Verwendung geeigneter HTTP-Header und Proxys ist, um Anti-Scraping-Maßnahmen zu umgehen. Die extrahierten Daten können zur weiteren Analyse in einer CSV-Datei gespeichert werden. Prüfen Sie beim Scraping von Websites immer die Nutzungsbedingungen, um Verstöße zu vermeiden.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bemerkungen: 0