Erschließen Sie die Macht der Daten: Wie man Booking.com nach wertvollen Informationen durchforstet
Raluca Penciuc am 07. April 2023

Als führendes Online-Reisebüro ist Booking.com eine Fundgrube wertvoller Daten über Hotels und Ferienunterkünfte auf der ganzen Welt. Von Gästebewertungen über Preise bis hin zur Verfügbarkeit - die auf Booking verfügbaren Informationen können für eine Vielzahl von Zwecken unglaublich nützlich sein.
Ganz gleich, ob Sie ein Unternehmer sind, der die Konkurrenz bewertet, oder ein Datenwissenschaftler, der Trends im Gastgewerbe analysiert, Web Scraping ist ein leistungsfähiges Werkzeug, mit dem Sie die benötigten Daten von Buchungsseiten sammeln können.
Am Ende dieses Tutorials werden Sie ein solides Verständnis dafür haben, wie man Booking.com mit der beliebten Node.js-Automatisierungsbibliothek Puppeteer scrapen kann. Wir konzentrieren uns auf das Extrahieren von Angebotsdetails aus Madeira, Portugal, aber die Techniken und Konzepte, die in diesem Tutorial behandelt werden, können auch auf andere Websites und Datenpunkte angewendet werden.
Voraussetzungen
Wenn Sie Ihre Node.js-Umgebung noch nicht eingerichtet haben, gehen Sie einfach auf die offizielle Website und laden Sie die neueste Version für Ihr Betriebssystem herunter. Erstellen Sie dann ein neues Verzeichnis und führen Sie den folgenden Befehl aus, um Ihr Projekt zu initialisieren:
npm init -y
Wir werden TypeScript verwenden, um den Code zu schreiben. Die Obermenge von JavaScript bietet optionale statische Typisierung und andere Funktionen. Es ist nützlich für größere Projekte und kann es einfacher machen, Fehler frühzeitig zu erkennen. Sie müssen es zu den Projektdependenzen hinzufügen und seine Konfigurationsdatei initialisieren:
npm install typescript -save-dev npx tsc -init
Stellen Sie einfach sicher, dass in der neu generierten Datei tsconfig.json die Eigenschaft "outDir" auf "dist" gesetzt ist, da wir beabsichtigen, den TypeScript-Code vom kompilierten Code zu trennen.
Schließlich wird der folgende Befehl Puppeteer zu unseren Projektabhängigkeiten hinzufügen:
npm Puppeteer installieren
Puppeteer ist eine Node.js-Bibliothek, die eine High-Level-API für die Steuerung eines kopflosen Chrome-Browsers bereitstellt, der für Web-Scraping und Automatisierungsaufgaben verwendet werden kann
Standort der Daten
Für dieses Tutorial haben wir uns entschieden, die verfügbaren Immobilien auf den Madeira-Inseln, Portugal, zu durchsuchen: https://www.booking.com/searchresults.en-us.html?ss=Madeira+Islands&checkin=2023-01-13&checkout=2023-01-15. Es ist wichtig, das An- und Abreisedatum in die URL einzufügen, damit alle Immobilieninformationen verfügbar sind.
Dieser Leitfaden behandelt die Extraktion der folgenden Immobiliendaten:
- der Name
- die URL
- die physische Adresse
- der Preis
- das Rating und die Anzahl der Bewertungen
- das Vorschaubild
Sie sind in der nachstehenden Abbildung hervorgehoben:

Wenn Sie die Entwicklertools für jedes dieser Elemente öffnen, können Sie die CSS-Selektoren sehen, die wir zum Auffinden der HTML-Elemente verwenden werden. Wenn Sie mit der Funktionsweise von CSS-Selektoren noch nicht vertraut sind, können Sie diesen Leitfaden für Einsteiger nutzen.
Parsing der Daten
Da alle Inserate die gleiche Struktur und die gleichen Daten haben, können wir alle Informationen für die gesamte Eigenschaftsliste in unserem Algorithmus extrahieren. Nach der Ausführung des Skripts können wir alle Ergebnisse in einer Schleife durchgehen und zu einer einzigen Liste zusammenstellen.
Nach einem ersten Blick auf das HTML-Dokument haben Sie vielleicht bemerkt, dass die Booking-Website ziemlich komplex ist und die Klassennamen größtenteils zufällig generiert werden.

Zu unserem Glück verlässt sich die Website nicht nur auf Klassennamen, sondern wir können den Wert eines bestimmten Attributs als Extraktionskriterium verwenden. Im obigen Screenshot haben wir hervorgehoben, wie zugänglich das Vorschaubild, der Name und die URL einer Eigenschaft sind.
import puppeteer from 'puppeteer';
async function scrapeBookingData(booking_url: string): Promise<void> {
// Launch Puppeteer
const browser = await puppeteer.launch({
headless: false,
args: ['--start-maximized'],
defaultViewport: null
})
const page = await browser.newPage()
// Navigate to the channel URL
await page.goto(booking_url)
// Extract listings name
const listings_name = await page.evaluate(() => {
const names = document.querySelectorAll('div[data-testid="title"]')
const names_array = Array.from(names)
return names ? names_array.map(n => n.textContent) : []
})
console.log(listings_name)
// Extract listings location
const listings_location = await page.evaluate(() => {
const locations = document.querySelectorAll('a[data-testid="title-link"]')
const locations_array = Array.from(locations)
return locations ? locations_array.map(l => l.getAttribute('href')) : []
})
console.log(listings_location)
// Extract listings thumbnail
const listings_thumbnail = await page.evaluate(() => {
const thumbnails = document.querySelectorAll('[data-testid="image"]')
const thumbnails_array = Array.from(thumbnails)
return thumbnails ? thumbnails_array.map(t => t.getAttribute('src')) : []
})
console.log(listings_thumbnail)
await browser.close()
}
scrapeBookingData("https://www.booking.com/searchresults.en-us.html?ss=Madeira+Islands&checkin=2023-01-13&checkout=2023-01-15")
Wir haben Puppeteer verwendet, um eine Browser-Instanz zu öffnen, eine neue Seite zu erstellen, zu unserer Ziel-URL zu navigieren, die erwähnten Daten zu extrahieren und dann den Browser zu schließen. Für visuelle Debugging-Zwecke verwende ich den nicht-kopflosen Modus des Browsers.
Wie oben erläutert, waren die Daten dank des Attributs "data-testid", das dem HTML-Element einen eindeutigen Wert zuweist, leicht zugänglich. Führen Sie den folgenden Befehl aus, um das Skript auszuführen:
npx tsc && node dist/index.js
Ihr Terminal sollte drei gleich große Listenergebnisse anzeigen, die die Namen, die URLs und die Miniaturansichten aller Eigenschaften auf der aktuellen Seite enthalten.

Im nächsten Abschnitt des HTML-Dokuments haben wir die Adresse, die Bewertung und die Anzahl der Bewertungen für eine Immobilie hervorgehoben.
// Extract listings address
const listings_address = await page.evaluate(() => {
const addresses = document.querySelectorAll('[data-testid="address"]')
const addresses_array = Array.from(addresses)
return addresses ? addresses_array.map(a => a.textContent) : []
})
console.log(listings_address)
// Extract listings rating and review count
const listings_rating = await page.evaluate(() => {
const ratings = document.querySelectorAll('[data-testid="review-score"]')
const ratings_array = Array.from(ratings)
return ratings ? ratings_array.map(r => r.textContent) : []
})
console.log(listings_rating)
Wie zuvor haben wir das Attribut "data-testid" verwendet. Wenn Sie das Skript noch einmal ausführen, sollten Sie 2 weitere Listen sehen, genau wie bei den vorherigen.

Und schließlich haben wir im letzten Abschnitt den Preis der Immobilie extrahiert. Der Code wird sich nicht von dem unterscheiden, was wir zuvor gemacht haben:
// Extract listings price
const listings_price = await page.evaluate(() => {
const prices = document.querySelectorAll('[data-testid="price-and-discounted-price"]')
const prices_array = Array.from(prices)
return prices ? prices_array.map(p => p.textContent) : []
})
console.log(listings_price)
Um die Weiterverarbeitung der extrahierten Daten zu erleichtern, werden wir die resultierenden Listen in einer einzigen zusammenfassen.
// Group the lists
const listings = []
for (let i = 0; i < listings_name.length; i++) {
listings.push({
name: listings_name[i],
url: listings_location[i],
address: listings_address[i],
price: listings_price[i],
ratings: listings_rating[i],
thumbnails: listings_thumbnail[i]
})
}
console.log(listings)
Das Endergebnis sollte nun wie folgt aussehen:
[
{
name: 'Pestana Churchill Bay',
url: 'https://www.booking.com/hotel/pt/pestana-churchill-bay.html?aid=304142&label=gen173nr-1FCAQoggJCFnNlYXJjaF9tYWRlaXJhIGlzbGFuZHNIMVgEaMABiAEBmAExuAEXyAEM2AEB6AEB-AEDiAIBqAIDuAK9luydBsACAdICJGViMWY2MmRjLWJhZmEtNGZhZC04MDAyLWQ4MmU3YjU5MTMwZtgCBeACAQ&ucfs=1&arphpl=1&checkin=2023-01-13&checkout=2023-01-15&group_adults=2&req_adults=2&no_rooms=1&group_children=0&req_children=0&hpos=1&hapos=1&sr_order=popularity&srpvid=42cc81de452009eb&srepoch=1673202494&all_sr_blocks=477957801_262227867_0_1_0&highlighted_blocks=477957801_262227867_0_1_0&matching_block_id=477957801_262227867_0_1_0&sr_pri_blocks=477957801_262227867_0_1_0__18480&tpi_r=2&from_sustainable_property_sr=1&from=searchresults#hotelTmpl',
address: 'Câmara de Lobos',
price: '911 lei',
ratings: '9.0Wonderful 727 reviews',
thumbnails: 'https://cf.bstatic.com/xdata/images/hotel/square200/202313893.webp?k=824dc3908c4bd3e80790ce011f763f10fd4064dcb5708607f020f2e7c92d130e&o=&s=1'
},
{
name: 'Hotel Madeira',
url: 'https://www.booking.com/hotel/pt/madeira-funchal.html?aid=304142&label=gen173nr-1FCAQoggJCFnNlYXJjaF9tYWRlaXJhIGlzbGFuZHNIMVgEaMABiAEBmAExuAEXyAEM2AEB6AEB-AEDiAIBqAIDuAK9luydBsACAdICJGViMWY2MmRjLWJhZmEtNGZhZC04MDAyLWQ4MmU3YjU5MTMwZtgCBeACAQ&ucfs=1&arphpl=1&checkin=2023-01-13&checkout=2023-01-15&group_adults=2&req_adults=2&no_rooms=1&group_children=0&req_children=0&hpos=2&hapos=2&sr_order=popularity&srpvid=42cc81de452009eb&srepoch=1673202494&all_sr_blocks=57095605_262941681_2_1_0&highlighted_blocks=57095605_262941681_2_1_0&matching_block_id=57095605_262941681_2_1_0&sr_pri_blocks=57095605_262941681_2_1_0__21200&tpi_r=2&from_sustainable_property_sr=1&from=searchresults#hotelTmpl',
address: 'Se, Funchal',
price: '1,045 lei',
ratings: '8.3Very Good 647 reviews',
thumbnails: 'https://cf.bstatic.com/xdata/images/hotel/square200/364430623.webp?k=8c1e510da2aad0fc9ff5731c3874e05b1c4cceec01a07ef7e9db944799771724&o=&s=1'
},
{
name: 'Les Suites at The Cliff Bay - PortoBay',
url: 'https://www.booking.com/hotel/pt/les-suites-at-the-cliff-bay.html?aid=304142&label=gen173nr-1FCAQoggJCFnNlYXJjaF9tYWRlaXJhIGlzbGFuZHNIMVgEaMABiAEBmAExuAEXyAEM2AEB6AEB-AEDiAIBqAIDuAK9luydBsACAdICJGViMWY2MmRjLWJhZmEtNGZhZC04MDAyLWQ4MmU3YjU5MTMwZtgCBeACAQ&ucfs=1&arphpl=1&checkin=2023-01-13&checkout=2023-01-15&group_adults=2&req_adults=2&no_rooms=1&group_children=0&req_children=0&hpos=3&hapos=3&sr_order=popularity&srpvid=42cc81de452009eb&srepoch=1673202494&all_sr_blocks=395012401_247460894_2_1_0&highlighted_blocks=395012401_247460894_2_1_0&matching_block_id=395012401_247460894_2_1_0&sr_pri_blocks=395012401_247460894_2_1_0__100000&tpi_r=2&from_sustainable_property_sr=1&from=searchresults#hotelTmpl',
address: 'Sao Martinho, Funchal',
price: '4,928 lei',
ratings: '9.5Exceptional 119 reviews',
thumbnails: 'https://cf.bstatic.com/xdata/images/hotel/square200/270120962.webp?k=68ded1031f5082597c48eb25c833ea7fcedc2ec2bc5d555adfcac98b232f9745&o=&s=1'
}
]
Alternativen
Auch wenn das Tutorial bis zu diesem Punkt einfach erschien, müssen wir auf die üblichen Vorbehalte beim Web Scraping hinweisen, insbesondere dann, wenn Sie Ihr Projekt erweitern möchten.
Heutzutage setzen Websites verschiedene Bot-Erkennungstechniken ein und sammeln Browserdaten, um automatisierten Datenverkehr zu verhindern oder zu blockieren. Booking.com macht keine Ausnahme von dieser Regel. Mit Hilfe des PerimeterX-Schutzes führt die Website Überprüfungen Ihrer IP-Adresse durch und sammelt mehrere Informationen:
- Eigenschaften des Navigator-Objekts (deviceMemory, Sprachen, Plattform, userAgent, webdriver, usw.)
- Aufzählung der Schriftarten und Plugins
- Prüfung der Bildschirmabmessungen
- und viele mehr.
Eine Lösung für diese Herausforderungen ist die Verwendung einer Scraping-API, die eine einfache und zuverlässige Möglichkeit bietet, auf Daten von Websites wie Booking.com zuzugreifen, ohne dass Sie einen eigenen Scraper entwickeln und pflegen müssen.
WebScrapingAPI ist ein solches Produkt, das die Proxy-Rotation zur Umgehung von CAPTCHAs nutzt und Browserdaten zufällig generiert, um einen echten Benutzer zu imitieren. Um loszulegen, registrieren Sie sich einfach für ein Konto und erhalten Sie Ihren API-Schlüssel vom Dashboard. Dieser Schlüssel wird zur Authentifizierung Ihrer Anfragen verwendet.

Um die API schnell mit dem bereits vorhandenen Node.js-Projekt zu testen, können wir das entsprechende SDK verwenden. Führen Sie einfach den folgenden Befehl aus:
npm install webscrapingapi
Jetzt müssen Sie nur noch die bisherigen CSS-Selektoren an die API anpassen. Mit der Funktion "Extraktionsregeln" können Sie Daten mit minimalen Änderungen analysieren, was sie zu einem leistungsstarken Werkzeug in Ihrem Web-Scraping-Toolkit macht.
import webScrapingApiClient from 'webscrapingapi';
const client = new webScrapingApiClient("YOUR_API_KEY");
async function exampleUsage() {
const api_params = {
'render_js': 1,
'proxy_type': 'datacenter',
'timeout': 60000,
'extract_rules': JSON.stringify({
names: {
selector: 'div[data-testid="title"]',
output: 'text',
all: '1'
},
locations: {
selector: 'a[data-testid="title-link"]',
output: '@href',
all: '1'
},
addresses: {
selector: '[data-testid="address"]',
output: 'text',
all: '1'
},
prices: {
selector: '[data-testid="price-and-discounted-price"]',
output: 'text',
all: '1'
},
ratings: {
selector: '[data-testid="review-score"]',
output: 'text',
all: '1'
},
thumbnails: {
selector: '[data-testid="image"]',
output: '@src',
all: '1'
}
})
}
const URL = "https://www.booking.com/searchresults.en-us.html?ss=Madeira+Islands&checkin=2023-01-13&checkout=2023-01-15"
const response = await client.get(URL, api_params)
if (response.success) {
// Group the lists
const listings = []
for (let i = 0; i < response.response.data.names.length; i++) {
listings.push({
name: response.response.data.names[i],
url: response.response.data.locations[i],
address: response.response.data.addresses[i],
price: response.response.data.prices[i],
ratings: response.response.data.ratings[i],
thumbnails: response.response.data.thumbnails[i]
})
}
console.log(listings)
} else {
console.log(response.error.response.data)
}
}
exampleUsage();
Schlussfolgerung
In diesem Tutorial haben wir die Grundlagen für das Scrapen von Booking.com mit Node.js und Puppeteer behandelt. Wir haben Ihnen gezeigt, wie Sie Ihre Umgebung einrichten und Buchungsdetails für Madeira, Portugal, extrahieren. Diese Techniken und Konzepte können jedoch auch auf andere Websites und Datenpunkte angewendet werden.
Web Scraping kann ein unglaublich nützliches Werkzeug für Unternehmen und Datenwissenschaftler gleichermaßen sein. Durch das Sammeln von Daten von Booking.com können Sie wertvolle Einblicke in das Gastgewerbe gewinnen, die Konkurrenz bewerten und vieles mehr. Es ist jedoch wichtig zu bedenken, dass Web Scraping gegen die Nutzungsbedingungen einiger Websites verstoßen kann, und es ist immer eine gute Idee, die spezifischen Richtlinien zu überprüfen, bevor Sie fortfahren.
Es ist zwar möglich, einen eigenen Web Scraper zu erstellen, aber die Inanspruchnahme eines professionellen Dienstes ist oft die sicherere und effizientere Option, insbesondere bei größeren Projekten. Ein professioneller Scraper verfügt über das Fachwissen und die Ressourcen, um alle auftretenden Herausforderungen zu bewältigen und hochwertige Ergebnisse zu liefern.
Wir hoffen, dass Ihnen dieses Tutorial gefallen hat und dass Sie sich nun in der Lage fühlen, wertvolle Daten von Booking.com in einer Node.js-Umgebung zu sammeln. Vielen Dank fürs Lesen!
Nachrichten und Aktualisierungen
Bleiben Sie auf dem Laufenden mit den neuesten Web Scraping-Anleitungen und Nachrichten, indem Sie unseren Newsletter abonnieren.
We care about the protection of your data. Read our <l>Privacy Policy</l>.Privacy Policy.

Ähnliche Artikel

Lernen Sie, wie Sie mit Scrapy und Splash dynamische JavaScript-gerenderte Websites scrapen können. Von der Installation über das Schreiben eines Spiders bis hin zum Umgang mit Seitenumbrüchen und der Verwaltung von Splash-Antworten bietet dieser umfassende Leitfaden Schritt-für-Schritt-Anleitungen für Anfänger und Experten gleichermaßen.


Erforschen Sie die transformative Kraft des Web Scraping im Finanzsektor. Von Produktdaten bis zur Stimmungsanalyse bietet dieser Leitfaden Einblicke in die verschiedenen Arten von Webdaten, die für Investitionsentscheidungen zur Verfügung stehen.


Starten Sie mit WebScrapingAPI, der ultimativen Web-Scraping-Lösung! Sammeln Sie Echtzeitdaten, umgehen Sie Anti-Bot-Systeme und genießen Sie professionellen Support.
