Web Scraping für Immobilien: Wie man Daten von Realtor.com wie ein Profi extrahiert

Raluca Penciuc am 07. April 2023

blog-image


Das Sammeln genauer und aktueller Daten ist für Unternehmen und Privatpersonen in vielen Branchen von entscheidender Bedeutung, so auch im Immobilienbereich. Realtor.com ist eine beliebte Website für die Suche nach Wohnungen und Häusern zum Verkauf oder zur Miete, da sie eine Fülle von Informationen enthält, die für Immobilienfachleute, Investoren und Hauskäufer wertvoll sein können.

In diesem Tutorial zeige ich Ihnen, wie Sie realtor.com scrapen können, damit Sie die Daten zur Verfügung haben, die Sie für den Start Ihres Projekts benötigen. Ich gehe durch den Prozess der Einrichtung eines Projekts, der Navigation zu realtor.com und der Extraktion der gewünschten Daten.

Ich werde auch auf Möglichkeiten eingehen, die Zuverlässigkeit und Effizienz des Scrapers zu verbessern, und erläutern, warum die Inanspruchnahme eines professionellen Scraper-Dienstes für einige Anwendungsfälle die bessere Wahl sein kann.

Am Ende dieses Tutorials sollten Sie ein gutes Verständnis dafür haben, wie man realtor.com scrapen kann, unabhängig davon, welchen Beruf Sie ausüben: ein Immobilienprofi auf der Suche nach einem Wettbewerbsvorteil, ein Investor auf der Suche nach neuen Möglichkeiten oder ein Hauskäufer auf der Suche nach der perfekten Immobilie.

Einrichtung der Umgebung

Bevor Sie mit dem Scraping beginnen können, müssen Sie Node.js auf Ihrem Computer installieren. Sie können die neueste Version von der offiziellen Website herunterladen und die Anweisungen entsprechend Ihrem Betriebssystem befolgen.

Erstellen Sie dann ein neues Verzeichnis für Ihr Projekt und navigieren Sie in Ihrem Terminal oder in der Eingabeaufforderung dorthin. Führen Sie den folgenden Befehl aus, um ein neues Node.js-Projekt zu initialisieren:

npm init -y

Dadurch wird eine package.json-Datei in Ihrem Projektverzeichnis erstellt, in der Informationen über Ihr Projekt und seine Abhängigkeiten gespeichert werden.

Um TypeScript zu installieren, führen Sie den folgenden Befehl aus:

npm install typescript -save-dev

TypeScript ist eine Obermenge von JavaScript, die optionale statische Typisierung und andere Funktionen bietet. Es ist nützlich für größere Projekte und kann es einfacher machen, Fehler frühzeitig zu erkennen. TypeScript verwendet eine Konfigurationsdatei namens tsconfig.json, um Compiler-Optionen und andere Einstellungen zu speichern. Um diese Datei in Ihrem Projekt zu erstellen, führen Sie den folgenden Befehl aus:

npx tsc -init

Stellen Sie sicher, dass der Wert für "outDir" auf "dist" gesetzt ist. Auf diese Weise trennen wir die TypeScript-Dateien von den kompilierten Dateien.

Erstellen Sie nun ein Verzeichnis "src" in Ihrem Projekt und eine neue Datei "index.ts". Hier werden wir den Scraping-Code ablegen. Um TypeScript-Code auszuführen, müssen Sie ihn zuerst kompilieren. Um sicherzustellen, dass wir diesen zusätzlichen Schritt nicht vergessen, können wir einen benutzerdefinierten Befehl verwenden.

Gehen Sie zur Datei "package. json" und bearbeiten Sie den Abschnitt "scripts" wie folgt:

"scripts": {

"test": "npx tsc && node dist/index.js"

}

Wenn Sie das Skript ausführen wollen, müssen Sie nur "npm run test" in Ihr Terminal eingeben.

Und zu guter Letzt führen Sie den folgenden Befehl aus, um Puppeteer zu Ihren Projektabhängigkeiten hinzuzufügen:

npm Puppeteer installieren

Puppeteer ist eine Node.js-Bibliothek, die eine High-Level-API zur Steuerung eines Headless Chrome-Browsers bereitstellt, der für Web-Scraping und Automatisierungsaufgaben verwendet werden kann. Sie ist sehr empfehlenswert, wenn Sie die Vollständigkeit Ihrer Daten sicherstellen möchten, da viele Websites heutzutage dynamisch generierte Inhalte enthalten.

Auswahl der Daten

Nachdem Sie nun Ihre Umgebung eingerichtet haben, können wir mit dem Extrahieren der Daten beginnen. Für diesen Artikel habe ich mich entschieden, die Liste der in Plano, TX, zu vermietenden Studiowohnungen zu durchsuchen: https://www.realtor.com/apartments/Plano_TX/beds-studio.

Wir werden die folgenden Daten aus jedem Eintrag auf der Seite extrahieren:

  • die URL;
  • die Preise;
  • die Anzahl der Bäder;
  • die Flächen (gemessen in Quadratfuß);
  • die physischen Adressen

Alle diese Informationen sind in der nachstehenden Abbildung hervorgehoben:

blog-image

Datenextraktion

Um all diese Daten zu extrahieren, müssen wir sie zunächst ausfindig machen. Klicken Sie mit der rechten Maustaste auf die markierten Abschnitte und wählen Sie "Prüfen", um die Entwicklungswerkzeuge zu öffnen und das HTML-Dokument zu sehen. Wenn Sie den Mauszeiger über das Dokument bewegen, können Sie leicht erkennen, welcher Teil zu welchem Abschnitt gehört:

blog-image

In diesem Tutorial werde ich CSS-Selektoren verwenden, da sie die einfachste Option sind. Wenn Sie mit dieser Methode noch nicht vertraut sind, sollten Sie sich zunächst diesen selbsterklärenden Leitfaden ansehen.

Um mit dem Schreiben unseres Skripts zu beginnen, müssen wir überprüfen, ob die Installation von Puppeteer ordnungsgemäß verlaufen ist:

import puppeteer from 'puppeteer';

async function scrapeRealtorData(realtor_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(realtor_url)

// Close the browser

await browser.close()

}

scrapeRealtorData("https://www.realtor.com/apartments/Plano_TX/beds-studio")

Hier öffnen wir ein Browserfenster, erstellen eine neue Seite, navigieren zu unserer Ziel-URL und schließen dann den Browser. Der Einfachheit halber und der visuellen Fehlersuche halber öffne ich den Browser in maximaler Größe im Nicht-Headless-Modus.

Da jede Auflistung dieselbe Struktur und dieselben Daten hat, extrahieren wir in unserem Algorithmus alle Informationen für die gesamte Eigenschaftsliste. Am Ende des Skripts durchlaufen wir alle Ergebnisse und fassen sie in einer einzigen Liste zusammen.

Vielleicht ist Ihnen aufgefallen, dass die URL des Inserats auf dem ersten Screenshot nicht zu sehen war, aber auf dem zweiten ist sie erwähnt und hervorgehoben. Das liegt daran, dass Sie zu der URL der Immobilie weitergeleitet werden, wenn Sie auf sie klicken.

// Extract listings location

const listings_location = await page.evaluate(() => {

const locations = document.querySelectorAll('a[data-testid="card-link"]')

const locations_array = Array.from(locations)

return locations ? locations_array.map(a => a.getAttribute('href')) : []

})

console.log(listings_location)

Wir ermitteln die URL, indem wir die Ankerelemente auswählen, die das Attribut "data-testid" mit dem Wert "card-link" haben. Dann wandeln wir das Ergebnis in ein JavaScript-Array um und ordnen jedes Element dem Wert des "href"-Attributs zu.

Die resultierende Liste wird jedoch jede URL zweimal enthalten. Das liegt daran, dass jede Auflistung das gleiche Ankerelement für 2 Abschnitte hat: die Bilder der Immobilie und die Vermietungsdetails. Wir können dies leicht beheben, indem wir die Datenstruktur Set verwenden:

const unique_listings_location = [...new Set(listings_location)]

console.log(unique_listings_location)

Für den Immobilienpreis werden wir die "div"-Elemente extrahieren, die das Attribut "data-testid" mit dem Wert "card-price" haben. Auch sie müssen in ein Array konvertiert und dann auf ihren Textinhalt abgebildet werden.

// Extract listings price

const listings_price = await page.evaluate(() => {

const prices = document.querySelectorAll('div[data-testid="card-price"]')

const prices_array = Array.from(prices)

return prices ? prices_array.map(p => p.textContent) : []

})

console.log(listings_price)

Um die Anzahl der Bäder und die Eigenschaftsfläche zu ermitteln, verwenden wir den Operator für direkte Kindelemente. Das bedeutet, dass das übergeordnete Element eindeutig identifiziert ist, während das untergeordnete Element eine allgemeinere ID oder einen Klassennamen hat. Abgesehen davon ist die Logik dieselbe wie zuvor:

// Extract listings baths

const listings_baths = await page.evaluate(() => {

const baths = document.querySelectorAll('li[data-testid="property-meta-baths"] > span[data-testid="meta-value"]')

const baths_array = Array.from(baths)

return baths ? baths_array.map(b => b.textContent) : []

})

console.log(listings_baths)

// Extract listings sqft

const listings_sqft = await page.evaluate(() => {

const sqfts = document.querySelectorAll('li[data-testid="property-meta-sqft"] > span[data-testid="screen-reader-value"]')

const sqfts_array = Array.from(sqfts)

return sqfts ? sqfts_array.map(s => s.textContent) : []

})

console.log(listings_sqft)

Und schließlich wählen wir für die Adressen der Angebote die "div"-Elemente aus, deren "data-testid"-Attribut auf den Wert "card-address" gesetzt ist.

// Extract listings address

const listings_address = await page.evaluate(() => {

const addresses = document.querySelectorAll('div[data-testid="card-address"]')

const addresses_array = Array.from(addresses)

return addresses ? addresses_array.map(a => a.textContent) : []

})

console.log(listings_address)

Jetzt sollten Sie 5 Listen haben, eine für jeden Teil der Daten, die wir gesammelt haben. Wie ich bereits erwähnt habe, sollten wir sie in einer einzigen Liste zusammenfassen. Auf diese Weise lassen sich die gesammelten Informationen viel leichter weiterverarbeiten.

// Group the lists

const listings = []

for (let i = 0; i < unique_listings_location.length; i++) {

listings.push({

url: unique_listings_location[i],

price: listings_price[i],

baths: listings_baths[i],

sqft: listings_sqft[i],

address: listings_address[i]

})

}

console.log(listings)

Das Endergebnis sollte in etwa so aussehen:

[

{

url: '/realestateandhomes-detail/1009-14th-St-Apt-410_Plano_TX_75074_M92713-98757',

price: '$1,349',

baths: '1',

sqft: '602 square feet',

address: '1009 14th St Apt 410Plano, TX 75074'

},

{

url: '/realestateandhomes-detail/1009-14th-St-Apt-1_Plano_TX_75074_M95483-11211',

price: '$1,616',

baths: '1',

sqft: '604 square feet',

address: '1009 14th St Apt 1Plano, TX 75074'

},

{

url: '/realestateandhomes-detail/1009-14th-St_Plano_TX_75074_M87662-45547',

price: '$1,605 - $2,565',

baths: '1 - 2',

sqft: '602 - 1,297 square feet',

address: '1009 14th StPlano, TX 75074'

},

{

url: '/realestateandhomes-detail/5765-Bozeman-Dr_Plano_TX_75024_M70427-45476',

price: '$1,262 - $2,345',

baths: '1 - 2',

sqft: '352 - 1,588 square feet',

address: '5765 Bozeman DrPlano, TX 75024'

},

{

url: '/realestateandhomes-detail/1410-K-Ave-Ste-1105A_Plano_TX_75074_M97140-46163',

price: '$1,250 - $1,995',

baths: '1 - 2',

sqft: '497 - 1,324 square feet',

address: '1410 K Ave Ste 1105APlano, TX 75074'

}

]

Vermeiden Sie Bot-Erkennung

Auch wenn das Scrapen von Realtor zunächst einfach erscheint, kann der Prozess komplexer und schwieriger werden, wenn Sie Ihr Projekt erweitern. Die Immobilien-Website setzt verschiedene Techniken ein, um automatisierten Datenverkehr zu erkennen und zu verhindern, so dass Ihr Scraper blockiert wird.

Realtor verwendet das "Press & Hold"-Modell von CAPTCHA, das von PerimeterX angeboten wird und von dem bekannt ist, dass es fast unmöglich ist, es mit Ihrem Code zu lösen. Darüber hinaus sammelt die Website auch mehrere Browserdaten, um einen eindeutigen Fingerabdruck zu erstellen und Ihnen zuzuordnen.

Unter den gesammelten Browserdaten finden wir:

  • Eigenschaften des Navigator-Objekts (deviceMemory, hardwareConcurrency, languages, platform, userAgent, webdriver, usw.)
  • Zeit- und Leistungskontrollen
  • WebGL
  • WebRTC IP-Schnüffeln
  • und viele mehr

Eine Möglichkeit, diese Herausforderungen zu überwinden und das Scrapen in großem Maßstab fortzusetzen, ist die Verwendung einer Scraping-API. Diese Art von Diensten bietet eine einfache und zuverlässige Möglichkeit, auf Daten von Websites wie Realtor.com zuzugreifen, ohne dass Sie einen eigenen Scraper entwickeln und pflegen müssen.

WebScrapingAPI ist ein Beispiel für ein solches Produkt. Sein Proxy-Rotationsmechanismus vermeidet CAPTCHAs gänzlich, und seine erweiterte Wissensbasis macht es möglich, die Browserdaten nach dem Zufallsprinzip so zu gestalten, dass sie wie ein echter Benutzer aussehen.

Die Einrichtung ist schnell und einfach. Alles, was Sie tun müssen, ist, ein Konto zu registrieren, damit Sie Ihren API-Schlüssel erhalten. Auf diesen können Sie über Ihr Dashboard zugreifen, und er wird zur Authentifizierung der von Ihnen gesendeten Anfragen verwendet.

blog-image

Da Sie Ihre Node.js-Umgebung bereits eingerichtet haben, können wir das entsprechende SDK verwenden. Führen Sie den folgenden Befehl aus, um es zu Ihren Projektabhängigkeiten hinzuzufügen:

npm install webscrapingapi

Jetzt müssen nur noch die bisherigen CSS-Selektoren an die API angepasst werden. Die leistungsstarke Funktion der Extraktionsregeln ermöglicht es, Daten ohne wesentliche Änderungen zu analysieren.

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

locations: {

selector: 'a[data-testid="card-link"]',

output: '@href',

all: '1'

},

prices: {

selector: 'div[data-testid="card-price"]',

output: 'text',

all: '1'

},

baths: {

selector: 'li[data-testid="property-meta-baths"] > span[data-testid="meta-value"]',

output: 'text',

all: '1'

},

sqfts: {

selector: 'li[data-testid="property-meta-sqft"] > span[data-testid="screen-reader-value"]',

output: 'text',

all: '1'

},

addresses: {

selector: 'div[data-testid="card-address"]',

output: 'text',

all: '1'

}

})

}

const URL = "https://www.realtor.com/apartments/Plano_TX/beds-studio"

const response = await client.get(URL, api_params)

if (response.success) {

const unique_listings_location = [...new Set(response.response.data.locations)]

// Group the lists

const listings = []

for (let i = 0; i < unique_listings_location.length; i++) {

listings.push({

url: unique_listings_location[i],

price: response.response.data.prices[i],

baths: response.response.data.baths[i],

sqft: response.response.data.sqfts[i],

address: response.response.data.addresses[i]

})

}

console.log(listings)

} else {

console.log(response.error.response.data)

}

}

exampleUsage();

Schlussfolgerung

In diesem Tutorial haben wir eine Schritt-für-Schritt-Anleitung für das Scrapen von realtor.com mit Node.js und Puppeteer erstellt. Wir haben auch erörtert, wie man die Zuverlässigkeit und Effizienz des Scrapers verbessern kann und warum die Nutzung eines professionellen Scraper-Dienstes für einige Anwendungsfälle eine bessere Option sein kann.

Realtor.com ist eine beliebte und wertvolle Quelle für Immobiliendaten, und mit den Fähigkeiten und Kenntnissen, die Sie in diesem Tutorial erworben haben, sollten Sie nun in der Lage sein, Web Scraping zu verwenden, um diese Daten zu extrahieren und in Ihren eigenen Projekten zu verwenden.

Ganz gleich, ob Sie ein Immobilienprofi sind, der einen Wettbewerbsvorteil sucht, ein Investor, der nach neuen Möglichkeiten sucht, oder ein Hauskäufer, der auf der Suche nach der perfekten Immobilie ist - Web Scraping kann Ihnen wertvolle Einblicke und Daten von realtor.com liefern. Wir hoffen, dass dieses Tutorial hilfreich war und dass Sie nun bereit sind, Ihr Immobilienspiel mit Hilfe von Web Scraping von realtor.com zu verbessern.

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

Vorschaubild
LeitfädenWie man Amazon-Produktdaten scrappt: Ein umfassender Leitfaden zu Best Practices & Tools

Entdecken Sie die Komplexität des Scrapens von Amazon-Produktdaten mit unserem ausführlichen Leitfaden. Von Best Practices und Tools wie der Amazon Scraper API bis hin zu rechtlichen Aspekten erfahren Sie, wie Sie Herausforderungen meistern, CAPTCHAs umgehen und effizient wertvolle Erkenntnisse gewinnen.

Suciu Dan
Autorenavatar
Suciu Dan
15 Minuten lesen
Vorschaubild
LeitfädenScrapy vs. Beautiful Soup: Ein umfassender Vergleichsleitfaden für Web-Scraping-Tools

Erforschen Sie einen detaillierten Vergleich zwischen Scrapy und Beautiful Soup, zwei führenden Web-Scraping-Tools. Verstehen Sie ihre Funktionen, Vor- und Nachteile und entdecken Sie, wie sie zusammen verwendet werden können, um verschiedene Projektanforderungen zu erfüllen.

WebscrapingAPI
Autorenavatar
WebscrapingAPI
10 Minuten lesen
Vorschaubild
Wissenschaft des Web ScrapingWeb Scraping leicht gemacht: Die Bedeutung von Data Parsing

Erfahren Sie, wie Sie mit Hilfe von Datenparsing, HTML-Parsing-Bibliotheken und schema.org-Metadaten effizient Daten für Web-Scraping und Datenanalysen extrahieren und organisieren können.

Suciu Dan
Autorenavatar
Suciu Dan
12 Minuten lesen