Yandex Maps Parser selbst bauen: Unternehmen, Bewertungen und Telefonnummern ohne Sperren sammeln
Inhalt des Artikels
- Einführung: was sie bekommen und für wen dieser leitfaden geeignet ist
- Vorbereitung: werkzeuge, zugänge und anforderungen
- Grundbegriffe: wie maps aufgebaut sind und was card-scraping bedeutet
- Schritt 1: umgebung einrichten und mobilen proxy anschließen
- Schritt 2: links zu den unternehmenseinträgen sammeln
- Schritt 3: unternehmenseintrag parsen — name, adresse, telefon, website
- Schritt 4: rezensionen aus den einträgen sammeln
- Schritt 5: ip-rotation und schutz vor sperren einrichten
- Schritt 6: daten bereinigen und in excel speichern
- Ergebnis überprüfen: checkliste für einen fertigen parser
- Typische fehler und ihre lösungen
- Zusätzliche möglichkeiten für fortgeschrittene
- Faq: häufige fragen zum parsen von yandex maps
- Fazit
Einführung: Was Sie bekommen und für wen dieser Leitfaden geeignet ist
Yandex Maps hat sich längst vom reinen Navigationsdienst zum umfassendsten Unternehmensverzeichnis Russlands entwickelt. In den Unternehmenseinträgen stecken alle Informationen, die Marketer, Affiliate-Marketer oder Geschäftsinhaber benötigen: genaue Adressen, Telefonnummern, Websites, Öffnungszeiten, Bewertungen und Tausende ehrliche Kundenrezensionen. Das Problem: 500 Zahnarztpraxen in einer Stadt manuell durchzugehen ist unmöglich, und fertige Dienste sind entweder teuer oder liefern veraltete Daten.
In dieser Anleitung schreiben wir gemeinsam einen eigenen Yandex-Maps-Parser in Python. Keine kostenpflichtigen Programme, keine fremden Server. Am Ende des Leitfadens haben Sie:
- Ein funktionierendes Skript, das Unternehmenseinträge zu jeder beliebigen Suchanfrage und Stadt sammelt.
- Eine Excel-Tabelle mit Namen, Kategorien, Adressen, Telefonnummern, Websites, Bewertungen und Öffnungszeiten.
- Eine separate Tabelle mit Rezensionen: Autor, Bewertung, Datum, Text.
- Ein Verständnis dafür, wie Sie durch die Verteilung der Last über mobile Proxys vorsichtig arbeiten und Captchas sowie Sperren vermeiden.
Wichtige Abgrenzung dieses Artikels: Wir behandeln speziell die Unternehmenseinträge innerhalb von Maps. Das Scrapen der normalen Yandex-Suchergebnisse, die Arbeit mit Antidetect-Browsern und die grundlegende Einrichtung mobiler Proxys werden in verwandten Blog-Beiträgen behandelt. Hier wiederholen wir sie nicht, sondern bauen darauf auf.
Für wen dieser Leitfaden ist
- Marketer und Geschäftsinhaber, die eine Datenbank mit Wettbewerbern oder Partnern in der Region mit echten Telefonnummern und Bewertungen benötigen.
- Affiliate-Marketer, die Offline-Nischen und lokale Angebote für die spätere Analyse sammeln.
- Entwickler, denen die Aufgabe übertragen wurde, Daten von Maps zu sammeln und die nicht bei null anfangen möchten.
- Analysten, die Rezensionen untersuchen, um die Servicequalität in einer Nische zu bewerten.
Was Sie im Voraus wissen sollten
Nichts Kompliziertes. Es reicht, Programme installieren, die Kommandozeile öffnen und Text kopieren zu können. Programmiererfahrung ist nicht erforderlich: Der gesamte Code ist fertig, Sie müssen nur Ihre eigenen Werte einsetzen. Wenn Sie schon einmal ein Python-Skript ausgeführt haben, wird es Ihnen besonders leicht fallen. Im Abschnitt für Fortgeschrittene gehen wir auf Asynchronität und die Arbeit mit Netzwerkantworten ein, aber diesen können Sie überspringen.
Wie viel Zeit benötigt wird
- Vorbereitung der Umgebung: 30-40 Minuten.
- Schreiben und Debuggen des Parsers Schritt für Schritt: 1,5-2 Stunden.
- Erste vollständige Sammlung von 300-500 Einträgen: 1-3 Stunden Hintergrundzeit, während Sie andere Dinge erledigen.
Insgesamt erhalten Sie in einem halben Arbeitstag ein Werkzeug, das Ihnen danach Wochen manueller Arbeit erspart.
Vorbereitung: Werkzeuge, Zugänge und Anforderungen
Bevor wir mit dem Programmieren beginnen, sammeln wir alles Nötige. Überspringen Sie diesen Abschnitt nur, wenn Python bereits installiert ist und Sie Zugang zu einem mobilen Proxy haben.
Systemanforderungen
- Windows 10 oder 11, macOS 12 oder neuer oder ein modernes Linux.
- Mindestens 8 GB RAM: Wir werden einen echten Chromium-Browser ausführen.
- 3-4 GB freier Speicherplatz für Python, Browser und Ergebnisse.
- Stabile Internetverbindung. Die Geschwindigkeit ist nicht kritisch, wichtiger ist, dass es keine Unterbrechungen gibt.
Was installiert werden muss
- Python 3.11 oder 3.12. Laden Sie das Installationsprogramm von der offiziellen Website python.org herunter. Bei der Installation unter Windows setzen Sie unbedingt das Häkchen bei Add Python to PATH unten im ersten Fenster des Installers, sonst funktionieren die Befehle in der Konsole nicht.
- Code-Editor. Visual Studio Code, PyCharm Community oder sogar Notepad++ sind geeignet. Wir orientieren uns an VS Code, aber für unsere Aufgaben gibt es keinen Unterschied.
- Python-Bibliotheken: playwright zur Browsersteuerung, pandas und openpyxl für Tabellen, requests zur Überprüfung des Proxys. Diese installieren wir im ersten Schritt.
- Chromium-Browser für Playwright. Wird mit einem separaten Befehl heruntergeladen, ist etwa 150 MB groß.
Zugang zu einem mobilen Proxy
Dies ist das Schlüsselelement des Abschnitts „ohne Bans“. Yandex Maps reagiert empfindlich auf die Anfragefrequenz von einer Adresse. Mobile Proxys liefern IP-Adressen echter Mobilfunkanbieter, hinter denen gleichzeitig Tausende normale Nutzer surfen, weshalb Yandex ihnen äußerst wohlwollend gegenübersteht. In Ihrem Kundenbereich bei mobileproxy.space benötigen Sie nach dem Kauf des Proxys vier Werte:
- Host (Serveradresse) und Port für die HTTP-Verbindung.
- Login und Passwort zur Authentifizierung.
- IP-Wechsel-Link: eine spezielle URL, bei deren Aufruf der Proxy eine neue Adresse vom Anbieter erhält. Kopieren Sie diese in eine separate Datei, sie wird im fünften Schritt benötigt.
Tipp: Wählen Sie einen Proxy aus derselben Region oder zumindest demselben Land wie die Stadt, die Sie scrapen. Maps passt die Ergebnisse an den Standort an, und ein Proxy aus einem anderen Land kann eine unvollständige Liste von Unternehmen oder eine Oberfläche in einer anderen Sprache anzeigen.
Sicherungskopien und Arbeitsordner
Erstellen Sie auf der Festplatte einen Ordner, zum Beispiel maps_parser. Darin werden die Skripte und Ergebnisse liegen. Alle Zwischendaten speichern wir nach jedem Eintrag in Dateien, sodass selbst wenn das Skript beim 300. Unternehmen abstürzt, die ersten 299 nicht verloren gehen. Eine Kopie der Ergebnisdatei sollten Sie vor jedem erneuten Start anlegen: Benennen Sie einfach die alte Datei um und fügen Sie das Datum hinzu.
Überprüfung: Öffnen Sie die Kommandozeile (unter Windows drücken Sie Win+R, geben Sie cmd ein und Enter) und tippen Sie den Befehl python --version ein. Wenn Sie eine Zeile wie Python 3.12.x sehen, ist die Vorbereitung abgeschlossen. Wenn stattdessen ein Fehler erscheint, installieren Sie Python neu mit dem Häkchen bei Add to PATH.
Grundbegriffe: Wie Maps aufgebaut sind und was Card-Scraping bedeutet
Bevor wir mit dem Programmieren beginnen, klären wir die Begriffe. Sie sind einfach, aber ohne sie wird später nicht klar, warum wir es genau so machen.
Schlüsselbegriffe einfach erklärt
- Parsing (Scraping) — das automatische Sammeln von Informationen von Webseiten. Das Programm öffnet eine Seite, wie es ein Mensch tun würde, und extrahiert die benötigten Fragmente.
- Unternehmenseintrag — eine separate Seite in Maps mit einer Adresse der Form yandex.ru/maps/org/Name/ numerische-ID/. Genau dort befinden sich Telefon, Adresse, Rezensionen und weitere Daten. Die Liste der Unternehmen links ist nur eine Vitrine, aus der wir lediglich die Links zu den Einträgen entnehmen.
- Selektor — die „Adresse“ eines Elements innerhalb der Seite. Zum Beispiel verweist die Klasse business-contacts-view__address auf den Block mit der Adresse. Anhand der Selektoren findet das Skript den benötigten Text.
- Headless-Browser — ein echter Browser, der von einem Programm gesteuert wird. Kann mit Fenster (Sie sehen, was passiert) oder ohne Fenster arbeiten.
- Playwright — eine Bibliothek zur Steuerung des Browsers aus Python. Wir haben sie gewählt, weil Maps vollständig auf JavaScript basieren und eine einfache Anfrage nach HTML eine leere Seite ohne Daten zurückgeben würde.
- Mobiler Proxy — ein Vermittler zwischen Ihrem Computer und der Website mit einer IP-Adresse aus dem Mobilfunknetz. Die Website sieht nicht Ihre Adresse, sondern die des Mobilfunkanbieters.
- IP-Rotation — der periodische Wechsel der Proxy-Adresse, damit die Last nicht auf einer IP konzentriert wird.
- Captcha — eine Überprüfungsseite „Bestätigen Sie, dass Sie kein Roboter sind“. Für uns ist das ein Signal, dass wir zu schnell sind. Wir werden sie nicht mit Drittanbieter-Diensten lösen, sondern einfach anhalten, die IP wechseln und das Tempo drosseln.
Grundprinzipien der Funktionsweise eines Yandex-Maps-Parsers
Die Logik ist einfach und besteht aus drei Phasen. Zuerst erhalten wir eine Liste von Links zu den Einträgen der gewünschten Unternehmen. Dann öffnen wir jeden Eintrag nacheinander und extrahieren die Daten. Am Ende fügen wir alles in eine Tabelle ein. Zwischen diesen Aktionen machen wir Pausen mit zufälliger Dauer und wechseln von Zeit zu Zeit die IP über den Adresswechsel-Link.
Was Sie über Rechtmäßigkeit und Ethik wissen sollten
Achtung: Sammeln Sie nur öffentlich zugängliche Unternehmensdaten und verwenden Sie diese für Analysen. Telefon und Adresse eines Unternehmens sind keine personenbezogenen Daten, aber die Namen der Rezensionsautoren können nach dem Föderalen Gesetz Nr. 152 als solche gelten. Speichern Sie sie nicht ohne Notwendigkeit und verwenden Sie die gesammelten Telefonnummern nicht für Massenaussendungen ohne Einwilligung, das verstößt gegen das Werbegesetz und die Regeln von Yandex. Denken Sie auch daran: Die Nutzungsbedingungen von Yandex schränken die automatisierte Sammlung ein, halten Sie die Last daher minimal und ziehen Sie für kommerzielle Projekte mit großen Volumen die offizielle Yandex-API für die Unternehmenssuche in Betracht.
Schritt 1: Umgebung einrichten und mobilen Proxy anschließen
Ziel dieser Phase: alle Bibliotheken installieren, den Browser herunterladen und sicherstellen, dass die Anfragen über den mobilen Proxy und nicht direkt laufen.
Bibliotheken installieren
- Öffnen Sie die Kommandozeile oder das Terminal.
- Wechseln Sie in den Arbeitsordner mit dem Befehl cd und dem Pfad zum Ordner. Zum Beispiel: cd C:\maps_parser unter Windows oder cd ~/maps_parser unter macOS und Linux.
- Erstellen Sie eine virtuelle Umgebung, damit die Bibliotheken andere Projekte nicht stören: python -m venv venv
- Aktivieren Sie sie. Windows: venv\Scripts\activate. macOS und Linux: source venv/bin/activate. Am Anfang der Terminalzeile erscheint die Anzeige (venv).
- Installieren Sie die Bibliotheken mit einem Befehl:
pip install playwright pandas openpyxl requests
playwright install chromiumDer zweite Befehl lädt Chromium herunter. Das dauert je nach Internetgeschwindigkeit 2-5 Minuten. Warten Sie, bis in der Konsole wieder die Eingabeaufforderung erscheint.
Proxy überprüfen
Erstellen Sie im Editor die Datei check_proxy.py und fügen Sie den Code ein, wobei Sie LOGIN, PASSWORT, HOST und PORT durch die Werte aus Ihrem Kundenbereich ersetzen:
import requests
proxy = 'http://ЛОГИН:ПАРОЛЬ@ХОСТ:ПОРТ'
proxies = {'http': proxy, 'https': proxy}
direct = requests.get('https://api.ipify.org?format=json', timeout=30).json()
via_proxy = requests.get('https://api.ipify.org?format=json', proxies=proxies, timeout=30).json()
print('Ваш прямой IP:', direct['ip'])
print('IP через прокси:', via_proxy['ip'])Führen Sie die Datei mit dem Befehl python check_proxy.py aus. Sie sollten zwei verschiedene Adressen sehen. Wenn die Adressen übereinstimmen oder ein Verbindungsfehler auftritt, funktioniert der Proxy nicht und weiterzumachen ist sinnlos.
IP-Wechsel überprüfen
Öffnen Sie den IP-Wechsel-Link aus Ihrem Kundenbereich in einem normalen Browser. Normalerweise gibt er eine kurze Antwort über den erfolgreichen Wechsel zurück. Warten Sie 15-30 Sekunden und führen Sie check_proxy.py erneut aus. Die Adresse über den Proxy sollte sich geändert haben. Merken Sie sich, wie viele Sekunden der Wechsel tatsächlich benötigt: Diesen Wert setzen wir im Skript im fünften Schritt ein.
Tipp: Speichern Sie alle Proxy-Einstellungen in einer separaten Datei config.py mit den Variablen PROXY_HOST, PROXY_PORT, PROXY_LOGIN, PROXY_PASSWORD und CHANGE_IP_URL. Dann reicht in den übrigen Skripten die Zeile from config import *, und Sie müssen die Passwörter nicht zehnmal neu schreiben.
Überprüfung: Der Befehl playwright --version gibt die Versionsnummer aus, check_proxy.py zeigt eine IP eines Mobilfunkanbieters, die sich von Ihrer Heimadresse unterscheidet, und nach dem Aufruf des Adresswechsel-Links ändert sich die Adresse.
Mögliche Probleme
- Fehler „pip ist kein interner Befehl“. Python wurde ohne Hinzufügen zum PATH installiert. Neu installieren mit Häkchen oder den Befehl py -m pip statt pip verwenden.
- Fehler 407 Proxy Authentication Required. Falscher Login oder falsches Passwort. Überprüfen Sie, ob beim Kopieren Leerzeichen entstanden sind.
- Timeout bei der Anfrage über den Proxy. Der Port ist falsch angegeben oder der Proxy wechselt gerade die IP. Warten Sie eine halbe Minute und wiederholen Sie.
Schritt 2: Links zu den Unternehmenseinträgen sammeln
Ziel dieser Phase: eine Datei links.json mit einer Liste von Adressen der Einträge aller Unternehmen zur gewünschten Suchanfrage in der gewünschten Stadt erhalten.
Hier werfen wir nur einmal einen Blick in die Ergebnisliste von Maps, um die Links zu entnehmen. Die Daten selbst entnehmen wir ausschließlich den Einträgen, daher benötigen wir die Liste nur als Inhaltsverzeichnis, nicht mehr.
Wie die Unternehmensliste aufgebaut ist
Wenn Sie in Maps eine Suchanfrage wie „Zahnarzt Kazan“ eingeben, erscheint links ein scrollbares Panel mit Snippets. Jedes Snippet enthält einen Link zum Eintrag. Die Liste wird portionsweise beim Scrollen nachgeladen, daher wird das Skript das Panel mit dem Mausrad drehen und nach jedem Scrollen Links sammeln, bis keine neuen mehr erscheinen.
Skript zum Sammeln der Links schreiben
Erstellen Sie die Datei collect_links.py:
from playwright.sync_api import sync_playwright
import time, random, json
from config import *
PROXY = {'server': f'http://{PROXY_HOST}:{PROXY_PORT}', 'username': PROXY_LOGIN, 'password': PROXY_PASSWORD}
QUERY = 'стоматология Казань'
MAX_SCROLLS = 40
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, proxy=PROXY)
context = browser.new_context(locale='ru-RU', viewport={'width': 1400, 'height': 900})
page = context.new_page()
page.goto('https://yandex.ru/maps/?text=' + QUERY, wait_until='domcontentloaded')
time.sleep(random.uniform(5, 8))
page.mouse.move(350, 500)
links = set()
stale = 0
for i in range(MAX_SCROLLS):
before = len(links)
page.mouse.wheel(0, random.randint(1200, 2000))
time.sleep(random.uniform(1.5, 3.5))
for a in page.query_selector_all('a[href*="/maps/org/"]'):
href = a.get_attribute('href') or ''
clean = href.split('?')[0]
if clean.startswith('/'):
clean = 'https://yandex.ru' + clean
links.add(clean)
stale = stale + 1 if len(links) == before else 0
print(f'Прокрутка {i+1}: ссылок {len(links)}')
if stale >= 4:
break
with open('links.json', 'w', encoding='utf-8') as f:
json.dump(sorted(links), f, ensure_ascii=False, indent=2)
print('Итого собрано:', len(links))
browser.close()Was hier passiert
- Die Zeile headless=False öffnet den Browser mit Fenster. Beim Debuggen ist das unerlässlich: Sie sehen mit eigenen Augen, ob die Karte geladen wurde und kein Captcha erscheint.
- page.mouse.move(350, 500) positioniert den Cursor auf dem linken Panel. Ohne dies würde das Mausrad die Karte selbst bewegen, nicht die Liste.
- Der Selektor a[href*="/maps/org/"] sucht alle Links, die das Fragment /maps/org/ enthalten. Er ist stabiler als konkrete Klassen, die Yandex alle paar Monate ändert.
- Der Zähler stale stoppt die Schleife, wenn vier aufeinanderfolgende Scrolls keine neuen Links gebracht haben. Das bedeutet, die Liste ist zu Ende.
- Die Links werden von Parametern nach dem Fragezeichen bereinigt, damit ein Unternehmen nicht zweimal in die Datei gelangt.
Führen Sie das Skript aus: python collect_links.py. Ein Browserfenster öffnet sich, die Karte mit den Ergebnissen wird geladen, das Panel beginnt zu scrollen. Im Terminal läuft der Link-Zähler. Für eine durchschnittliche Stadt werden bei einer Suchanfrage normalerweise 100 bis 400 Einträge in 2-4 Minuten gesammelt.
Tipp: Maps liefern selten mehr als 500 Ergebnisse pro Suchanfrage. Wenn Sie die gesamte Nische in einer Metropole benötigen, teilen Sie die Anfrage nach Bezirken auf: „Zahnarzt Wachitowski-Bezirk Kazan“, „Zahnarzt Sowetski-Bezirk Kazan“. Fassen Sie die Links aus verschiedenen Anfragen über ein set zusammen, wie im Code oben, Duplikate verschwinden von selbst.
Überprüfung: Im Ordner ist die Datei links.json erschienen, darin eine Liste von Adressen der Form https://yandex.ru/maps/org/Name/1234567890/. Öffnen Sie zwei oder drei Adressen manuell in einem normalen Browser und stellen Sie sicher, dass es sich um Einträge der gewünschten Unternehmen handelt.
Mögliche Probleme
- Null Links gesammelt. Wahrscheinlich hat die Seite nicht rechtzeitig geladen oder der Cursor war nicht über der Liste. Erhöhen Sie die erste Pause auf 10 Sekunden und überprüfen Sie die Mauskoordinaten: Das Panel muss sich unter dem Cursor befinden.
- Die Liste scrollt nicht, die Karte bewegt sich. Verringern oder erhöhen Sie die X-Koordinate in mouse.move, orientieren Sie sich an der Breite des Panels in Ihrem Fenster.
- Sofort ein Captcha erschienen. Wechseln Sie die IP über den Link, warten Sie eine Minute und starten Sie erneut. Wenn es sich wiederholt, versuchen Sie einen anderen Proxy-Kanal.
Schritt 3: Unternehmenseintrag parsen — Name, Adresse, Telefon, Website
Ziel dieser Phase: eine Funktion schreiben, die einen Eintrag öffnet und ein Wörterbuch mit den Hauptdaten des Unternehmens zurückgibt, und diese über alle Links aus links.json laufen lassen.
Selektoren selbst finden
Yandex benennt die Klassen im Layout regelmäßig um. Deshalb ist es wichtig, sie selbst finden zu können und sich nicht nur auf den fertigen Code zu verlassen. So geht's:
- Öffnen Sie einen beliebigen Unternehmenseintrag in einem normalen Chrome-Browser.
- Klicken Sie mit der rechten Maustaste auf die Telefonnummer des Unternehmens und wählen Sie Untersuchen (oder drücken Sie F12 und klicken Sie mit dem Auswahlwerkzeug auf das Element).
- Im geöffneten Panel sehen Sie das hervorgehobene Tag mit dem Attribut class. Zum Beispiel class="card-phones-view__phone-number". Das ist der Selektor: Im Code wird er mit einem Punkt am Anfang geschrieben.
- Wiederholen Sie dies für Name, Adresse, Website, Bewertung und Öffnungszeiten. Notieren Sie die Klassen in einem Notizblock.
Eine Klasse kann aus mehreren durch Leerzeichen getrennten Wörtern bestehen. Nehmen Sie das erste, aussagekräftigste mit doppeltem Unterstrich darin. Zum Zeitpunkt der Erstellung dieses Leitfadens sind die Selektoren aus dem Code unten aktuell, aber überprüfen Sie sie vor dem Start.
Funktion zum Parsen des Eintrags schreiben
Erstellen Sie die Datei parse_cards.py:
from playwright.sync_api import sync_playwright
import time, random, json, csv, os
from config import *
PROXY = {'server': f'http://{PROXY_HOST}:{PROXY_PORT}', 'username': PROXY_LOGIN, 'password': PROXY_PASSWORD}
OUT = 'orgs.csv'
FIELDS = ['url', 'name', 'category', 'address', 'phones', 'site', 'rating', 'reviews_count', 'hours']
def grab(page, selector):
el = page.query_selector(selector)
return el.inner_text().strip() if el else ''
def parse_card(page, url):
page.goto(url, wait_until='domcontentloaded')
time.sleep(random.uniform(3, 6))
more = page.query_selector('.card-phones-view__more')
if more:
more.click()
time.sleep(random.uniform(1, 2))
phones = [e.inner_text().strip() for e in page.query_selector_all('.card-phones-view__phone-number')]
return {
'url': url,
'name': grab(page, 'h1.orgpage-header-view__header'),
'category': grab(page, '.orgpage-categories-info-view'),
'address': grab(page, '.business-contacts-view__address'),
'phones': '; '.join(dict.fromkeys(phones)),
'site': grab(page, '.business-urls-view__text'),
'rating': grab(page, '.business-rating-badge-view__rating-text'),
'reviews_count': grab(page, '.business-header-rating-view__text'),
'hours': grab(page, '.business-working-status-view'),
}
def load_done():
if not os.path.exists(OUT):
return set()
with open(OUT, encoding='utf-8') as f:
return {row['url'] for row in csv.DictReader(f)}
links = json.load(open('links.json', encoding='utf-8'))
done = load_done()
todo = [u for u in links if u not in done]
print(f'Всего {len(links)}, осталось {len(todo)}')
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, proxy=PROXY)
page = browser.new_context(locale='ru-RU').new_page()
new_file = not os.path.exists(OUT)
with open(OUT, 'a', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=FIELDS)
if new_file:
writer.writeheader()
for n, url in enumerate(todo, 1):
try:
row = parse_card(page, url)
writer.writerow(row)
f.flush()
print(f'{n}/{len(todo)} {row["name"]} | {row["phones"]}')
except Exception as e:
print('Ошибка на', url, e)
time.sleep(random.uniform(4, 9))
browser.close()Was hier wichtig ist
- Schaltfläche „Telefon anzeigen“. In manchen Einträgen ist die vollständige Nummer hinter einer Schaltfläche verborgen. Wir suchen sie über die Klasse card-phones-view__more und klicken, wenn wir sie gefunden haben. Erst danach sammeln wir die Nummern.
- Aufzeichnung nach jedem Eintrag. Die Funktion f.flush() erzwingt das Schreiben der Daten auf die Festplatte. Wenn das Skript abstürzt, bleibt alles Gesammelte in orgs.csv erhalten.
- Fortsetzung der Arbeit. Die Funktion load_done liest die bereits gesammelten Links, und bei einem erneuten Start setzt das Skript dort fort, wo es aufgehört hat, statt von vorne zu beginnen.
- Pausen von 4-9 Sekunden zwischen den Einträgen. Das ist das Tempo eines aufmerksamen Menschen, der Informationen liest. Verringern Sie es bei den ersten Durchläufen nicht.
Führen Sie python parse_cards.py aus und beobachten Sie die ersten fünf bis zehn Einträge im Browserfenster. Sie sollten sehen, wie die Seite lädt, bei Bedarf das Telefon aufgeklappt wird und im Terminal der Name und die Nummer erscheinen.
Achtung: Wenn fünf Einträge hintereinander leere Namen zurückgegeben haben, stoppen Sie das Skript sofort mit Ctrl+C. Fast sicher hat Yandex das Layout geändert und die Selektoren sind veraltet. Finden Sie neue nach der Anleitung oben und aktualisieren Sie den Code. Weiter leere Zeilen zu sammeln ist sinnlos und erhöht nur die Last auf dem Proxy.
Tipp: Neben dem Text ist es sinnvoll, die Organisations-ID selbst zu speichern: das ist der letzte numerische Teil der URL. Damit lassen sich Datenbanken zwischen den Sammlungen leicht abgleichen und geschlossene Unternehmen nachverfolgen. Fügen Sie das Feld 'org_id': url.rstrip('/').split('/')[-1] zum Wörterbuch hinzu.
Überprüfung: Die Datei orgs.csv öffnet sich in Excel, die Spalten name, address, phones sind bei mindestens 90 Prozent der Zeilen gefüllt. Telefonnummern werden im Format +7 (843) 000-00-00 angezeigt. Die Bewertung sieht wie eine Zahl mit Komma aus, zum Beispiel 4,7.
Mögliche Probleme
- Telefonnummern leer, obwohl sie auf der Website vorhanden sind. Die Schaltfläche „Telefon anzeigen“ hat eine andere Klasse. Finden Sie sie über F12 und ersetzen Sie sie im Code.
- Kyrillisch in CSV wird als Kauderwelsch angezeigt. Excel hat die Kodierung nicht erkannt. Öffnen Sie die Datei über das Menü Daten, Aus Text/CSV und wählen Sie UTF-8, oder warten Sie Schritt 6 ab, wo wir die Daten in xlsx konvertieren.
- Das Skript hängt bei einem Eintrag. Fügen Sie den Parameter timeout=45000 in page.goto hinzu, damit nach 45 Sekunden eine Ausnahme ausgelöst wird und die Schleife weiterläuft.
Schritt 4: Rezensionen aus den Einträgen sammeln
Ziel dieser Phase: für jedes Unternehmen eine Liste von Rezensionen mit Bewertung, Datum und Text erhalten und in einer separaten Datei reviews.csv speichern.
Wo die Rezensionen zu finden sind
Jeder Eintrag hat einen Reiter „Rezensionen“ mit einer Adresse der Form https://yandex.ru/maps/org/Name/ID/reviews/. Die Rezensionen werden dort beim Scrollen portionsweise nachgeladen, wie die Unternehmensliste im zweiten Schritt. Standardmäßig sind sie nach Aktualität sortiert, die neuesten erhält man, indem man die Sortierung auf „Nach Neuheit“ umstellt.
Funktion zum Sammeln der Rezensionen schreiben
Erstellen Sie die Datei parse_reviews.py. Die Grundlage ist dieselbe wie im vorherigen Schritt, daher zeigen wir nur die Funktion und die Schleife:
def parse_reviews(page, url, max_scrolls=15):
page.goto(url.rstrip('/') + '/reviews/', wait_until='domcontentloaded')
time.sleep(random.uniform(3, 6))
page.mouse.move(350, 600)
seen = 0
for _ in range(max_scrolls):
page.mouse.wheel(0, random.randint(1500, 2500))
time.sleep(random.uniform(1.5, 3))
cards = page.query_selector_all('.business-review-view')
if len(cards) == seen:
break
seen = len(cards)
result = []
for c in page.query_selector_all('.business-review-view'):
def sub(sel):
el = c.query_selector(sel)
return el.inner_text().strip() if el else ''
stars = c.query_selector_all('.business-rating-badge-view__star._full')
result.append({
'org_url': url,
'author': sub('.business-review-view__author-name'),
'date': sub('.business-review-view__date'),
'stars': len(stars),
'text': sub('.business-review-view__body-text'),
})
return resultRufen Sie in der Schleife über die Links parse_reviews statt parse_card auf und schreiben Sie jedes Element der Liste als separate Zeile in reviews.csv mit den Feldern org_url, author, date, stars, text. Die Logik zum Fortsetzen und die Aufzeichnung nach jedem Unternehmen bleiben gleich.
Details erklärt
- Begrenzung max_scrolls=15. Bei beliebten Einrichtungen gibt es zwei- bis dreitausend Rezensionen. Sie alle zu sammeln ist selten nötig, kostet aber viel Zeit und Anfragen. Fünfzehn Scrolls reichen normalerweise für 100-150 der neuesten Rezensionen.
- Bewertung über Sterne. Die Punktzahl in der Rezension steht nicht als Text, sondern ist als Sterne dargestellt. Wir zählen die Elemente mit dem Modifikator _full, also die ausgefüllten Sterne.
- Lange Rezensionen. Ein Teil der Texte ist eingeklappt und erfordert das Klicken auf „Mehr“. Wenn Sie den vollständigen Text benötigen, klicken Sie vor dem Sammeln alle Schaltflächen mit der Klasse business-review-view__expand innerhalb des Eintrags.
Achtung: Die Namen der Rezensionsautoren sind Nutzerdaten, nicht Unternehmensdaten. Wenn Ihre Aufgabe die Stimmungsanalyse oder das Auffinden typischer Beschwerden ist, benötigen Sie das Feld author nicht. Sammeln Sie es nicht ohne Ziel, so ersparen Sie sich unnötige Fragen zum Föderalen Gesetz Nr. 152. Falls das Feld dennoch benötigt wird, speichern Sie die Datei lokal und geben Sie sie nicht an Dritte weiter.
Tipp: Starten Sie die Sammlung der Rezensionen nicht für alle Unternehmen, sondern für eine gefilterte Liste: zum Beispiel nur mit einer Bewertung unter 4,0 oder nur bei direkten Wettbewerbern. So reduzieren Sie das Anfragevolumen um ein Vielfaches, ohne den Wert der Daten zu verlieren.
Überprüfung: In reviews.csv hat jedes Unternehmen 20 bis 150 Zeilen, die Spalte stars enthält Zahlen von 1 bis 5, im Text steht sinnvoller russischer Text. Das Datum sieht wie „15. Januar“ oder „3. März 2026“ aus.
Mögliche Probleme
- Null Rezensionen gefunden. Überprüfen Sie, ob die URL auf /reviews/ endet und das Rezensionspanel beim Scrollen unter dem Cursor liegt.
- Bei allen Rezensionen ist stars gleich 0. Die Klasse des ausgefüllten Sterns hat sich geändert. Finden Sie sie über F12, indem Sie auf den Stern klicken.
- Rezensionen werden dupliziert. Das Panel wurde nicht vollständig gescrollt und ein Block wurde zweimal gezählt. Entfernen Sie Duplikate im sechsten Schritt anhand des Paares author plus text.
Schritt 5: IP-Rotation und Schutz vor Sperren einrichten
Ziel dieser Phase: dem Parser beibringen, sich wie ein sorgfältiger Nutzer zu verhalten: die IP nach Plan wechseln, Captchas erkennen und das Tempo automatisch drosseln, statt in eine Sperre zu laufen.
Warum überhaupt Bans entstehen
Yandex verbietet nicht, Einträge anzusehen, aber überwacht Anomalien: Hunderte Seiten pro Minute von einer Adresse, identische Intervalle zwischen Anfragen, fehlende Mausbewegungen, leere Cookies. Wenn der Verdacht wächst, erscheint die SmartCaptcha-Seite, und bei Beharrlichkeit eine temporäre Sperre für die IP. Unsere Strategie besteht nicht darin, den Schutz zu „durchbrechen“, sondern keine Anlässe zu geben, ihn zu aktivieren.
Drei Regeln eines ruhigen Yandex-Maps-Parsers
- Menschliches Tempo. Nicht mehr als 8-12 Einträge pro Minute pro IP. Zufällige Pausen, keine festen.
- Regelmäßiger IP-Wechsel. Alle 25-40 Einträge oder alle 10-15 Minuten rufen wir den Adresswechsel-Link auf. Der mobile Proxy erhält in Sekunden eine neue IP des Anbieters, und die Anfragehistorie wird aus Sicht der Website „zurückgesetzt“.
- Sofortiger Rückzug bei Captcha. Wenn wir eine Überprüfung sehen, versuchen wir nicht, sie zu lösen, sondern machen eine Pause von 2-3 Minuten, wechseln die IP und fahren mit demselben Eintrag in einem neuen Browserkontext fort.
Rotation in den Code einfügen
Fügen Sie in parse_cards.py und parse_reviews.py die folgenden Funktionen ein und rufen Sie sie in der Hauptschleife auf:
import requests
def change_ip():
try:
r = requests.get(CHANGE_IP_URL, timeout=30)
print('Смена IP:', r.status_code)
except Exception as e:
print('Не удалось сменить IP:', e)
time.sleep(IP_CHANGE_WAIT)
def is_captcha(page):
if 'showcaptcha' in page.url or 'checkcaptcha' in page.url:
return True
return page.query_selector('.CheckboxCaptcha') is not None
def new_page(browser):
ctx = browser.new_context(locale='ru-RU', viewport={'width': random.choice([1366, 1440, 1536]), 'height': 900})
return ctx.new_page()Und die Hauptschleife sieht so aus:
page = new_page(browser)
since_change = 0
for n, url in enumerate(todo, 1):
if since_change >= random.randint(25, 40):
page.context.close()
change_ip()
page = new_page(browser)
since_change = 0
row = parse_card(page, url)
if is_captcha(page):
print('Капча! Пауза и смена IP')
page.context.close()
time.sleep(random.uniform(120, 180))
change_ip()
page = new_page(browser)
row = parse_card(page, url)
writer.writerow(row)
f.flush()
since_change += 1
time.sleep(random.uniform(4, 9))Was hier wichtig zu verstehen ist
- Neuer Kontext zusammen mit neuer IP. Durch das Schließen des Kontexts setzen wir Cookies und lokalen Speicher zurück. Ein Adresswechsel ohne Zurücksetzen der Cookies ist sinnlos: Die Website erkennt Sie weiterhin an der Sitzung.
- Die Variable IP_CHANGE_WAIT in config.py ist die im ersten Schritt gemessene Zeit, normalerweise 15-30 Sekunden. Weniger darf es nicht sein: Der Browser würde die Seite über die alte Adresse öffnen.
- Zufällige Fenstergröße sorgt für mehr Vielfalt im Browser-Fingerabdruck. Das ist eine sanfte Maßnahme, aber sie ist kostenlos.
- Mobile Proxys mit Rotation über einen Link sind hier praktischer als alle anderen: Sie wechseln nicht manuell zwischen Dutzenden Adressen, sondern rufen einfach eine URL auf.
Tipp: Führen Sie ein einfaches Log: Schreiben Sie in eine Datei die Zeit, die Nummer des Eintrags und das Ereignis (Erfolg, Captcha, IP-Wechsel). Nach einer Woche sehen Sie im Log genau, bei welchem Tempo gar kein Captcha erscheint, und können die Pausen an Ihren Proxy-Kanal anpassen.
Überprüfung: Nach einer Stunde ununterbrochener Arbeit hat das Skript 400-600 Einträge gesammelt, im Terminal erschienen nicht mehr als ein oder zwei Captcha-Meldungen, nach jeder wurde die Sammlung automatisch fortgesetzt. Die IP über den Proxy hat sich mindestens zehnmal geändert (das ist an den Zeilen „Смена IP: 200“ zu erkennen).
Mögliche Probleme
- Captcha erscheint alle 10 Einträge. Das Tempo ist zu hoch für Ihren Kanal. Erhöhen Sie die Pausen auf 8-15 Sekunden und wechseln Sie die IP alle 15 Einträge.
- Nach dem IP-Wechsel laden die Seiten nicht. Erhöhen Sie IP_CHANGE_WAIT: Der Anbieter hat noch keine neue Adresse vergeben.
- Der IP-Wechsel-Link gibt einen Fehler über zu häufige Aufrufe zurück. Bei den meisten Tarifen gibt es ein Mindestintervall zwischen den Wechseln, normalerweise ein bis zwei Minuten. Wechseln Sie die IP nicht häufiger.
Schritt 6: Daten bereinigen und in Excel speichern
Ziel dieser Phase: die rohen CSVs in saubere Excel-Tabellen ohne Duplikate, mit normalisierten Telefonnummern und numerischer Bewertung verwandeln.
Bereinigungsskript schreiben
Erstellen Sie die Datei clean_export.py:
import pandas as pd
def norm_phone(value):
out = []
for raw in str(value).split(';'):
digits = ''.join(ch for ch in raw if ch.isdigit())
if len(digits) == 11 and digits[0] in '78':
out.append('+7' + digits[1:])
elif len(digits) == 10:
out.append('+7' + digits)
return '; '.join(dict.fromkeys(out))
orgs = pd.read_csv('orgs.csv', encoding='utf-8')
orgs = orgs.drop_duplicates(subset='url')
orgs['phones'] = orgs['phones'].fillna('').apply(norm_phone)
orgs['rating'] = pd.to_numeric(orgs['rating'].astype(str).str.replace(',', '.'), errors='coerce')
orgs['reviews_count'] = pd.to_numeric(orgs['reviews_count'].astype(str).str.extract('(\d+)')[0], errors='coerce')
orgs = orgs.sort_values('rating', ascending=False)
reviews = pd.read_csv('reviews.csv', encoding='utf-8')
reviews = reviews.drop_duplicates(subset=['org_url', 'author', 'text'])
with pd.ExcelWriter('yandex_maps_result.xlsx', engine='openpyxl') as w:
orgs.to_excel(w, sheet_name='Организации', index=False)
reviews.to_excel(w, sheet_name='Отзывы', index=False)
print('Организаций:', len(orgs), 'Отзывов:', len(reviews))In der Zeile zum Extrahieren der Anzahl der Rezensionen wird ein regulärer Ausdruck mit einem Backslash und dem Buchstaben d in Klammern verwendet: Er zieht die erste Zahl aus einem Text wie „312 отзывов“ heraus. Kopieren Sie ihn sorgfältig.
Was das Skript tut
- Entfernt Wiederholungen von Unternehmen anhand der URL.
- Bringt alle Telefonnummern in das Format +7XXXXXXXXXX, entfernt Klammern, Leerzeichen und Bindestriche. Dieses Format ist praktisch für CRM und den Abgleich von Datenbanken.
- Ersetzt das Komma durch einen Punkt in der Bewertung, damit Excel sie als Zahl erkennt und sortieren kann.
- Extrahiert die Anzahl der Rezensionen aus der Textzeile.
- Entfernt Duplikate von Rezensionen und schreibt zwei Blätter in eine xlsx-Datei.
Führen Sie python clean_export.py aus und öffnen Sie yandex_maps_result.xlsx. Auf dem ersten Blatt sind die Unternehmen nach Bewertung sortiert, die Telefonnummern einheitlich, auf dem zweiten Blatt befinden sich die Rezensionen mit Zuordnung zum Unternehmen über die Spalte org_url.
Tipp: Fügen Sie dem Skript eine Spalte „Sammlungsdatum“ mit dem aktuellen Datum hinzu. Wiederholen Sie die Sammlung nach einem Monat und vergleichen Sie die Tabellen mit der merge-Funktion in pandas: Sie sehen neue Unternehmen, geschlossene Standorte und Änderungen der Bewertungen von Wettbewerbern. Das ist bereits ein vollwertiges Marktmonitoring.
Überprüfung: Die xlsx-Datei öffnet sich ohne Warnungen, Kyrillisch ist lesbar, die Spalte rating lässt sich als Zahl sortieren, in der Spalte phones gibt es keine Klammern und Leerzeichen, die Anzahl der Zeilen auf dem Blatt „Организации“ stimmt mit der Anzahl der eindeutigen Links in links.json minus Fehler überein.
Ergebnis überprüfen: Checkliste für einen fertigen Parser
Gehen Sie die Liste durch. Wenn Sie jeden Punkt mit „Ja“ beantwortet haben, ist der Yandex-Maps-Parser für den regelmäßigen Einsatz bereit.
Checkliste
- check_proxy.py zeigt eine IP eines Mobilfunkanbieters, die sich von Ihrer Heimadresse unterscheidet.
- collect_links.py sammelt bei einer durchschnittlichen Anfrage mehr als 50 Links und stoppt von selbst.
- parse_cards.py füllt Name, Adresse und Telefon bei mindestens 90 Prozent der Einträge.
- Die Schaltfläche „Telefon anzeigen“ wird automatisch aufgeklappt.
- parse_reviews.py liefert Rezensionen mit einer Bewertung von 1 bis 5.
- Bei einem Captcha macht das Skript eine Pause, wechselt die IP und fährt ohne Ihr Eingreifen fort.
- Nach einem Notstopp setzt ein erneuter Start dort fort, wo die Unterbrechung war.
- clean_export.py erstellt eine xlsx mit zwei Blättern und normalisierten Telefonnummern.
Wie man alles komplett testet
- Nehmen Sie eine kleine Anfrage, bei der es in der Stadt 30-60 Unternehmen gibt, zum Beispiel „Reifenservice“ in einer Kreisstadt.
- Führen Sie alle Skripte nacheinander aus und messen Sie die Zeit. Für 50 Einträge mit Rezensionen sollten 15-25 Minuten vergehen.
- Wählen Sie fünf zufällige Unternehmen aus der Tabelle und vergleichen Sie Telefonnummern und Adressen manuell mit den Einträgen.
- Stoppen Sie parse_cards.py in der Mitte mit Ctrl+C und starten Sie erneut. Stellen Sie sicher, dass der Zähler „осталось“ sich verringert und nicht zurückgesetzt hat.
Kennzahlen einer erfolgreichen Ausführung
- Datengenauigkeit bei manueller Überprüfung: 100 Prozent Übereinstimmung bei Telefonnummern und Adressen.
- Anteil leerer Namen: weniger als 3 Prozent.
- Captcha-Häufigkeit: nicht mehr als eines pro 200-300 Einträge.
- Geschwindigkeit: 400-600 Einträge pro Stunde auf einem Proxy-Kanal bei sicherem Tempo.
Typische Fehler und ihre Lösungen
Wir haben die Probleme zusammengestellt, mit denen fast alle konfrontiert werden, die zum ersten Mal einen Yandex-Maps-Parser schreiben, und die Wege, sie zu beheben.
Leere Felder bei den meisten Einträgen
Ursache: Yandex hat das Layout aktualisiert, die Klassen der Elemente haben sich geändert. Lösung: Öffnen Sie den Eintrag in Chrome, drücken Sie F12, finden Sie die neuen Klassen und ersetzen Sie sie in der Funktion parse_card. Halten Sie die Selektoren in einem einzigen Wörterbuch am Anfang der Datei, um nur eine Stelle bearbeiten zu müssen.
Captcha erscheint bereits auf der ersten Seite
Ursache: Die Proxy-IP ist bereits von früherer Aktivität „ermüdet“ oder der Browser startet mit verdächtigen Parametern. Lösung: Wechseln Sie die IP vor dem Start, stellen Sie sicher, dass locale='ru-RU' gesetzt ist, und verwenden Sie bei den ersten Durchläufen nicht den Headless-Modus: Er liefert mehr Automatisierungssignale.
Das Scrollen bewegt die Karte statt des Panels
Ursache: Der Mauszeiger befindet sich außerhalb des linken Panels. Lösung: Passen Sie die Koordinaten von page.mouse.move an Ihre Fenstergröße an. Bei einer Breite von 1400 Pixeln belegt das Panel etwa die ersten 450 Pixel horizontal.
Es werden immer dieselben 20 Unternehmen gesammelt
Ursache: Das Panel scrollt nicht bis zum Ende, der Zähler stale wird zu früh ausgelöst. Lösung: Erhöhen Sie die Pause nach dem Scrollen auf 3-4 Sekunden und die Schwelle stale auf 6, Maps laden die nächste Portion manchmal langsam nach.
Telefonnummern im Browser sichtbar, aber in der Tabelle leer
Ursache: Die Nummer erscheint erst nach dem Klick, und das Skript sammelt die Daten vor dessen Abschluss, oder die Schaltfläche hat eine andere Klasse. Lösung: Erhöhen Sie die Pause nach dem Klick auf 2-3 Sekunden und überprüfen Sie die Klasse der Schaltfläche.
Fehler Target closed oder Browser has been closed
Ursache: Sie haben den Kontext beim IP-Wechsel geschlossen, verwenden aber weiterhin das alte page-Objekt. Lösung: Stellen Sie sicher, dass nach jedem page.context.close() die Variable page über new_page(browser) neu zugewiesen wird, wie im Beispiel von Schritt 5.
Nach dem IP-Wechsel laden die Seiten endlos
Ursache: Der Anbieter hat noch keine neue Adresse vergeben, der Proxy befindet sich im Übergangszustand. Lösung: Erhöhen Sie IP_CHANGE_WAIT auf 30-40 Sekunden und fügen Sie einen timeout in page.goto hinzu, damit ein Hänger die Schleife nicht blockiert.
Excel öffnet CSV mit Kauderwelsch
Ursache: Excel erkennt UTF-8 ohne BOM-Markierung nicht. Lösung: Verwenden Sie clean_export.py und arbeiten Sie mit xlsx, oder geben Sie beim Schreiben von CSV encoding='utf-8-sig' an.
Zusätzliche Möglichkeiten für Fortgeschrittene
Der Basis-Parser löst bereits 90 Prozent der Aufgaben. Wenn Sie mehr Geschwindigkeit und Daten wünschen, hier die nächsten Schritte.
Netzwerkantworten abfangen statt Layout zu parsen
Maps laden die Daten der Einträge in Form von JSON in separaten Anfragen. Playwright kann sich über page.on('response', handler) darauf abonnieren. Überprüfen Sie im Handler, ob response.url das Fragment /maps/api/ enthält, und speichern Sie response.json(). Vorteil der Methode: Die Daten sind strukturiert und hängen nicht von den Layout-Klassen ab. Nachteil: Die internen Adressen ändern sich ohne Vorwarnung, und das Parsen des verschachtelten JSON ist schwieriger als das Lesen von Text von der Seite. Der Ansatz lässt sich gut mit dem Hauptverfahren kombinieren: Wenn eine JSON-Antwort kommt, nehmen wir sie, andernfalls fallen wir auf das Parsen von HTML zurück.
Parallele Arbeit mit mehreren Proxy-Kanälen
Ein mobiler Proxy liefert bei sicherem Tempo 400-600 Einträge pro Stunde. Wenn es schneller gehen muss, kaufen Sie zwei oder drei Kanäle und starten Sie je einen separaten Prozess pro Kanal, indem Sie links.json in gleiche Teile aufteilen. Starten Sie nicht mehrere Browser über einen Kanal: Das Gesamttempo pro IP steigt und das Captcha kehrt zurück. Für die Orchestrierung eignet sich ein einfaches Startskript mit subprocess oder die Bibliothek asyncio mit async_playwright, wobei jeder Worker seinen eigenen Kontext und seinen eigenen Proxy im Parameter proxy von new_context erhält.
Änderungen überwachen
Speichern Sie die Ergebnisse jeder Sammlung in einer separaten Datei mit Datum und vergleichen Sie sie anhand der org_id. Neu aufgetauchte Identifikatoren sind neue Marktteilnehmer, verschwundene sind geschlossene, Änderungen von rating und reviews_count zeigen die Reputationsdynamik. Richten Sie einen Start alle zwei Wochen über den Windows-Aufgabenplaner oder cron ein, und Sie haben eine lebendige Karte der Nische.
Felder erweitern
In den Einträgen gibt es weitere nützliche Blöcke: eine Liste der Dienstleistungen mit Preisen, Links zu sozialen Netzwerken, das Merkmal „Verifiziertes Unternehmen“, die Anzahl der Fotos, die nächste Metrostation. Jedes Feld wird nach demselben Schema hinzugefügt: die Klasse über F12 finden, grab zum Wörterbuch hinzufügen. Besonders wertvoll ist der Preisblock für Affiliate-Marketer, die den durchschnittlichen Check einer Nische bewerten.
Rezensionen analysieren
Die gesammelten Texte eignen sich hervorragend für eine einfache Analyse: Zählen Sie die Worthäufigkeit unter Rezensionen mit ein oder zwei Sternen und Sie erhalten eine Liste der Hauptbeschwerden von Kunden über Wettbewerber. Dafür reichen pandas und Counter aus der Standardbibliothek. Eine fortgeschrittene Variante ist, die Texte durch ein Sprachmodell zu schicken, um sie nach Themen zu klassifizieren: Preis, Qualität, Service, Wartezeit.
Offizielle API als Alternative
Für große kommerzielle Projekte ziehen Sie die Yandex-API für die Unternehmenssuche in Betracht. Sie liefert Name, Adresse, Telefon und Kategorien in strukturierter Form und birgt überhaupt keine Sperrrisiken. Rezensionen gibt es darin nicht, die Limits sind kostenpflichtig, aber für die Sammlung einer Kontaktdatenbank ist dies der sauberste Weg. Der Card-Parser bleibt in diesem Fall ein Instrument für Rezensionen und Felder, die in der API fehlen.
FAQ: Häufige Fragen zum Parsen von Yandex Maps
Ist es legal, Telefonnummern von Unternehmen von Yandex Maps zu sammeln?
Die Kontaktdaten von Firmen werden von den Organisationen selbst öffentlich gemacht und sind keine personenbezogenen Daten. Das Sammeln für die eigene Analyse ist zulässig. Die Verwendung dieser Nummern für Massenanrufe und Aussendungen ohne Einwilligung verstößt jedoch gegen das Werbegesetz. Denken Sie auch an die Einschränkungen der Nutzungsbedingungen von Yandex für die automatisierte Sammlung und halten Sie die Last minimal.
Warum kann man nicht einfach normale requests-Anfragen ohne Browser verwenden?
Maps werden vollständig durch JavaScript-Code gezeichnet. Der Server liefert fast leeres HTML, und die Daten werden später nachgeladen. requests würde nur das Gerüst ohne Telefonnummern und Adressen erhalten. Deshalb ist Playwright mit echtem Chromium erforderlich.
Muss man unbedingt mobile Proxys verwenden, kann man von der Heim-IP parsen?
Technisch gesehen werden die ersten 50-100 Einträge auch so gesammelt. Aber dann erscheint ein Captcha, und die Heim-IP fällt für mehrere Stunden unter Einschränkungen, und Sie können Yandex nicht mehr normal nutzen. Mobile Proxys lösen das Problem auf zwei Wegen: Die Adresse eines Mobilfunkanbieters erweckt von vornherein mehr Vertrauen, und die Rotation über einen Link ermöglicht es, die Last zwischen Adressen zu verteilen, ohne die Sammlung zu unterbrechen.
Wie viele Einträge kann man pro Tag mit einem Proxy sammeln?
Bei sicherem Tempo von 8-12 Einträgen pro Minute mit Pausen und IP-Wechsel alle 30 Einträge — etwa 5-8 Tausend pro Tag ununterbrochener Arbeit. Zusammen mit Rezensionen verringert sich das Volumen um das Zwei- bis Dreifache, weil jede Rezensionsseite Scrollen erfordert.
Was tun, wenn Yandex das Layout ändert und der Parser kaputtgeht?
Das ist eine normale Situation, sie tritt mehrmals im Jahr auf. Öffnen Sie den Eintrag, drücken Sie F12, finden Sie die neuen Klassen der benötigten Elemente und ersetzen Sie sie im Code. Das dauert 10-15 Minuten. Um den Prozess zu vereinfachen, halten Sie alle Selektoren in einem einzigen Wörterbuch am Anfang der Datei.
Wie sammle ich Unternehmen in der ganzen Region statt in einer Stadt?
Erstellen Sie eine Liste von Orten und führen Sie collect_links.py in einer Schleife aus, wobei Sie den Namen in QUERY einsetzen. Fassen Sie die Links in einem set zusammen. Für große Städte teilen Sie zusätzlich nach Bezirken auf, da eine Anfrage selten mehr als 500 Ergebnisse liefert.
Kann man den Parser im Hintergrund ohne Browserfenster laufen lassen?
Ja, setzen Sie headless=True. Tun Sie das aber erst, nachdem Sie die Selektoren debuggt und sichergestellt haben, dass kein Captcha erscheint. Im Modus ohne Fenster ist ein Problem schwerer zu bemerken, und einige Automatisierungssignale treten stärker auf. Kompromiss: headless=True plus einen Screenshot der Seite bei jedem Fehler über page.screenshot(path='error.png').
Wie erkenne ich, dass das Skript ein Captcha erhalten hat, wenn ich nicht auf den Bildschirm schaue?
Die Funktion is_captcha aus Schritt 5 überprüft die Seitenadresse und das Vorhandensein des Überprüfungsblocks. Fügen Sie eine Benachrichtigung an sich selbst hinzu, zum Beispiel einen Eintrag in eine Logdatei oder eine Nachricht in einen Messenger über einen Bot, und Sie erfahren sofort von dem Problem.
Es werden nicht alle Rezensionen gesammelt, nur die letzten hundert. Wie bekomme ich mehr?
Erhöhen Sie max_scrolls in parse_reviews auf 50-100. Beachten Sie, dass jedes Scrollen eine zusätzliche Anfrage an den Server bedeutet, daher dauert die Sammlung für Unternehmen mit Tausenden von Rezensionen mehrere Minuten und erfordert einen häufigeren IP-Wechsel.
Was ist an dieser Methode besser als an fertigen Scraping-Diensten?
Sie kontrollieren vollständig die Felder, das Tempo und die Aktualität der Daten, zahlen nicht pro Zeile und hängen nicht vom Aktualisierungsplan anderer ab. Fertige Dienste sind praktisch für eine einmalige Aufgabe mit ein paar hundert Einträgen, aber ein eigener Yandex-Maps-Parser amortisiert sich bereits bei der zweiten Sammlung.
Fazit
Fassen wir zusammen. Sie haben Python und Playwright installiert, einen mobilen Proxy angeschlossen und den IP-Wechsel überprüft. Sie haben Links zu den Unternehmenseinträgen nach Suchanfrage und Stadt gesammelt. Sie haben eine Funktion geschrieben, die jeden Eintrag öffnet, das versteckte Telefon aufklappt und Name, Adresse, Website, Bewertung und Öffnungszeiten entnimmt. Sie haben das Sammeln von Rezensionen mit Bewertungen hinzugefügt. Sie haben dem Parser beigebracht, die IP nach Plan zu wechseln und auf Captchas korrekt zu reagieren. Schließlich haben Sie die Daten bereinigt und ein sauberes Excel mit zwei Blättern erhalten.
Das Wichtigste, was man sich merken sollte: Die Stabilität eines Yandex-Maps-Parsers beruht nicht auf Tricks, sondern auf drei Dingen — menschlichem Tempo, regelmäßiger Rotation von Adressen über mobile Proxys und der Bereitschaft, beim ersten Signal anzuhalten. Ein Skript, das die Ressource respektiert, läuft monatelang ohne Eingreifen.
Was als Nächstes zu tun ist
- Starten Sie die erste vollständige Sammlung für Ihre Nische und überprüfen Sie fünf bis zehn Einträge manuell.
- Legen Sie die Sammlung alle zwei Wochen auf einen Zeitplan und beginnen Sie, die Änderungshistorie anzusammeln.
- Probieren Sie das Abfangen von JSON-Antworten aus dem Fortgeschrittenen-Block, um weniger vom Layout abhängig zu sein.
- Wenn die Volumen wachsen, fügen Sie einen zweiten Proxy-Kanal hinzu und parallelisieren Sie die Arbeit.
Wo man sich weiterentwickeln kann
Der nächste logische Schritt ist die automatische Analyse der gesammelten Rezensionen und die Verknüpfung der Tabelle mit Ihrem CRM oder Werbekonto. Und wenn Sie mit mehreren Plattformen arbeiten, lässt sich derselbe Ansatz mit Playwright und mobilen Proxys auf jede Website mit dynamischem Laden übertragen. Die Prinzipien sind dieselben, nur die Selektoren ändern sich. Viel Erfolg beim Sammeln und saubere Daten!