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.
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.
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")
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)
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)
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)
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]
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:
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)
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")
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Bemerkungen: 0