Zum Inhalt

So führen Sie Web Scrape auf Yelp.com durch: Der ultimative 3000-Wörter-Leitfaden zum Extrahieren von Brancheneinträgen, Bewertungen und anderen Daten

Yelp ist eine der größten Crowdsourcing-Bewertungsplattformen im Internet. Mit über 200 Millionen Bewertungen von Restaurants, Bars, Salons, Geschäften und anderen Unternehmen in über 30 Ländern enthält es eine Goldgrube an Daten für Analysten, Forscher, Unternehmer und mehr.

Aber ist es möglich, diese Daten durch Web Scraping zu extrahieren? Absolut!

In diesem umfassenden Leitfaden mit mehr als 3000 Wörtern teile ich alles, was Sie zum Erstellen eines Web-Scraper benötigen, der mithilfe von Python riesige Datensätze aus Yelp extrahieren kann.

Hier ist ein kurzer Überblick über das, was wir behandeln werden:

  • Einrichten unserer Python-Web-Scraping-Umgebung
  • Suchen und Extrahieren aller Unternehmen, die einer Suchanfrage entsprechen
  • Entfernen wichtiger Details wie Name, Adresse und Telefonnummern von Unternehmensprofilseiten
  • Extrahieren aller Bewertungen für ein Unternehmen, einschließlich Bewertungen, Benutzerdetails usw.
  • Vermeidung der Bot-Erkennung durch Proxys, Verzögerungen und andere Tricks

Also anschnallen und los geht’s!

Einrichten einer Python-Web-Scraping-Umgebung

Bevor wir Yelp durchsuchen können, müssen wir eine Python-Umgebung mit den erforderlichen Abhängigkeiten einrichten.

Es gibt ein paar Schlüsselpakete, die wir installieren müssen:

Anfragen – um HTTP-Anfragen an die Server von Yelp zu senden

BeautifulSuppe – um Daten aus den HTML-Seiten von Yelp zu analysieren und zu extrahieren

Scrapy – (optional) ein Rahmen für den Bau von Schabern

Ich würde empfehlen, eine virtuelle Umgebung zu erstellen, bevor Sie diese installieren:

python -m venv scraping-env
source scraping-env/bin/activate

Jetzt können wir die Pakete installieren:

pip install requests beautifulsoup4 scrapy

Das war’s mit den Abhängigkeiten. Wir benötigen außerdem gültige Header, damit die Yelp-Server glauben, dass unsere Anfragen von einem echten Browser kommen:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}

Der Schlüssel liegt darin, überzeugend zu wirken User-Agent Header. Ich würde empfehlen, mehrere Browser-Benutzeragenten rotieren zu lassen, um den realen Datenverkehr besser nachzuahmen.

Und wir sind bereit, mit dem Schaben zu beginnen!

Auf Yelp nach Unternehmen suchen

Unsere erste Herausforderung besteht darin, Yelp-Unternehmensprofil-URLs zum Scrapen zu finden. Yelp stellt keine öffentliche API oder Sitemap bereit, die wir hierfür abfragen können.

Daher müssen wir ihre Suchfunktion zurückentwickeln, um Unternehmen zu finden, die einem Suchbegriff oder Standort entsprechen.

Lassen Sie uns eine typische Suchanfrage analysieren:

https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco

Dadurch wird eine paginierte Gruppe von Unternehmen zurückgegeben, die unseren Suchkriterien entsprechen. Jede Seite enthält 10 Brancheneinträge.

Um ALLE passenden Unternehmen zu extrahieren, müssen wir Folgendes tun:

  1. Rufen Sie die erste Seite ab, um die Gesamtzahl der Geschäfte zu erhalten
  2. Durchlaufen Sie alle Seiten, indem Sie die erhöhen start Parameter

So können wir diese Paginierungslogik in Python implementieren:

import requests
from urllib.parse import urlencode
from bs4 import BeautifulSoup

search_url = "https://www.yelp.com/search?"

params = {
  "find_desc": "restaurants",
  "find_loc": "San Francisco"  
}

search_url += urlencode(params)

print("Fetching first page")
first_page = requests.get(search_url, headers=headers)
soup = BeautifulSoup(first_page.content, "html.parser")

businesses = soup.select(".businessName") 
total = int(soup.select_one(".pagination-results-window").text.split()[0].replace(‘,‘, ‘‘))
print(f"Found {total} businesses")

# Calculate pages needed to cover all businesses
num_pages = math.ceil(total / 10)

print(f"Scraping {num_pages} pages...")

for page in range(0, num_pages):

  # Update start param 
  params["start"] = page * 10
  page_url = search_url + "&" + urlencode(params)

  # Fetch page
  print(f"Page {page+1}/{num_pages}")
  page = requests.get(page_url, headers=headers)

  # Extract businesses
  page_soup = BeautifulSoup(page.content, "html.parser")
  businesses.extend(page_soup.select(".businessName"))

print(f"Found {len(businesses)} businesses!")

Lassen Sie uns das aufschlüsseln:

  • Wir beginnen mit der Basissuch-URL und den Suchparametern
  • Rufen Sie die erste Seite ab, um die Gesamtzahl der Geschäfte zu erfahren
  • Berechnen Sie die Anzahl der Seiten, die erforderlich sind, um alle Unternehmen abzudecken
  • Durchlaufen Sie die Seiten, um die zu aktualisieren start stoppen
  • Extrahieren Sie auf jeder Seite Brancheneinträge und hängen Sie sie an die Hauptliste an

In meinem Test wurde dies überholt 6,000 Restauranteinträge in San Francisco – nicht schlecht für 30 Zeilen Python!

Mit ein paar zusätzlichen Optimierungen könnten Sie daraus einen Yelp-Business-Scraper für eine ganze Stadt oder ein ganzes Land machen.

Scraping von Unternehmensprofilseiten

Nachdem wir nun Unternehmensprofil-URLs ermitteln können, besteht unser nächster Schritt darin, jede einzelne URL zu besuchen und wichtige Details zu extrahieren wie:

  • Name und Vorname
  • Adresse
  • Telefonnummer
  • Öffnungszeiten
  • Beschreibung
  • Fotos
  • Und mehr ...

Die Geschäftsseiten von Yelp werden dynamisch gerendert, aber der zugrunde liegende HTML-Code ist einfach genug, um mit BeautifulSoup analysiert zu werden.

Schauen wir uns einen Beispielausschnitt an:



<p>
  <strong>Phone:</strong> 
  415-387-2147
</p>

<p>
  <strong>Address:</strong>
  1345 9th Ave, San Francisco, CA 94122
</p>

<!-- And so on... -->

Mit einigen gut platzierten CSS-Selektoren können wir jede einzelne Information extrahieren:

from bs4 import BeautifulSoup
import requests

business_url = "https://www.yelp.com/biz/burma-superstar-san-francisco"

page = requests.get(business_url, headers=headers)
soup = BeautifulSoup(page.content, "html.parser")

name = soup.select_one("h1").text
phone = soup.find("strong", string="Phone:").next_sibling.strip() 
address = soup.find("strong", string="Address:").next_sibling.strip()

hours = {}
for day in soup.select(".day-hours"):
   day_name = day.select_one(".day-name").text
   hours[day_name] = day.select_one(".hours").text

print(name)
print(phone) 
print(address)
print(hours)

# Burma Superstar
# 415-387-2147
# 1345 9th Ave, San Francisco, CA 94122
# {‘Mon‘: ‘11:30am–3pm, 5–9:30pm‘, ‘Tue‘: ‘11:30am–3pm, 5–9:30pm‘...}

Die wichtigsten Punkte sind:

  • Verwenden Sie die select_one um einzelne Elemente wie Name, Telefon usw. zu extrahieren.
  • Führen Sie für verschachtelte Daten wie Stunden eine Schleife durch und erstellen Sie ein Wörterbuch
  • Stellen Sie CSS-Selektoren zur Einzigartigkeit Tags und Klassen voran

Mit diesen Scraping-Bausteinen können wir Dutzende Felder aus jeder Profilseite in ein strukturiertes Python-Wörterbuch oder JSON-Objekt extrahieren.

Einige andere Bereiche, die Sie möglicherweise als Scraping in Betracht ziehen sollten, sind:

  • Kategorie-Tags wie „Mexikanisch“, „Brunch“ usw.
  • Küchen-Tags wie „Burger“, „Sushi“, „Kaffee“ usw.
  • COVID-Sicherheitsmaßnahmen
  • Preisklasse
  • Nachbarschaft
  • Breite / Länge
  • Und mehr ...

Wenn Sie hier Ihrer Kreativität freien Lauf lassen, können Sie umfangreiche Yelp-Datensätze mit Hunderten von Feldern erstellen, die Sie bei Bedarf analysieren können.

Scraping von Rezensionen von Yelp-Unternehmensseiten

Bewertungen sind die Kronjuwelen der Yelp-Daten. Sie bieten unglaubliche Einblicke in die Verbraucherstimmung, Trends, Demografie und mehr.

Leider werden Bewertungen nicht direkt im HTML geladen. Sie werden dynamisch über JavaScript-Aufrufe abgerufen.

Wir müssen diese Anfragen abfangen und nachahmen, um Bewertungsdaten zu extrahieren.

Öffnen wir eine Unternehmensseite und überwachen Netzwerkanfragen in den Browser-Tools:

Yelp überprüft die Netzwerkanfrage

Aha – wir können sehen, dass Bewertungen von einer URL geladen werden wie:

https://www.yelp.com/biz/{business_id}/reviews

Wo {business_id} ist für jedes Unternehmen einzigartig. Wir können es aus dem HTML der Geschäftsseite extrahieren.

Bewertungen werden über die Seitennummerierung angezeigt start Parameter. Daher verfolgen wir dieselbe Paginierungsstrategie:

  1. Rufen Sie die erste Seite ab, um die Gesamtzahl der Rezensionen zu erhalten
  2. Durchlaufen Sie alle Seiten durch Inkrementieren start

Hier ist ein Skript zum Extrahieren aller Bewertungen für ein Unternehmen:

import json
import requests 

business_id = "WavvLdfdP6g8aZTtbBQHTw" # Extract this from HTML

review_url = f"https://www.yelp.com/biz/{business_id}/review_feed?rl=en&q=&sort_by=relevance_desc"

print("Fetching first page")
first_page = requests.get(review_url, headers=headers)
data = json.loads(first_page.text)

total = data["pagination"]["totalResults"]
print(f"Found {total} reviews")

reviews = data["reviews"]

for page in range(total//20 + 1): # 20 reviews per page

  print(f"Fetching page {page+1}/{math.ceil(total/20)}")
  next_page = f"{review_url}&start={page*20}"
  page_data = requests.get(next_page, headers=headers).json()

  reviews.extend(page_data["reviews"])

print(f"Scraped {len(reviews)} reviews!")

Boom! Wir haben jetzt das vollständige Bewertungskorpus für ein Unternehmen mit Daten wie:

{
   "id": "xAG4O7l-t1ubiIsO4cXMYg",
   "rating": 5,
   "user": {
      "id": "rpOyqD_893cqmDAtJLbdog",
      "profile_url": "https://www.yelp.com/user_details?userid=rpOyqD_893cqmDAtJLbdog",
      "name": "Sarah K.",
      "location": "Los Angeles, CA", 
      //...
   },
   "text": "This place is incredible! The sushi melts in your mouth and the...",
    //...
}

Die Analyse dieser Daten kann starke Signale zur Kundenstimmung über Standorte, Demografie, Küchentypen und mehr hinweg liefern.

Vermeidung der Bot-Erkennung

Nachdem wir nun Scraper für Unternehmen und Bewertungen erstellt haben, ist es an der Zeit, alles zusammenzustellen.

Ein Problem: Wenn wir die Server von Yelp mit Tausenden von Anfragen überlasten, werden wir schnell blockiert.

Yelp setzt fortschrittliche Bot-Erkennungssysteme ein, um Missbrauch zu verhindern, darunter:

  • Nutzungsbeschränkungen – Begrenzen Sie, wie schnell Sie Seiten anfordern können
  • CAPTCHAs – fordern Benutzer auf, zu bestätigen, dass sie ein Mensch sind
  • IP-Verbote – missbräuchliche IP-Adressen blockieren

Hier sind einige Tipps, um Blockaden beim Scrapen von Yelp in großem Maßstab zu vermeiden:

Verwenden Sie Proxys

Indem wir den Datenverkehr über einen großen Pool privater IP-Adressen leiten, können wir Scraper maskieren und einfache IP-Verbote vermeiden.

So verwenden Sie Proxys mit dem Requests-Modul:

from proxy_list import proxies 

# Rotate proxy per request
proxy = random.choice(proxies)

requests.get(url, headers=headers, proxies={"http": proxy, "https": proxy}) 

Ich würde empfehlen, einen Pool davon zu haben mindestens 10,000 Proxys aus verschiedenen IP-Bereichen verwenden, um sicher zu sein.

Fügen Sie zufällige Verzögerungen hinzu

Das Hinzufügen unterschiedlicher Verzögerungen zwischen Anfragen trägt dazu bei, organisches menschliches Verhalten nachzuahmen:

from random import randint

# Add random delay between 2s and 6s
time.sleep(randint(2, 6))

Streben Sie einen Durchschnitt von an 3-5 Sekunden zwischen den Seiten. Je schneller Sie fahren, desto mehr werden Warnsignale ausgelöst.

Verwenden Sie einen Headless-Browser

Für mehr Anonymität können Sie einen Headless-Browser wie Selenium verwenden, um JavaScript zu rendern und Schutzmaßnahmen zu umgehen.

Stellen Sie sicher, dass Sie den Browser-Fingerabdruck und den Proxy pro Sitzung ändern.

Lösen Sie CAPTCHAs mit 2Captcha

Wenn Sie auf ein CAPTCHA treffen, können Dienste wie 2Captcha es automatisch lösen, um mit dem Scrapen fortzufahren.

Die meisten Dienste berechnen etwa 2 US-Dollar pro 1000 gelösten CAPTCHAs, was sich für die Skalierung großer Scraper lohnt.

Beachten Sie die Kontobeschränkungen

Behalten Sie die Seite mit dem Kontostatus im Auge. Wenn Ihre Scrape-Rate zu aggressiv ist, erzwingt Yelp möglicherweise vorübergehende Nutzungsbeschränkungen.

Beschleunigen Sie Ihre Anfragen und halten Sie sich zurück, wenn Fehler darauf hinweisen, dass Sie sich einem Nutzungsgrenzwert nähern.

Scraping Yelp: Nächste Schritte

Und das deckt die Kerntechniken zum Scrapen der Brancheneinträge, Profile und Bewertungen von Yelp ab!

Die Daten, die Sie extrahieren können, eröffnen unzählige Möglichkeiten:

  • Analysieren Sie die Verbraucherstimmung über alle Bevölkerungsgruppen hinweg
  • Verfolgen Sie Trends und neue Küchentypen
  • Erstellen Sie Vorhersagemodelle für geschäftliche Erfolgsfaktoren
  • Optimieren Sie Ihre eigene SEO und Reputation
  • Führen Sie eine umfassende Marktforschung durch
  • Identifizieren Sie Werbemöglichkeiten

Denken Sie daran, die Nutzungsbedingungen von Yelp einzuhalten, das Anfragevolumen zu begrenzen und die Extraktion privater Benutzerdaten zu vermeiden.

Ich hoffe, Sie fanden diesen Leitfaden nützlich! Wenn Sie weitere Fragen haben, können Sie sich gerne an uns wenden.

Viel Spaß beim Schaben!

Stichworte:

Mitreden

E-Mail-Adresse wird nicht veröffentlicht. Pflichtfelder sind MIT * gekennzeichnet. *