Dieses Tutorial behandelt:
- Warum Yelp scrapen?
- Yelp-Scraping-Bibliotheken und Tools
- Yelp-Geschäftsdaten mit Beautiful Soup scrapen
Warum Yelp scrapen?
Es gibt mehrere Gründe, warum Unternehmen Yelp scrapen. Dazu gehören:
- Zugang zu umfassenden Geschäftsdaten erhalten: Die Plattform bietet eine Fülle von Informationen über lokale Unternehmen, einschließlich Bewertungen, Kontaktdaten und mehr.
- Einblicke in Kundenfeedback gewinnen: Die Plattform ist bekannt für ihre Nutzerbewertungen und bietet eine Fundgrube an Einblicken in Kundenmeinungen und -erfahrungen.
- Wettbewerbsanalyse und Benchmarking durchführen: Sie bietet wertvolle Einblicke in die Leistung, Stärken, Schwächen und Kundenstimmung Ihrer Mitbewerber.
Es gibt ähnliche Plattformen, aber Yelp ist die bevorzugte Wahl für das Daten-Scraping aufgrund von:
- Umfangreicher Nutzerbasis
- Vielfältigen Geschäftskategorien
- Gut etabliertem Ruf
Die von Yelp gescrapten Daten können für Marktforschung, Wettbewerbsanalyse, Sentiment-Analyse und Entscheidungsfindung wertvoll sein. Solche Informationen helfen Ihnen auch dabei, Verbesserungsbereiche zu identifizieren, Ihr Angebot zu verfeinern und der Konkurrenz einen Schritt voraus zu bleiben.
Yelp-Scraping-Bibliotheken und Tools
Python gilt weithin als ausgezeichnete Sprache für Web-Scraping aufgrund seiner benutzerfreundlichen Natur, einfachen Syntax und umfangreichen Bibliotheken. Deshalb ist es die empfohlene Programmiersprache für das Scrapen von Yelp. Um mehr darüber zu erfahren, lesen Sie unseren ausführlichen Leitfaden zum Web-Scraping mit Python.
Der nächste Schritt besteht darin, die geeigneten Scraping-Bibliotheken aus der Vielzahl verfügbarer Optionen auszuwählen. Um eine fundierte Entscheidung zu treffen, sollten Sie zunächst die Plattform in einem Webbrowser erkunden. Durch die Untersuchung der von Webseiten durchgeführten AJAX-Aufrufe werden Sie feststellen, dass die meisten Daten in den vom Server abgerufenen HTML-Dokumenten eingebettet sind.
Dies bedeutet, dass ein einfacher HTTP-Client für Anfragen an den Server kombiniert mit einem HTML-Parser für die Aufgabe ausreicht. Hier ist, warum Sie sich für folgende entscheiden sollten:
- Requests: Die beliebteste HTTP-Client-Bibliothek für Python. Sie vereinfacht den Prozess des Sendens von HTTP-Anfragen und der Verarbeitung der entsprechenden Antworten.
- Beautiful Soup: Eine umfassende HTML- und XML-Parsing-Bibliothek, die umfangreich für Web-Scraping eingesetzt wird. Sie bietet robuste Methoden zum Navigieren und Extrahieren von Daten aus dem DOM.
Dank Requests und Beautiful Soup können Sie Yelp effektiv mit Python scrapen. Lassen Sie uns in die Details eintauchen, wie Sie diese Aufgabe bewältigen können!
Yelp-Geschäftsdaten mit Beautiful Soup scrapen
Folgen Sie diesem Schritt-für-Schritt-Tutorial und lernen Sie, wie Sie einen Yelp-Scraper erstellen.
Schritt 1: Python-Projekt einrichten
Bevor Sie beginnen, müssen Sie zunächst sicherstellen, dass Sie folgendes haben:
- Python 3+ auf Ihrem Computer installiert: Laden Sie das Installationsprogramm herunter, führen Sie es aus und folgen Sie den Anweisungen.
- Eine Python-IDE Ihrer Wahl: Visual Studio Code mit der Python-Erweiterung oder PyCharm Community Edition sind beide geeignet.
Erstellen Sie zunächst einen yelp-scraper-Ordner und initialisieren Sie ihn als Python-Projekt mit einer virtuellen Umgebung mit:
mkdir yelp-scraper
cd yelp-scraper
python -m venv env
Führen Sie unter Windows den folgenden Befehl aus, um die Umgebung zu aktivieren:
envScriptsactivate.ps1
Unter Linux oder macOS:
env/bin/activate
Fügen Sie als nächstes eine scraper.py-Datei mit der folgenden Zeile im Projektordner hinzu:
print('Hello, World!')
Dies ist das einfachste Python-Skript. Im Moment gibt es nur “Hello, World!” aus, wird aber bald die Logik zum Scrapen von Yelp enthalten.
Sie können den Scraper starten mit:
python scraper.py
Es sollte im Terminal ausgeben:
Hello, World!
Genau wie erwartet. Jetzt, da Sie wissen, dass alles funktioniert, öffnen Sie den Projektordner in Ihrer Python-IDE.
Gut, machen Sie sich bereit, Python-Code zu schreiben!
Schritt 2: Die Scraping-Bibliotheken installieren
Sie müssen nun die Bibliotheken, die für das Web-Scraping benötigt werden, zu den Abhängigkeiten des Projekts hinzufügen. Führen Sie in der aktivierten virtuellen Umgebung den folgenden Befehl aus, um Beautiful Soup und Requests zu installieren:
pip install beautifulsoup4 requests
Leeren Sie die scraper.py-Datei und fügen Sie dann diese Zeilen hinzu, um die Pakete zu importieren:
import requests
from bs4 import BeautifulSoup
# scraping logic...
Stellen Sie sicher, dass Ihre Python-IDE keine Fehler meldet. Möglicherweise erhalten Sie einige Warnungen wegen ungenutzter Importe, die Sie jedoch ignorieren können. Sie werden diese Scraping-Bibliotheken in Kürze verwenden, um Daten von Yelp zu extrahieren.
Schritt 3: Die Zielseite identifizieren und herunterladen
Durchsuchen Sie Yelp und identifizieren Sie die Seite, die Sie scrapen möchten. In diesem Leitfaden erfahren Sie, wie Sie Daten aus der Liste der bestbewerteten italienischen Restaurants in New York abrufen:

Weisen Sie die URL der Zielseite einer Variablen zu:
url = 'https://www.yelp.com/search?find_desc=Italian&find_loc=New+York%2C+NY'
Verwenden Sie dann requests.get(), um eine HTTP-GET-Anfrage an diese URL zu senden:
page = requests.get(url)
Die Variable page enthält nun die vom Server erzeugte Antwort.
Konkret speichert page.text das HTML-Dokument, das mit der Zielwebseite verknüpft ist. Sie können dies überprüfen, indem Sie es ausgeben:
print(page.text)
Dies sollte ausgeben:
<!DOCTYPE html><html lang="en-US" prefix="og: http://ogp.me/ns#" style="margin: 0;padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline;"><head><script>document.documentElement.className=document.documentElement.className.replace(no-j/,"js");</script><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta http-equiv="Content-Language" content="en-US" /><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"><link rel="mask-icon" sizes="any" href="https://s3-media0.fl.yelpcdn.com/assets/srv0/yelp_large_assets/b2bb2fb0ec9c/assets/img/logos/yelp_burst.svg" content="#FF1A1A"><link rel="shortcut icon" href="https://s3-media0.fl.yelpcdn.com/assets/srv0/yelp_large_assets/dcfe403147fc/assets/img/logos/favicon.ico"><script> window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;window.ygaPageStartTime=new Date().getTime();</script><script>
<!-- Der Kürze halber weggelassen... -->
Perfekt! Erfahren Sie nun, wie Sie es analysieren können, um Daten daraus zu extrahieren.
Schritt 4: Den HTML-Inhalt parsen
Übergeben Sie den vom Server abgerufenen HTML-Inhalt an den BeautifulSoup()-Konstruktor, um ihn zu parsen:
soup = BeautifulSoup(page.text, 'html.parser')
Die Funktion nimmt zwei Argumente entgegen:
- Den String, der das HTML enthält.
- Den Parser, den Beautiful Soup verwenden wird, um den Inhalt zu verarbeiten.
“html.parser” ist der Name des in Python integrierten HTML-Parsers.
BeautifulSoup() gibt den geparsten Inhalt als erkundbare Baumstruktur zurück. Insbesondere stellt die soup-Variable nützliche Methoden zur Auswahl von Elementen aus dem DOM-Baum bereit. Die beliebtesten sind:
- find(): Gibt das erste HTML-Element zurück, das der als Parameter übergebenen Auswahlstrategie entspricht.
- find_all(): Gibt die Liste der HTML-Elemente zurück, die der Eingabe-Auswahlstrategie entsprechen.
- select_one(): Gibt das erste HTML-Element zurück, das dem als Parameter übergebenen CSS-Selektor entspricht.
- select(): Gibt die Liste der HTML-Elemente zurück, die dem Eingabe-CSS-Selektor entsprechen.
Ausgezeichnet! Sie werden diese bald verwenden, um die gewünschten Daten von Yelp zu extrahieren.
Schritt 5: Machen Sie sich mit der Seite vertraut
Um eine effektive Auswahlstrategie zu entwickeln, müssen Sie sich zunächst mit der Struktur der Zielwebseite vertraut machen. Öffnen Sie sie in Ihrem Browser und beginnen Sie, sie zu erkunden.
Klicken Sie mit der rechten Maustaste auf ein HTML-Element auf der Seite und wählen Sie “Untersuchen”, um die DevTools zu öffnen:

Sie werden sofort feststellen, dass die Website auf CSS-Klassen setzt, die beim Build-Prozess zufällig generiert zu werden scheinen. Da sie sich bei jedem Deployment ändern können, sollten Sie Ihre CSS-Selektoren nicht darauf aufbauen. Dies ist eine wesentliche Information für den Aufbau eines effektiven Scrapers.
Wenn Sie tiefer in das DOM eintauchen, werden Sie auch sehen, dass die wichtigsten Elemente charakteristische HTML-Attribute haben. Daher sollte Ihre Auswahlstrategie auf diesen basieren.
Fahren Sie fort, die Seite in den DevTools zu untersuchen, bis Sie bereit sind, sie mit Python zu scrapen!
Schritt 6: Die Geschäftsdaten extrahieren
Das Ziel hier ist es, Geschäftsinformationen aus jeder Karte auf der Seite zu extrahieren. Um diese Daten zu verfolgen, benötigen Sie eine Datenstruktur, in der Sie sie speichern können:
items = []
Untersuchen Sie zunächst ein Karten-HTML-Element:

Beachten Sie, dass Sie alle mit folgendem auswählen können:
html_item_cards = soup.select('[data-testid="serp-ia-card"]')
Iterieren Sie über sie und bereiten Sie Ihr Skript vor, um:
- Daten aus jedem von ihnen zu extrahieren.
- Es in einem Python-Wörterbuch-Element zu speichern.
- Es zu items hinzuzufügen.
for html_item_card in html_item_cards:
item = {}
# scraping logic...
items.append(item)
Zeit, die Scraping-Logik zu implementieren!
Untersuchen Sie das Bild-Element:

Rufen Sie die URL des Bildes des Unternehmens ab mit:
image = html_item_card.select_one('[data-lcp-target-id="SCROLLABLE_PHOTO_BOX"] img').attrs['src']
Nachdem Sie ein Element mit select_one() abgerufen haben, können Sie auf seine HTML-Attribute über das attrs-Member zugreifen.
Weitere nützliche Informationen sind der Titel und die URL zur Detailseite des Unternehmens:

Wie Sie sehen können, können Sie beide Datenfelder aus dem h3 a-Knoten abrufen:
name = html_item_card.select_one('h3 a').text
url = 'https://www.yelp.com' + html_item_card.select_one('h3 a').attrs['href']
Das text-Attribut gibt den Textinhalt des aktuellen Elements und all seiner Kinder zurück. Da einige Links relativ sind, müssen Sie möglicherweise die Basis-URL hinzufügen, um sie zu vervollständigen.
Einer der wichtigsten Datenpunkte auf Yelp ist die Nutzerbewertung:

In diesem Fall gibt es keinen einfachen Weg, sie abzurufen, aber Sie können das Ziel dennoch mit folgendem erreichen:
html_stars_element = html_item_card.select_one('[class^="five-stars"]')
stars = html_stars_element.attrs['aria-label'].replace(' star rating', '')
reviews = html_stars_element.parent.parent.next_sibling.text
Beachten Sie die Verwendung der Python-Funktion replace(), um den String zu bereinigen und nur die relevanten Daten zu erhalten.
Untersuchen Sie auch die Tags und die Preisspannen-Elemente:

Um alle Tag-Strings zu sammeln, ist es notwendig, sie alle auszuwählen und über sie zu iterieren:
tags = []
html_tag_elements = html_item_card.select('[class^="priceCategory"] button')
for html_tag_element in html_tag_elements:
tag = html_tag_element.text
tags.append(tag)
Das Abrufen der optionalen Preisspangenangabe ist hingegen viel einfacher:
price_range_html = html_item_card.select_one('[class^="priceRange"]')
# da die Preisspangeninformation optional ist
if price_range_html is not None:
price_range = price_range_html.text
Schließlich sollten Sie auch die vom Restaurant angebotenen Dienstleistungen scrapen:

Auch hier müssen Sie über jeden einzelnen Knoten iterieren:
services = []
html_service_elements = html_item_card.select('[data-testid="services-actions-component"] p[class^="tagText"]')
for html_service_element in html_service_elements:
service = html_service_element.text
services.append(service)
Gut gemacht! Sie haben gerade die Scraping-Logik implementiert.
Fügen Sie die gescrapten Datenvariablen zum Wörterbuch hinzu:
item['name'] = name
item['image'] = image
item['url'] = url
item['stars'] = stars
item['reviews'] = reviews
item['tags'] = tags
item['price_range'] = price_range
item['services'] = services
Verwenden Sie print(item), um sicherzustellen, dass der Datenextraktionsprozess wie gewünscht funktioniert. Bei der ersten Karte erhalten Sie:
{'name': 'Olio e Più', 'image': 'https://s3-media0.fl.yelpcdn.com/bphoto/CUpPgz_Q4QBHxxxxDJJTTA/348s.jpg', 'url': 'https://www.yelp.com/biz/olio-e-pi%C3%B9-new-york-7?osq=Italian', 'stars': '4.5', 'reviews': '4588', 'tags': ['Pizza', 'Italian', 'Cocktail Bars'], 'price_range': '$$', 'services': ['Outdoor seating', 'Delivery', 'Takeout']}
Ausgezeichnet! Sie sind Ihrem Ziel näher!
Schritt 7: Die Crawling-Logik implementieren
Vergessen Sie nicht, dass Unternehmen den Nutzern in einer paginierten Liste präsentiert werden. Sie haben gerade gesehen, wie man eine einzelne Seite scrapt, aber was, wenn Sie alle Daten abrufen möchten? Dazu müssen Sie Web-Crawling in den Yelp-Datenscraper integrieren.
Definieren Sie zunächst einige unterstützende Datenstrukturen am Anfang Ihres Skripts:
visited_pages = []
pages_to_scrape = ['https://www.yelp.com/search?find_desc=Italian&find_loc=New+York%2C+NY']
visited_pages enthält die URLs der gescrapten Seiten, während pages_to_scrape die nächsten zu besuchenden enthält.
Erstellen Sie eine while-Schleife, die endet, wenn keine Seiten mehr zu scrapen sind oder nach einer bestimmten Anzahl von Iterationen:
limit = 5 # in der Produktion können Sie es entfernen
i = 0
while len(pages_to_scrape) != 0 and i < limit:
# erste Seite aus dem Array extrahieren
url = pages_to_scrape.pop(0)
# als "besucht" markieren
visited_pages.append(url)
# Seite herunterladen und parsen
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
# scraping logic...
# crawling logic...
# Seitenzähler erhöhen
i += 1
Jede Iteration wird eine Seite aus der Liste entfernen, sie scrapen, neue Seiten entdecken und sie zur Warteschlange hinzufügen. limit verhindert einfach, dass der Scraper für immer läuft.
Es bleibt nur noch die Crawling-Logik zu implementieren. Untersuchen Sie das HTML-Paginierungselement:

Dieses besteht aus mehreren Links. Sammeln Sie sie alle und fügen Sie die neu entdeckten zu pages_to_visit hinzu mit:
pagination_link_elements = soup.select('[class^="pagination-links"] a')
for pagination_link_element in pagination_link_elements:
pagination_url = pagination_link_element.attrs['href']
# wenn die entdeckte URL neu ist
if pagination_url not in visited_pages and pagination_url not in pages_to_scrape:
pages_to_scrape.append(pagination_url)
Wunderbar! Jetzt wird Ihr Scraper automatisch alle Paginierungsseiten durchgehen.
Schritt 8: Gescrapte Daten in CSV exportieren
Der letzte Schritt besteht darin, die gesammelten Daten einfacher teilbar und lesbar zu machen. Der beste Weg dazu ist der Export in ein menschenlesbares Format, wie CSV:
import csv
# ...
# .csv-Ausgabedatei initialisieren
with open('restaurants.csv', 'w', newline='', encoding='utf-8') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=headers, quoting=csv.QUOTE_ALL)
writer.writeheader()
# CSV-Datei befüllen
for item in items:
# Array-Felder von "['element1', 'element2', ...]"
# zu "element1; element2; ..." umwandeln
csv_item = {}
for key, value in item.items():
if isinstance(value, list):
csv_item[key] = '; '.join(str(e) for e in value)
else:
csv_item[key] = value
# neuen Datensatz hinzufügen
writer.writerow(csv_item)
Erstellen Sie eine restaurants.csv-Datei mit open(). Verwenden Sie dann DictWriter und benutzerdefinierte Logik, um sie zu befüllen. Da das csv-Paket aus der Python-Standardbibliothek stammt, müssen keine zusätzlichen Abhängigkeiten installiert werden.
Gut! Sie haben mit Rohdaten aus einer Webseite begonnen und verfügen nun über halbstrukturierte CSV-Daten. Es ist Zeit, den vollständigen Yelp-Python-Scraper zu betrachten.
Schritt 9: Alles zusammenfügen
So sieht das vollständige scraper.py-Skript aus:
import requests
from bs4 import BeautifulSoup
import csv
# unterstützende Datenstrukturen zur Implementierung der
# Crawling-Logik
visited_pages = []
pages_to_scrape = ['https://www.yelp.com/search?find_desc=Italian&find_loc=New+York%2C+NY']
# zum Speichern der gescrapten Daten
items = []
# um Yelps Server nicht mit Anfragen zu überlasten
limit = 5
i = 0
# bis alle Paginierungsseiten besucht wurden
# oder das Seitenlimit erreicht ist
while len(pages_to_scrape) != 0 and i < limit:
# erste Seite aus dem Array extrahieren
url = pages_to_scrape.pop(0)
# als "besucht" markieren
visited_pages.append(url)
# Seite herunterladen und parsen
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
# alle Elementkarten auswählen
html_item_cards = soup.select('[data-testid="serp-ia-card"]')
for html_item_card in html_item_cards:
# Scraping-Logik
item = {}
image = html_item_card.select_one('[data-lcp-target-id="SCROLLABLE_PHOTO_BOX"] img').attrs['src']
name = html_item_card.select_one('h3 a').text
url = 'https://www.yelp.com' + html_item_card.select_one('h3 a').attrs['href']
html_stars_element = html_item_card.select_one('[class^="five-stars"]')
stars = html_stars_element.attrs['aria-label'].replace(' star rating', '')
reviews = html_stars_element.parent.parent.next_sibling.text
tags = []
html_tag_elements = html_item_card.select('[class^="priceCategory"] button')
for html_tag_element in html_tag_elements:
tag = html_tag_element.text
tags.append(tag)
price_range_html = html_item_card.select_one('[class^="priceRange"]')
# dieses HTML-Element ist optional
if price_range_html is not None:
price_range = price_range_html.text
services = []
html_service_elements = html_item_card.select('[data-testid="services-actions-component"] p[class^="tagText"]')
for html_service_element in html_service_elements:
service = html_service_element.text
services.append(service)
# gescrapte Daten zum Objekt hinzufügen
# und dann das Objekt zum Array
item['name'] = name
item['image'] = image
item['url'] = url
item['stars'] = stars
item['reviews'] = reviews
item['tags'] = tags
item['price_range'] = price_range
item['services'] = services
items.append(item)
# neue Paginierungsseiten entdecken und zur Warteschlange hinzufügen
pagination_link_elements = soup.select('[class^="pagination-links"] a')
for pagination_link_element in pagination_link_elements:
pagination_url = pagination_link_element.attrs['href']
# wenn die entdeckte URL neu ist
if pagination_url not in visited_pages and pagination_url not in pages_to_scrape:
pages_to_scrape.append(pagination_url)
# Seitenzähler erhöhen
i += 1
# Schlüssel aus dem ersten Objekt im Array extrahieren
# um sie als Header der CSV zu verwenden
headers = items[0].keys()
# .csv-Ausgabedatei initialisieren
with open('restaurants.csv', 'w', newline='', encoding='utf-8') as csv_file:
writer = csv.DictWriter(csv_file, fieldnames=headers, quoting=csv.QUOTE_ALL)
writer.writeheader()
# CSV-Datei befüllen
for item in items:
# Array-Felder von "['element1', 'element2', ...]"
# zu "element1; element2; ..." umwandeln
csv_item = {}
for key, value in item.items():
if isinstance(value, list):
csv_item[key] = '; '.join(str(e) for e in value)
else:
csv_item[key] = value
# neuen Datensatz hinzufügen
writer.writerow(csv_item)
In etwa 100 Codezeilen können Sie einen Web-Spider erstellen, der Geschäftsdaten von Yelp extrahiert.
Starten Sie den Scraper mit:
python scraper.py
Warten Sie, bis die Ausführung abgeschlossen ist, und Sie finden die restaurants.csv-Datei im Stammordner Ihres Projekts:

Herzlichen Glückwunsch! Sie haben gerade gelernt, wie man Yelp in Python scrapt!
Fazit
In diesem Schritt-für-Schritt-Leitfaden haben Sie verstanden, warum Yelp eines der besten Scraping-Ziele ist, um Nutzerdaten über lokale Unternehmen zu erhalten. Im Detail haben Sie gelernt, wie Sie einen Python-Scraper erstellen, der Yelp-Daten abrufen kann. Wie hier gezeigt, sind dafür nur wenige Codezeilen erforderlich.
Gleichzeitig entwickeln sich Websites weiter und passen ihre Benutzeroberfläche und Struktur an die sich ständig ändernden Erwartungen der Nutzer an. Der hier erstellte Scraper funktioniert heute, ist aber möglicherweise morgen nicht mehr wirksam. Vermeiden Sie Zeit- und Geldaufwand für Wartung und testen Sie unseren Yelp-Scraper!
Bedenken Sie auch, dass die meisten Websites stark auf JavaScript setzen. In diesen Szenarien funktioniert ein traditioneller Ansatz auf Basis eines HTML-Parsers nicht. Stattdessen müssen Sie ein Tool verwenden, das JavaScript rendern und Fingerprinting, CAPTCHAs und automatische Wiederholungsversuche für Sie verwalten kann. Genau darum geht es bei unserer neuen Scraping-Browser-Lösung!
Möchten Sie sich nicht mit dem Web-Scraping von Yelp befassen und einfach nur Daten haben? Yelp-Datensätze kaufen
Hinweis: Dieser Leitfaden wurde von unserem Team zum Zeitpunkt der Erstellung gründlich getestet, aber da Websites ihren Code und ihre Struktur häufig aktualisieren, funktionieren einige Schritte möglicherweise nicht mehr wie erwartet.