Der Zugang zu Airbnb-Daten ist für die Analyse des Immobilienmarktes, die Erforschung der Mietpreisdynamik, die Durchführung von Wettbewerbsanalysen und die Bewertung von Rezensionen und Bewertungen entscheidend. Dies kann durch Scraping von Webdaten erreicht werden. Der Zugriff auf diese Daten kann jedoch schwierig sein, da das Scraping gegen die Nutzungsbedingungen der Website verstoßen kann.
Als Nächstes werden wir eine Schritt-für-Schritt-Anleitung für die Entwicklung eines Web Scrapers zur Extraktion von Daten aus Airbnb-Angeboten mit Python und Selenium erstellen. In dieser Anleitung wird auch erläutert, wie man potenzielle Blockaden und Einschränkungen der Plattform umgehen kann.
Der erste Schritt bei der Erstellung eines Web Scrapers besteht darin, zu verstehen, wie man auf die Webseiten zugreift, an denen man interessiert ist, da sich die Struktur von Websites oft ändert. Um sich mit der Struktur einer Website vertraut zu machen, können Sie die Entwicklerwerkzeuge des Browsers verwenden, um den HTML-Code der Webseite zu untersuchen.
Um auf die Entwicklertools zuzugreifen, klicken Sie mit der rechten Maustaste auf die Webseite und wählen Sie "Prüfen" oder verwenden Sie die Tastenkombination:
Jeder Auflistungscontainer ist in ein div-Element mit dem folgenden Attribut eingeschlossen: class="g1qv1ctd".
Wenn man auf "location" klickt und "London, UK" eingibt, erhält man Zugang zu den in London angebotenen Orten. Die Website schlägt vor, Check-in- und Check-out-Daten einzugeben. So können sie den Preis für die Zimmer berechnen.
Die URL für diese Seite würde etwa so aussehen:
url = "https://www.airbnb.com/s/London--United-Kingdom/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_lengths%5B%5D=one_week&monthly_start_date=2024-01-01&monthly_length=3&price_filter_input_type=0&channel=EXPLORE&query=London%2C%20United%20Kingdom&place_id=ChIJdd4hrwug2EcRmSrV3Vo6llI&date_picker_type=calendar&source=structured_search_input_header&search_type=autocomplete_click"
Von der Suchseite werden wir die folgenden Attribute der Produktlistendaten abrufen:
Um mit dem Web-Scraping nach Airbnb-Daten zu beginnen, müssen Sie zunächst Ihre Entwicklungsumgebung einrichten. Hier sind die Schritte dazu:
Virtuelle Umgebungen ermöglichen es Ihnen, Python-Pakete und ihre Abhängigkeiten für verschiedene Projekte zu isolieren. Dies hilft, Konflikte zu vermeiden und stellt sicher, dass jedes Projekt die richtigen Abhängigkeiten installiert hat.
Öffnen Sie eine Eingabeaufforderung mit Administratorrechten und führen Sie den folgenden Befehl aus, um eine neue virtuelle Umgebung namens "venv" zu erstellen:
python -m venv venv
Aktivieren Sie die virtuelle Umgebung:
venv\Scripts\activate
Öffnen Sie ein Terminal und führen Sie den folgenden Befehl aus, um eine neue virtuelle Umgebung namens "venv" zu erstellen:
sudo python3 -m venv venv
Aktivieren Sie die virtuelle Umgebung:
source venv/bin/activate
Um die virtuelle Umgebung zu deaktivieren, führen Sie einfach den folgenden Befehl aus:
deactivate
Nachdem Sie nun eine virtuelle Umgebung eingerichtet haben, können Sie die erforderlichen Bibliotheken installieren.
Führen Sie in Ihrer aktivierten virtuellen Umgebung den folgenden Befehl aus, um die erforderlichen Bibliotheken zu installieren:
pip install selenium beautifulsoup4 lxml seleniumwire
Selenium benötigt einen Treiber für die Schnittstelle mit dem gewählten Browser. Für diese Anleitung verwenden wir Chrome. Bitte stellen Sie jedoch sicher, dass Sie den entsprechenden WebDriver für den Browser Ihrer Wahl installiert haben.
Stellen Sie nach dem Download sicher, dass sich der Treiber in einem Verzeichnis befindet, auf das die Umgebungsvariable PATH Ihres Systems zugreift. Dies ermöglicht es Selenium, den Treiber zu finden und den Browser zu steuern.
Am Anfang Ihrer Python-Datei importieren Sie die Bibliotheken Seleniumwire und BeautifulSoup. So machen Sie es:
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import csv
import random
Wir werden auch die Bibliotheken `random`, `time` und `csv` für verschiedene Dienstprogramme importieren.
Als Nächstes definieren wir eine Liste von Proxys, um zu vermeiden, dass Airbnb sie blockiert. Wenn Sie versuchen, eine Anfrage ohne einen Premium-Proxy zu senden, kann es sein, dass Sie die Antwort "Zugriff verweigert" erhalten.
Sie können einen Proxy wie folgt einrichten:
# List of proxies
proxies = [
"username:password@Your_proxy_IP_Address:Your_proxy_port1",
"username:password@Your_proxy_IP_Address:Your_proxy_port2",
"username:password@Your_proxy_IP_Address:Your_proxy_port3",
"username:password@Your_proxy_IP_Address:Your_proxy_port4",
"username:password@Your_proxy_IP_Address:Your_proxy_port5",
]
Ersetzen Sie "Your_proxy_IP_Address" und "Your_proxy_port" durch die tatsächliche Proxy-Adresse, die Sie von Proxy-seller erhalten haben, und ersetzen Sie auch die Werte von "username" und "password" durch Ihre tatsächlichen Anmeldedaten.
Die Rotation von Proxys ist ein wichtiger Aspekt des Web Scraping. Websites blockieren oder beschränken oft den Zugang für Bots und Scraper, wenn sie mehrere Anfragen von derselben IP-Adresse erhalten. Indem Sie verschiedene Proxy-IP-Adressen verwenden, können Sie die Entdeckung vermeiden, als mehrere organische Nutzer auftreten und die meisten Anti-Scraping-Maßnahmen der Website umgehen.
Um die Proxy-Rotation einzurichten, importieren Sie die "random"-Bibliothek. Wir definieren auch eine Funktion `get_proxy()`, um einen Proxy aus unserer Liste auszuwählen. Diese Funktion wählt nach dem Zufallsprinzip einen Proxy aus der Liste der Proxys mit der Methode random.choice() aus und gibt den ausgewählten Proxy zurück.
def get_proxy():
return random.choice(proxies)
Als Nächstes definieren wir die Hauptfunktion "listing()". Hier werden wir unseren "ChromeDriver" einrichten. Diese Funktion verwendet Selenium, um auf der Seite mit den Immobilienangeboten zu navigieren, wartet, bis die Seite geladen ist, und parst den HTML-Code mit Beautiful Soup.
def listings(url):
proxy = get_proxy()
proxy_options = {
"proxy": {
"http": f"http://{proxy}",
"https": f"http://{proxy}",
"no_proxy": "localhost,127.0.0.1",
}
}
chrome_options = Options()
chrome_options.add_argument("--headless")
s = Service(
"C:/Path_To_Your_WebDriver"
) # Ersetzen Sie durch den Pfad zum ChromeDriver.
driver = webdriver.Chrome(
service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
)
driver.get(url)
time.sleep(8) # Adjust based on website's load time
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit()
Hier beginnen wir mit der Auswahl eines zufälligen Proxys und dem Einrichten der Proxy-Optionen. Diese Optionen werden verwendet, um den Webdriver für die Verwendung des Proxy-Servers zu konfigurieren. Als nächstes richten wir die Chrome-Optionen ein. Fügen Sie das Argument --headless hinzu, um den Browser im Headless-Modus auszuführen, was bedeutet, dass der Browser im Hintergrund ohne grafische Benutzeroberfläche läuft.
Dann initialisieren Sie den Webdriver mit dem Dienst, den Seleniumwire-Optionen und den Chrome-Optionen. Der Webdriver wird dann verwendet, um zur angegebenen URL zu navigieren. Wir fügen eine Ruhezeit von 8 Sekunden hinzu, damit die Seite vollständig geladen werden kann, und parsen dann das zurückgegebene HTML mit Beautiful Soup. Nachdem das Parsen abgeschlossen ist, wird der Webdriver geschlossen.
Sobald Sie den HTML-Inhalt erfolgreich erhalten haben, besteht der nächste Schritt darin, die relevanten Daten für jedes Angebot zu extrahieren. Mit BeautifulSoup können wir leicht durch die HTML-Struktur navigieren und die Elemente finden, die die Inseratsinformationen enthalten.
Zunächst identifizieren wir alle Elemente des Angebots auf der Seite. Diese Elemente enthalten die Daten, an denen wir interessiert sind, z. B. die URL des Angebots, den Titel, die Beschreibung, die Bewertung, den Preis und zusätzliche Informationen.
listing_elements = soup.find_all("div", class_="g1qv1ctd")
for listing_element in listing_elements:
Dieser Code verwendet die find_all()-Methode von BeautifulSoup, um alle div-Elemente mit der Klasse "g1qv1ctd" zu finden. Diese Elemente stellen einzelne Angebote auf der Airbnb-Seite dar. Anschließend wird jedes dieser Elemente in einer Schleife durchlaufen, um die relevanten Daten zu extrahieren.
Für jedes gefundene Eintragselement wird die URL des Eintrags extrahiert.
URL_element = soup.find("a", class_="rfexzly")
listing_data["Listing URL"] = (
"https://www.airbnb.com" + URL_element["href"] if URL_element else ""
)
Hier suchen wir in unserem "soup"-Objekt nach einem Anker-Tag mit der Klasse "rfexzly". Wird dieses Element gefunden, wird das "href"-Attribut (das die relative URL enthält) extrahiert und an die Basis-URL angehängt, um die vollständige Auflistungs-URL zu erstellen. Wird das Element nicht gefunden, wird eine leere Zeichenfolge zugewiesen, um Fehler zu vermeiden.
Zunächst extrahieren wir die URL für jedes Angebot. So können wir später bei Bedarf die einzelnen Angebotsseiten besuchen.
title_element = listing_element.find("div", class_="t1jojoys")
listing_data["Title"] = (
title_element.get_text(strip=True) if title_element else ""
)
Der Titel ist in einem "div"-Element mit der Klasse "t1jojoys" enthalten. Wir rufen den Textinhalt dieses Elements ab und entfernen dabei alle führenden und abschließenden Leerzeichen. Wenn das Element nicht gefunden wird, wird eine leere Zeichenfolge gespeichert.
Description_element = listing_element.find("span", class_="t6mzqp7")
listing_data["Description"] = (
Description_element.get_text(strip=True) if Description_element else ""
)
Ähnlich wie bei der Extraktion des Titels findet dieser Code ein span-Element mit der Klasse "t6mzqp7". Dann extrahieren und bereinigen wir den Textinhalt dieses Elements, der eine kurze Beschreibung des Eintrags enthält.
rating_element = listing_element.find("span", class_="ru0q88m")
listing_data["Rating"] = (
rating_element.get_text(strip=True) if rating_element else ""
)
Wie im obigen Code zu sehen ist, enthält ein span-Element mit der Klasse "ru0q88m" den Bewertungswert. Wir extrahieren diesen Wert, wobei wir sicherstellen, dass alle unnötigen Leerzeichen entfernt werden.
Schließlich extrahieren wir den Preis des Angebots.
price_element = listing_element.select_one("._1y74zjx")
listing_data["Price"] = (
f"{price_element.get_text(strip=True)} per night" if price_element else ""
)
Dieser Code sucht nach dem Element mit der Klasse "_1y74zjx" innerhalb des aktuellen listing_element. Wenn dieses Element, das normalerweise die Preisinformationen enthält, gefunden wird, wird sein Textinhalt extrahiert, bereinigt und mit "pro Nacht" ergänzt, um eine informativere Preiszeichenkette zu bilden.
Einige Inserate enthalten möglicherweise zusätzliche Informationen, die wir extrahieren können.
listing_info_element = listing_element.find("span", {"aria-hidden": "true"})
listing_data["Additional Listing information"] = (
listing_info_element.get_text(strip=True) if listing_info_element else ""
)
Wir suchen nach einem span-Element mit dem Attribut aria-hidden="true", um zusätzliche Informationen über das Angebot zu finden. Nach dem Extrahieren aller relevanten Daten aus den einzelnen Auflistungselementen fügen wir die gesammelten Daten an eine Liste von Auflistungen an.
listings.append(listing_data)
Sobald alle Einträge verarbeitet wurden, geben wir die Liste der Einträge zurück, die jeweils als Wörterbuch mit den extrahierten Daten dargestellt werden.
return listings
Nachdem wir erfolgreich Daten von den Airbnb-Listing-Seiten abgerufen haben, besteht der nächste wichtige Schritt darin, diese wertvollen Informationen für zukünftige Analysen und Referenzen zu speichern. Für diese Aufgabe verwenden wir die csv-Bibliothek. Wir öffnen eine CSV-Datei im Schreibmodus und erstellen ein csv.DictWriter-Objekt. Dann schreiben wir den Header und die Daten in die Datei.
airbnb_listings = listings(url)
csv_file_path = "proxy_web_listings_output.csv"
with open(csv_file_path, "w", encoding="utf-8", newline="") as csv_file:
fieldnames = [
"Listing URL",
"Title",
"Description",
"Rating",
"Price",
"Additional Listing information",
]
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for listing in airbnb_listings:
writer.writerow(listing)
print(f"Data has been exported to {csv_file_path}")
Hier ist ein vollständiger Code, den wir für dieses Tutorial verwendet haben:
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
import csv
import random
# Liste der Bevollmächtigten
proxies = [
"username:password@Your_proxy_IP_Address:Your_proxy_port1",
"username:password@Your_proxy_IP_Address:Your_proxy_port2",
"username:password@Your_proxy_IP_Address:Your_proxy_port3",
"username:password@Your_proxy_IP_Address:Your_proxy_port4",
"username:password@Your_proxy_IP_Address:Your_proxy_port5",
]
def get_proxy():
return random.choice(proxies)
def listings(url):
proxy = get_proxy()
proxy_options = {
"proxy": {
"http": f"http://{proxy}",
"https": f"http://{proxy}",
"no_proxy": "localhost,127.0.0.1",
}
}
chrome_options = Options()
chrome_options.add_argument("--headless")
s = Service(
"C:/Path_To_Your_WebDriver"
) # Ersetzen Sie durch den Pfad zum ChromeDriver.
driver = webdriver.Chrome(
service=s, seleniumwire_options=proxy_options, chrome_options=chrome_options
)
driver.get(url)
time.sleep(8) # Adjust based on website's load time
soup = BeautifulSoup(driver.page_source, "lxml")
driver.quit()
listings = []
# Suche nach allen Auflistungselementen auf der Seite
listing_elements = soup.find_all("div", class_="g1qv1ctd")
for listing_element in listing_elements:
# Daten aus jedem Listenelement extrahieren
listing_data = {}
# Auflistung der URL
URL_element = soup.find("a", class_="rfexzly")
listing_data["Listing URL"] = (
"https://www.airbnb.com" + URL_element["href"] if URL_element else ""
)
# Titel
title_element = listing_element.find("div", class_="t1jojoys")
listing_data["Title"] = (
title_element.get_text(strip=True) if title_element else ""
)
# Beschreibung
Description_element = listing_element.find("span", class_="t6mzqp7")
listing_data["Description"] = (
Description_element.get_text(strip=True) if Description_element else ""
)
# Bewertung
rating_element = listing_element.find("span", class_="ru0q88m")
listing_data["Rating"] = (
rating_element.get_text(strip=True) if rating_element else ""
)
# Preis
price_element = listing_element.select_one("._1y74zjx")
listing_data["Price"] = (
f"{price_element.get_text(strip=True)} per night" if price_element else ""
)
# Zusätzliche Informationen zum Angebot
listing_info_element = listing_element.find("span", {"aria-hidden": "true"})
listing_data["Additional Listing information"] = (
listing_info_element.get_text(strip=True) if listing_info_element else ""
)
# Anhängen der Listendaten an die Liste
listings.append(listing_data)
return listings
url = "https://www.airbnb.com/s/London--United-Kingdom/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_lengths%5B%5D=one_week&monthly_start_date=2024-01-01&monthly_length=3&price_filter_input_type=0&channel=EXPLORE&query=London%2C%20United%20Kingdom&place_id=ChIJdd4hrwug2EcRmSrV3Vo6llI&date_picker_type=calendar&source=structured_search_input_header&search_type=autocomplete_click"
airbnb_listings = listings(url)
csv_file_path = "proxy_web_listings_output.csv"
with open(csv_file_path, "w", encoding="utf-8", newline="") as csv_file:
fieldnames = [
"Listing URL",
"Title",
"Description",
"Rating",
"Price",
"Additional Listing information",
]
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for listing in airbnb_listings:
writer.writerow(listing)
print(f"Data has been exported to {csv_file_path}")
Dieser Teil des Codes sorgt dafür, dass die gesammelten Daten in einer CSV-Datei mit dem Namen "proxy_web_listings_output.csv" gespeichert werden.
Die Ergebnisse unseres Scrapers werden in einer CSV-Datei mit dem Namen "proxy_web_listings_output.csv" gespeichert (siehe unten).
Dieser Leitfaden erklärt, wie man mit Python Daten aus Airbnb-Angeboten ausliest und so wichtige Details wie Preise, Verfügbarkeit und Bewertungen extrahieren kann. Es wird betont, wie wichtig es ist, Proxys zu verwenden und sie zu rotieren, um zu verhindern, dass sie durch die Anti-Bot-Maßnahmen von Airbnb blockiert werden.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.ru!
Bemerkungen: 0