Wie man Yelp mit Python ausschöpft

Bemerkungen: 0

Das Scraping von Daten aus Yelp kann wertvolle Einblicke in lokale Restaurants liefern, einschließlich Details wie Name, URL, Küchen und Bewertungen. Mit Hilfe der Python-Bibliotheken requests und lxml wird in diesem Tutorial gezeigt, wie man Yelp-Suchergebnisse scrapen kann. Es werden verschiedene Techniken behandelt, darunter die Verwendung von Proxies, die Behandlung von Headern und die Extraktion von Daten mit XPath.

Schritt 1: Einrichten der Umgebung

Bevor Sie mit dem Scraping-Prozess beginnen, stellen Sie sicher, dass Sie Python und die erforderlichen Bibliotheken installiert haben:

pip install requests
pip install lxml

Diese Bibliotheken helfen uns, HTTP-Anfragen an Yelp zu senden, den HTML-Inhalt zu parsen und die benötigten Daten zu extrahieren.

Schritt 2: Senden einer Anfrage an Yelp

Zunächst müssen wir eine GET-Anfrage an die Yelp-Suchergebnisseite senden, um den HTML-Inhalt abzurufen. So geht's:

import requests

# URL der Yelp-Suchseite
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Senden Sie eine GET-Anfrage, um den HTML-Inhalt abzurufen
response = requests.get(url)

# Prüfen, ob die Anfrage erfolgreich war
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

Verstehen der HTTP-Header

Bei Anfragen an eine Website ist es wichtig, die entsprechenden HTTP-Header anzugeben. Header können Metadaten über die Anfrage enthalten, wie z. B. den User-Agent, der den Browser oder das Tool identifiziert, das die Anfrage stellt. Die Angabe dieser Header kann dazu beitragen, die Blockierung oder Drosselung durch die Ziel-Website zu vermeiden.

So können Sie Header einrichten:

headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}

response = requests.get(url, headers=headers)

Implementierung der Proxy-Rotation

Beim Scraping einer großen Anzahl von Seiten besteht die Gefahr, dass Ihre IP-Adresse von der Zielseite blockiert wird. Um dies zu verhindern, wird die Verwendung von Proxy-Servern empfohlen. Für diesen Leitfaden ist es ratsam, dynamische Proxyserver zu verwenden, die eine automatische Rotation ermöglichen. Auf diese Weise müssen Sie die Einstellungen des Proxy-Servers nur einmal vornehmen, und die Rotation trägt dazu bei, den Zugang aufrechtzuerhalten, indem sie die IP-Adresse regelmäßig ändert, was die Wahrscheinlichkeit einer Sperrung verringert.

proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

response = requests.get(url, headers=headers, proxies=proxies)

Schritt 3: Parsen des HTML-Inhalts mit lxml

Sobald wir den HTML-Inhalt haben, besteht der nächste Schritt darin, ihn zu parsen und die relevanten Daten zu extrahieren. Zu diesem Zweck verwenden wir die lxml-Bibliothek.

from lxml import html

# Parsen des HTML-Inhalts mit lxml
parser = html.fromstring(response.content)

Identifizierung der zu scrappenden Elemente

Wir müssen die einzelnen Restaurantlisten auf der Suchergebnisseite ausfindig machen. Diese Elemente können mit XPath-Ausdrücken identifiziert werden. Bei Yelp sind die Einträge normalerweise in ein div-Element mit einem bestimmten data-testid-Attribut eingeschlossen.

# Einzelne Restaurant-Elemente extrahieren
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

Verwendung von XPath für die Datenextraktion

XPath ist ein leistungsfähiges Werkzeug zum Navigieren und Auswählen von Knoten in einem HTML-Dokument. In diesem Tutorial werden wir XPath-Ausdrücke verwenden, um den Restaurantnamen, die URL, die Gerichte und die Bewertung aus jedem Restaurantelement zu extrahieren.

Hier sind die spezifischen XPaths für jeden Datenpunkt:

  1. Name des Restaurants: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()
  2. Restaurant-URL: .//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href
  3. Küchen: .//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()
  4. Bewertung: .//div[@class="y-css-9tnml4"]/@aria-label

Schritt 4: Extrahieren von Daten aus jedem Restaurantverzeichnis

Nun, da wir den HTML-Inhalt haben und die potenzielle IP-Sperre beseitigt haben, können wir die erforderlichen Daten aus den einzelnen Restaurantangeboten extrahieren.

restaurants_data = []

# Iterieren Sie über jedes Restaurantelement
for element in elements:
    # Extrahieren Sie den Namen des Restaurants
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Extrahieren Sie die URL des Restaurants
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Extrahieren Sie die Kochkünste
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Extrahieren Sie die Bewertung
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Erstellen eines Wörterbuchs zum Speichern der Daten
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Fügen Sie die Restaurantinformationen zur Liste hinzu
    restaurants_data.append(restaurant_info)

Schritt 5: Speichern der Daten als JSON

Nachdem wir die Daten extrahiert haben, müssen wir sie in einem strukturierten Format speichern. JSON ist ein weit verbreitetes Format für diesen Zweck.

import json

# Speichern der Daten in einer JSON-Datei
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Vollständiger Code

import requests
from lxml import html
import json

# URL der Yelp-Suchseite
url = "https://www.yelp.com/search?find_desc=restaurants&find_loc=San+Francisco%2C+CA"

# Kopfzeilen einrichten, um eine Browser-Anfrage zu imitieren
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Accept-Language': 'en-US,en;q=0.5'
}

# Proxys einrichten, falls erforderlich
proxies = {
    'http': 'http://username:password@proxy-server:port',
    'https': 'https://username:password@proxy-server:port'
}

# Senden Sie eine GET-Anfrage, um den HTML-Inhalt abzurufen
response = requests.get(url, headers=headers, proxies=proxies)

# Prüfen, ob die Anfrage erfolgreich war
if response.status_code == 200:
    print("Successfully fetched the page content")
else:
    print("Failed to retrieve the page content")

# Parsen des HTML-Inhalts mit lxml
parser = html.fromstring(response.content)

# Einzelne Restaurant-Elemente extrahieren
elements = parser.xpath('//div[@data-testid="serp-ia-card"]')[2:-1]

# Initialisierung einer Liste zur Aufnahme der extrahierten Daten
restaurants_data = []

# Iterieren Sie über jedes Restaurantelement
for element in elements:
    # Extrahieren Sie den Namen des Restaurants
    name = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/text()')[0]

    # Extrahieren Sie die URL des Restaurants
    url = element.xpath('.//div[@class="businessName__09f24__HG_pC y-css-ohs7lg"]/div/h3/a/@href')[0]

    # Extrahieren Sie die Kochkünste
    cuisines = element.xpath('.//div[@class="priceCategory__09f24___4Wsg iaPriceCategory__09f24__x9YrM y-css-2hdccn"]/div/div/div/a/button/span/text()')

    # Extrahieren Sie die Bewertung
    rating = element.xpath('.//div[@class="y-css-9tnml4"]/@aria-label')[0]

    # Erstellen eines Wörterbuchs zum Speichern der Daten
    restaurant_info = {
        "name": name,
        "url": url,
        "cuisines": cuisines,
        "rating": rating
    }

    # Fügen Sie die Restaurantinformationen zur Liste hinzu
    restaurants_data.append(restaurant_info)

# Speichern der Daten in einer JSON-Datei
with open('yelp_restaurants.json', 'w') as f:
    json.dump(restaurants_data, f, indent=4)

print("Data extraction complete. Saved to yelp_restaurants.json")

Es ist wichtig, dass die Benutzer HTTP-Header richtig konfigurieren und Proxys verwenden, um Einschränkungen zu umgehen und Blockierungen zu vermeiden. Für ein optimiertes und sichereres Scraping-Erlebnis sollten Sie die Automatisierung der IP-Rotation in Betracht ziehen. Der Einsatz von dynamischen Proxys für Privatanwender oder Mobilgeräte kann diesen Prozess erheblich verbessern und die Wahrscheinlichkeit verringern, dass er entdeckt und blockiert wird.

Bemerkungen:

0 Bemerkungen