SuperPages ist eines der größten Online-Unternehmensverzeichnisse in den USA, mit Millionen von Unternehmen nach Branche und Standort indexiert. Jedes Listing enthält die Art strukturierter öffentlicher Details, die Vertriebs- und Marketingteams für eine Interessentenliste benötigen: einen Firmennamen, die Kategorie, unter der es eingetragen ist, eine Straßenadresse, eine öffentliche Telefonnummer und oft einen Link zur eigenen Website des Unternehmens. Für den Aufbau eines regionalen Datensatzes von Dienstleistungsanbietern oder die Vorbefüllung einer B2B-Outreach-Kampagne sind diese öffentlichen Verzeichnisdaten genau das Rohmaterial, das Sie benötigen.
Diese Anleitung zeigt Ihnen, wie Sie SuperPages-Unternehmenslistings mit Python auf zuverlässige Weise scrapen. Sie rufen gerenderte Suchergebnisseiten über die Crawling API ab, parsen jedes Ergebnis mit BeautifulSoup, um Name, Kategorie, Adresse, Telefon, Website und den Link zur Detailseite zu extrahieren, gehen dann durch die Paginierung, um einen vollständigen Ergebnissatz abzudecken, und exportieren die Datensätze in JSON oder CSV. Alles hier bleibt auf öffentliche Unternehmensverzeichnisdaten beschränkt, und der Abschnitt zur Rechtmäßigkeit am Ende behandelt die Verpflichtungen, die an B2B-Lead-Daten geknüpft sind, also lesen Sie diesen vor jedem größeren Einsatz.
Was Sie bauen werden
Ein kleiner Python-Scraper, der eine Suchanfrage und einen Standort entgegennimmt, die gerenderte SuperPages-Suchergebnisseite über die Crawling API abruft und für jedes Unternehmen auf der Seite einen strukturierten Datensatz extrahiert. Das laufende Beispiel sind "Home Services"-Unternehmen in "Los Angeles, CA", und für jedes Listing werden folgende Felder extrahiert:
- Unternehmensname die primäre Bezeichnung, nach der Sie Leads gruppieren.
- Kategorie die Branche, unter der das Listing eingetragen ist, zur Segmentierung von Leads.
- Adresse die öffentliche Straßenadresse, einschließlich Stadt, Bundesstaat und Postleitzahl.
- Telefon die öffentliche Kontaktnummer, die auf der Listing-Karte angezeigt wird.
- Website der Link zur eigenen Website des Unternehmens, wenn eine eingetragen ist.
- Link zur Detailseite die URL der dedizierten SuperPages-Seite des Unternehmens.
Warum eine einfache Anfrage bei SuperPages fehlschlägt
Sie können eine SuperPages-Such-URL mit der requests-Bibliothek treffen und an einem guten Tag HTML zurückbekommen. Das Problem tritt bei Volumen auf. SuperPages setzt Anti-Scraping-Abwehrmechanismen ein: Es limitiert die Rate nach IP, stellt CAPTCHAs für Traffic bereit, der automatisiert wirkt, und blockiert Rechenzentrumsadressen, die Seiten in einem engen, maschinenartigen Muster anfordern. Eine einzelne Anfrage von Ihrem Laptop könnte erfolgreich sein; einige Hundert von derselben IP werden es nicht.
Ein Scraper, der die Aufgabe tatsächlich abschließt, braucht also Anfragen, die wie ein echter Besucher von einer vertrauenswürdigen IP aussehen. Sie können das selbst mit einem Pool rotierender Residential-Proxies und der Infrastruktur aufbauen, diesen Pool in Schuss zu halten, aber die Wartung dieses Stacks ist der Großteil der Arbeit. Die Crawling API fältelt das in einem einzigen Aufruf zusammen: Sie senden ihr die URL, sie leitet die Anfrage serverseitig über Residential-IPs weiter und handhabt die Anti-Bot-Schicht, und gibt Ihnen das HTML zum Parsen zurück.
Crawlbase bietet zwei Token-Typen an. Das normale Token ruft statisches HTML ab; das JavaScript (JS) Token rendert die Seite zuerst in einem echten Browser. SuperPages liefert seine Listing-Daten im initialen HTML, also ist das normale Token hier die richtige Wahl und hält jede Anfrage günstiger. Greifen Sie zum JS-Token nur dann, wenn ein Ziel beginnt, Listings clientseitig zu rendern.
Voraussetzungen
Einige Dinge zuerst in Ordnung zu bringen. Keines davon nimmt lange.
Grundlegende Python-Kenntnisse. Sie sollten sich damit auskennen, ein Skript auszuführen und Pakete mit pip zu installieren. Wenn Selektoren neu für Sie sind, deckt der Primer zum Verwenden von BeautifulSoup in Python die Parsing-Seite ausführlich ab.
Python 3.8 oder höher. Bestätigen Sie mit python --version. Falls nicht vorhanden, installieren Sie es von python.org oder über eine Distribution wie Anaconda.
Ein Crawlbase-Konto und Token. Registrieren Sie sich, öffnen Sie Ihr Dashboard und kopieren Sie Ihr normales Token von der Account-Docs-Seite. Sie erhalten bis zu 20.000 kostenlose Anfragen und keine Karte ist erforderlich. Behandeln Sie das Token wie ein Passwort und halten Sie es aus der Versionskontrolle heraus.
Projekt einrichten
Erstellen Sie eine virtuelle Umgebung, damit die Abhängigkeiten isoliert bleiben, und installieren Sie dann die beiden Bibliotheken, die der Scraper benötigt.
python --version python -m venv superpages_env source superpages_env/bin/activate pip install crawlbase beautifulsoup4
Aktivieren Sie unter Windows mit superpages_env\Scripts\activate anstatt der source-Zeile. Zwei Abhängigkeiten erledigen die Arbeit: crawlbase ist der offizielle Client für die Crawling API, und beautifulsoup4 parst das zurückgegebene HTML, damit Sie jedes Feld per CSS-Selektor extrahieren können.
Schritt 1: Eine gerenderte Suchseite abrufen
Beginnen Sie damit, eine Ergebnisseite zurückzubekommen. Erstellen Sie die Such-URL aus Ihrer Anfrage und Ihrem Standort, importieren Sie die CrawlingAPI-Klasse, initialisieren Sie sie mit Ihrem Token und fordern Sie die URL an. Die Statusprüfung vor dem Parsen hält Fehler laut statt still.
from urllib.parse import urlencode from crawlbase import CrawlingAPI api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def build_url(query, location, page=1): base = "https://www.superpages.com/search?" params = {"search_terms": query, "geo_location_terms": location, "page": page} return base + urlencode(params) def crawl(page_url): response = api.get(page_url) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Request failed: {response['headers']['cb_status']}") return None if __name__ == "__main__": url = build_url("Home Services", "Los Angeles, CA") html = crawl(url) print(html[:500] if html else "No HTML returned")
Beachten Sie, dass die Statusprüfung cb_status (legacy pc_status) aus den Antwort-Headern liest, was der Crawlbase-Status für die Anfrage ist, unabhängig vom Upstream-HTTP-Code. Führen Sie das Skript mit python scraper.py aus, und Sie sollten echtes Ergebnis-Markup anstelle einer Challenge-Seite sehen. Das bestätigt, dass der Abruf-Pfad funktioniert, bevor Sie einen einzigen Selektor schreiben.
SuperPages limitiert die Rate nach IP und fordert Scraper-ähnlichen Traffic heraus, genau die Hürde, die Sie gerade den Abruf-Schritt motiviert hat. Die Crawling API leitet jede Anfrage serverseitig über rotierende Residential-IPs weiter, handhabt CAPTCHAs und Blockierungen und gibt parsefreies HTML zurück, sodass Sie sich das Betreiben einer eigenen Headless-Browser-Flotte und eines Proxy-Pools sparen. Testen Sie es kostenlos auf einer öffentlichen Suchseite.
Schritt 2: Listings mit BeautifulSoup parsen
Mit einer Ergebnisseite zur Hand laden Sie sie in BeautifulSoup und gehen die Ergebniskarten durch. Jedes Unternehmen ist eine in sich geschlossene Karte unter einem vorhersehbaren Container, und darin ordnen sich Name, Adresse, Telefon, Website und der Link zur Detailseite eigenen Selektoren zu. Jedes Feld defensiv zu lesen und einen leeren String zurückzugeben, wenn ein Element fehlt, verhindert, dass ein fehlender Wert den Lauf zum Absturz bringt.
from bs4 import BeautifulSoup BASE = "https://www.superpages.com" def extract_listings(html): soup = BeautifulSoup(html, "html.parser") listings = [] for business in soup.select("div.search-results > div.result"): name_el = business.select_one("a.business-name span") category_el = business.select_one("div.categories") address_el = business.select_one("span.street-address") phone_el = business.select_one("a.phone.primary") website_el = business.select_one("a.weblink-button") link_el = business.select_one("a.business-name") listings.append({ "name": name_el.text.strip() if name_el else "", "category": category_el.text.strip() if category_el else "", "address": address_el.text.strip() if address_el else "", "phone": phone_el.text.strip() if phone_el else "", "website": website_el["href"] if website_el else "", "detail_page_link": BASE + link_el["href"] if link_el else "", }) return listings
Die Selektoren stammen direkt aus dem SuperPages-Karten-Markup: Der Unternehmensname sitzt in einem span innerhalb eines a.business-name-Ankers, die Adresse in span.street-address, das Telefon in a.phone.primary und die externe Website in a.weblink-button. Der Detailseiten-Link verwendet denselben a.business-name-Anker und ist ein relativer Pfad, daher wird er mit dem BASE-Host für eine vollständige URL versehen. Jedes Feld ist mit einem if ... else "" gesichert, sodass ein fehlendes Element im Datensatz einen leeren String hinterlässt, anstatt einen Fehler zu werfen.
Die obigen Klassennamen (result, business-name, street-address, phone primary, weblink-button) spiegeln das aktuelle SuperPages-Markup wider, und dieses Markup ändert sich ohne Vorankündigung. Behandeln Sie die Selektoren als Ausgangspunkt, nicht als Vertrag. Wenn ein Feld bei jedem Listing leer zurückkommt, überprüfen Sie eine Live-Ergebnisseite in den Entwicklerwerkzeugen Ihres Browsers und aktualisieren Sie den Selektor. Regelmäßige Selektorpflege ist für jeden Produktions-Scraper normal.
Schritt 3: Paginierung über Ergebnisseiten
Eine Seite ist eine Demo; eine echte Lead-Liste deckt den vollständigen Ergebnissatz ab. SuperPages macht die Ergebnisseite über den page-URL-Parameter zugänglich, also ist das Durchlaufen der Seiten eine Schleife über einen Integer-Bereich. Die gleichen build_url- und extract_listings-Funktionen werden ohne Änderungen übernommen, also ist die Paginierung nur eine äußere Schleife, die sich zwischen Anfragen Pausen gönnt.
import time def scrape_all_pages(query, location, max_pages): all_listings = [] for page in range(1, max_pages + 1): print(f"Scraping page {page}...") url = build_url(query, location, page) html = crawl(url) if not html: print(f"Stopping at page {page}: no HTML") break listings = extract_listings(html) if not listings: print(f"No results on page {page}; reached the end") break all_listings.extend(listings) time.sleep(2) return all_listings
Zwei Details machen diese Schleife produktionstauglich. Sie stoppt frühzeitig, wenn eine Seite keine Listings zurückgibt, sodass Sie keine Anfragen nach der letzten realen Seite verschwenden, und sie schläft zwei Sekunden zwischen Anfragen, damit der Lauf nicht als ein enger Burst ankommt. Passen Sie max_pages und die Pause an Ihr Volumen an; je langsamer Sie vorgehen, desto weniger Aufmerksamkeit erregen Sie.
Schritt 4: Alles zusammenführen und exportieren
Verbinden Sie nun den Abruf, das Parsen und die Paginierung in einem einzigen ausführbaren Skript und schreiben Sie dann die Datensätze in eine JSON-Datei und eine CSV, damit die Lead-Liste direkt in eine Tabellenkalkulation oder einen CRM-Import übernommen werden kann.
import csv import json import time from urllib.parse import urlencode from crawlbase import CrawlingAPI from bs4 import BeautifulSoup api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) BASE = "https://www.superpages.com" FIELDS = ["name", "category", "address", "phone", "website", "detail_page_link"] def build_url(query, location, page=1): base = "https://www.superpages.com/search?" params = {"search_terms": query, "geo_location_terms": location, "page": page} return base + urlencode(params) def crawl(page_url): response = api.get(page_url) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Request failed: {response['headers']['cb_status']}") return None def extract_listings(html): soup = BeautifulSoup(html, "html.parser") listings = [] for business in soup.select("div.search-results > div.result"): name_el = business.select_one("a.business-name span") category_el = business.select_one("div.categories") address_el = business.select_one("span.street-address") phone_el = business.select_one("a.phone.primary") website_el = business.select_one("a.weblink-button") link_el = business.select_one("a.business-name") listings.append({ "name": name_el.text.strip() if name_el else "", "category": category_el.text.strip() if category_el else "", "address": address_el.text.strip() if address_el else "", "phone": phone_el.text.strip() if phone_el else "", "website": website_el["href"] if website_el else "", "detail_page_link": BASE + link_el["href"] if link_el else "", }) return listings def scrape_all_pages(query, location, max_pages): all_listings = [] for page in range(1, max_pages + 1): print(f"Scraping page {page}...") html = crawl(build_url(query, location, page)) if not html: break listings = extract_listings(html) if not listings: break all_listings.extend(listings) time.sleep(2) return all_listings def save_json(data, filename="superpages_listings.json"): with open(filename, "w") as f: json.dump(data, f, indent=4) def save_csv(data, filename="superpages_listings.csv"): with open(filename, "w", newline="") as f: writer = csv.DictWriter(f, fieldnames=FIELDS) writer.writeheader() writer.writerows(data) def main(): rows = scrape_all_pages("Home Services", "Los Angeles, CA", max_pages=5) save_json(rows) save_csv(rows) print(f"Saved {len(rows)} listings") if __name__ == "__main__": main()
Da jeder Datensatz dieselben sechs Schlüssel teilt, richten sich die CSV-Spalten sauber aus und csv.DictWriter schreibt sie ohne zusätzliche Zuordnung. Tauschen Sie die Anfrage und den Standort am Ende aus, um eine andere Branche oder Stadt anzusprechen, und erhöhen Sie max_pages, wenn Sie eine tiefere Durchsuchung einer Suche möchten.
Wie die Ausgabe aussieht
Führen Sie das vollständige Skript mit python scraper.py aus und erhalten Sie eine saubere Liste strukturierter Datensätze, bereit zum Schreiben in JSON, CSV oder eine Datenbank. Die JSON-Datei sieht so aus:
[ { "name": "Evergreen Cleaning Systems", "category": "House Cleaning", "address": "3325 Wilshire Blvd Ste 622, Los Angeles, CA 90010", "phone": "213-375-1597", "website": "https://www.evergreencleaningsystems.com", "detail_page_link": "https://www.superpages.com/los-angeles-ca/bpp/evergreen-cleaning-systems-540709574" }, { "name": "Any Day Anytime Cleaning Service", "category": "House Cleaning", "address": "27612 Cherry Creek Dr, Santa Clarita, CA 91354", "phone": "661-297-2702", "website": "", "detail_page_link": "https://www.superpages.com/santa-clarita-ca/bpp/any-day-anytime-cleaning-service-513720439" } ]
Listings ohne angegebene Website kommen mit "website": "" zurück, was erwartet ist und genau deshalb der Parser jedes Feld defensiv liest, anstatt anzunehmen, dass jeder Schlüssel vorhanden ist. Von hier aus sind die Daten bereit für Deduplizierung, Anreicherung oder Import in Ihr Outreach-Tooling. Für den breiteren Workflow, wie man diese Datensätze in eine Kampagne umwandelt, lesen Sie die Anleitung zum Web Crawling für Lead-Generierung.
Auf mehr Anfragen und Standorte skalieren
Eine einzelne Suche deckt eine Branche in einer Stadt ab. Ein echter Prospecting-Datensatz kreuzt oft viele von beidem, also ist der natürliche nächste Schritt, den Scraper aus einer Liste von Anfrage- und Standortpaaren zu steuern, anstatt aus fest codierten Strings.
searches = [ ("Home Services", "Los Angeles, CA"), ("Plumbers", "San Diego, CA"), ("Electricians", "Phoenix, AZ"), ] all_rows = [] for query, location in searches: all_rows.extend(scrape_all_pages(query, location, max_pages=3)) save_json(all_rows) save_csv(all_rows)
Der extend-Aufruf fügt jede Suche in eine flache Liste ein, sodass der Exportschritt unverändert bleibt. Wenn die Matrix von Anfragen und Standorten wächst, verlagern Sie die Arbeit aus einer einzelnen synchronen Schleife in eine Warteschlange. Der async Crawler nimmt URLs in Bulk entgegen und gibt Ergebnisse zurück, sobald sie fertig sind, was besser passt als das Blockieren auf jeder Seite, sobald Sie Tausende von Suchen scrapen.
Unblockiert bleiben
Auch wenn die Crawling API die IP-Rotation und die Anti-Bot-Schicht für Sie handhabt, halten ein paar Gewohnheiten einen Lauf gesund, und sie gelten für jedes Verzeichnisziel.
- Drosseln Sie Ihre Anfragen. Die Zwei-Sekunden-Pause ist kein Dekorationselement. Eine enge Schleife ist der schnellste Weg zur Drosselung; das Verteilen von Anfragen liest sich weit mehr wie normaler Traffic.
- Setzen Sie auf Rotation. Ein Pool von Residential-IPs verteilt Anfragen über viele echte Nutzeradressen, sodass keine einzelne ein Ratenlimit auslöst. Die Crawling API erledigt das für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, den Sie richtig hinbekommen müssen.
- Lesen Sie die Statuscodes. Ein Lauf, der beginnt, Herausforderungen oder Fehler zurückzugeben, signalisiert Ihnen, dass die aktuelle Rate zu aggressiv ist. Behandeln Sie das als Signal zum Zurückschalten, nicht als Lärm, den Sie ignorieren.
Für das umfassendere Playbook lesen Sie die Anleitung zu Websites ohne Blockierung scrapen. Wenn Sie denselben Ansatz auf ein benachbartes Verzeichnis anwenden möchten, folgen die Anleitungen zum Scrapen von Yellow Pages und zum Scrapen lokaler Unternehmenslistings derselben Abruf-Parse-Paginierungs-Form mit anderen Selektoren.
Ist es legal, SuperPages zu scrapen?
Ob das Scrapen von SuperPages erlaubt ist, hängt von den Nutzungsbedingungen der Website, Ihrer Gerichtsbarkeit und dem ab, was Sie mit den Daten tun. Keiner der hier vorliegenden Code ändert das; er lässt nur den technischen Teil funktionieren. Lesen Sie die SuperPages-Nutzungsbedingungen und seine robots.txt, und behandeln Sie beides als Grenze dessen, was Sie sammeln und wie schnell. Alles in dieser Anleitung ist auf öffentliche B2B-Unternehmensverzeichnisdaten beschränkt: einen Firmennamen, seine Kategorie, eine öffentliche Straßenadresse, eine öffentliche Telefonnummer und einen Link zur eigenen Website. Das sind Informationen, die jeder Besucher ohne Anmeldung sehen kann, und sie beschreiben Unternehmen, keine Privatpersonen.
Das rechtliche Gewicht verschiebt sich, wenn Sie auf der Grundlage dieser Daten handeln. Geschäftskontaktdaten unterliegen in vielen Regionen dem Datenschutz- und Anti-Spam-Recht. Nach der DSGVO kann ein benannter Ansprechpartner bei einem kleinen Unternehmen als personenbezogene Daten gelten, sodass Sie eine Rechtsgrundlage für die Speicherung und Verarbeitung benötigen und Personen das Recht haben, zu widersprechen und entfernt zu werden. In den USA regelt der CAN-SPAM Act die kommerzielle E-Mail: Sie müssen sich ehrlich identifizieren, irreführende Betreffzeilen vermeiden und Opt-out-Anfragen umgehend bearbeiten. Kaltakquise-Regeln und Do-Not-Call-Register gelten für telefonische Kontaktaufnahme im gleichen Geiste. Die Daten zu sammeln ist eine Sache; sie für Outreach zu verwenden ist der Punkt, an dem diese Verpflichtungen greifen, also bauen Sie von Anfang an Opt-out-Handling und Unterdrückungslisten ein, anstatt sie später anzuhängen.
Was dieser Ansatz nicht abdeckt, ist genauso wichtig. Er berührt nichts hinter einem Login und umgeht keine Authentifizierung oder Zugriffskontrolle, um auf gesperrte Inhalte zuzugreifen; das ist hier außerhalb des Gültigkeitsbereichs und verstößt gegen die Bedingungen der Website. Wenn SuperPages eine offizielle API oder einen lizenzierten Datenfeed für das benötigte Volumen anbietet, bevorzugen Sie diese: Eine sanktionierte Quelle beseitigt die Ambiguität vollständig. Bei Unsicherheiten über eine kommerzielle Nutzung eines aggregierten Kontaktdatensatzes überprüfen Sie die für Sie geltenden Regeln, anstatt anzunehmen, dass öffentlich uneingeschränkt bedeutet.
Wichtigste Erkenntnisse
-
SuperPages ist ein strukturiertes B2B-Verzeichnis. Jedes Suchergebnis ist eine Karte mit Unternehmensname, Kategorie, öffentlicher Adresse, öffentlichem Telefon, optionaler Website und einem Detailseiten-Link, gesteuert durch die
search_terms- undgeo_location_terms-URL-Parameter. - Ein einfacher Abruf kämpft bei Volumen. Ratenlimits, CAPTCHAs und IP-Blockierungen stoppen eine naive Schleife; die Crawling API leitet über Residential-IPs weiter und gibt parsefreies HTML in einem Aufruf zurück.
- BeautifulSoup übernimmt die Extraktion. Ordnen Sie Name, Kategorie, Adresse, Telefon, Website und Link den aktuellen Selektoren zu, lesen Sie jedes Feld defensiv und rechnen Sie damit, dass diese Selektoren driften.
-
Paginierung ist eine Schleife über den
page-Parameter. Verwenden Sie denselben Parser über alle Seiten, stoppen Sie frühzeitig bei einer leeren Seite, schlafen Sie zwischen Anfragen und exportieren Sie in JSON und CSV. - Rechtmäßiges Outreach liegt bei Ihnen. Die Daten sind öffentlich, aber DSGVO und CAN-SPAM gelten trotzdem für die Art, wie Sie diese Unternehmen kontaktieren, also brauchen Sie eine Rechtsgrundlage und müssen Opt-outs beachten.
Häufig gestellte Fragen
Brauche ich für SuperPages das normale Token oder das JS-Token?
Das normale Token. SuperPages liefert seine Listing-Daten im initialen HTML, sodass ein normaler Token-Abruf parsefreies Markup zurückgibt und jede Anfrage günstiger hält. Das JS-Token rendert die Seite zuerst in einem echten Browser, was Sie nur benötigen, wenn ein Ziel seine Listings clientseitig nach dem Ankommen der Seite lädt. Beginnen Sie mit dem normalen Token und wechseln Sie nur, wenn Felder durchgängig leer zurückkommen.
Wie gehe ich mit der Paginierung bei SuperPages um?
SuperPages macht die Ergebnisseite über einen page-URL-Parameter zugänglich, also schleifen Sie über einen Integer-Bereich, erstellen Sie eine URL pro Seite und führen denselben Parser auf jeder aus. Stoppen Sie, wenn eine Seite null Listings zurückgibt, was das Ende des Ergebnissatzes markiert, und schlafen Sie ein paar Sekunden zwischen Anfragen, damit der Lauf nicht als ein Burst ankommt.
Meine Selektoren geben leere Werte zurück. Was hat sich geändert?
Fast sicher das SuperPages-Markup. Klassennamen wie result, business-name, street-address und weblink-button ändern sich ohne Vorankündigung, sodass Selektoren, die letzten Monat funktionierten, jetzt brechen können. Überprüfen Sie eine Live-Ergebnisseite in den Entwicklerwerkzeugen Ihres Browsers und aktualisieren Sie die Selektoren. Regelmäßige Selektorpflege ist für jeden Produktions-Scraper normal, kein Zeichen dafür, dass etwas kaputt ist.
Wie exportiere ich die Leads in CSV oder Excel?
Der Scraper schreibt bereits eine CSV mit csv.DictWriter, da jeder Datensatz dieselben Schlüssel teilt. Für Excel wandelt pandas dieselbe Liste von Wörterbüchern in zwei Zeilen in eine Tabellenkalkulation um: pd.DataFrame(rows).to_excel("superpages_listings.xlsx", index=False). Die Spalten richten sich sauber aus, weil der Feldsatz festgelegt ist.
Kann ich auch die einzelnen Unternehmensdetailseiten scrapen?
Ja. Jeder Datensatz trägt einen detail_page_link, sodass Sie diese URLs zurück durch dieselbe crawl-Funktion leiten und die dedizierte Seite nach zusätzlichen Feldern wie Öffnungszeiten oder einem längeren Kontaktblock parsen können. Passen Sie diesen zweiten Durchgang genauso ab, da er Ihre Anfragenanzahl verdoppelt, und halten Sie ihn auf die öffentlichen Geschäftsinformationen auf der Seite beschränkt.
Wie halte ich mein Outreach konform?
Behandeln Sie die gescrapte Liste als Ausgangspunkt, nicht als grünes Licht. Bestätigen Sie, dass Sie eine Rechtsgrundlage haben, um jedes Unternehmen nach den in Ihrer Region geltenden Regeln zu kontaktieren, identifizieren Sie sich in jeder Nachricht ehrlich und bauen Sie Opt-out-Handling und eine Unterdrückungsliste von Anfang an in Ihre Sendepipeline ein. DSGVO- und CAN-SPAM-Verpflichtungen knüpfen an das Outreach an, nicht an die Sammlung, also liegt die Compliance-Arbeit darin, wie Sie die Daten verwenden.
Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.
Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.
