Foursquare verfügt über öffentliche Standortdaten zu Millionen von Orten: Restaurants, Cafés, Parks, Bars und Museen, jeweils mit Namen, Kategorie, Adresse und einer öffentlichen Bewertung. Für die Recherche lokaler Unternehmen, Marktanalysen oder den Aufbau einer Empfehlungsfunktion sind diese öffentlichen Veranstaltungsortdaten wirklich nützlich. Der Haken ist, dass Foursquare seine Seiten mit JavaScript rendert, sodass eine einfache HTTP-Anfrage eine nahezu leere Hülle zurückgibt statt der Veranstaltungsortliste, die Sie im Browser sehen.
Diese Anleitung zeigt Ihnen, wie Sie öffentliche Foursquare-Veranstaltungsortdaten mit Python extrahieren, und zwar über die Crawling API, die die Seite rendert und die Anfrage in einem einzigen Aufruf über eine vertrauenswürdige IP leitet. Alles hier bleibt auf öffentliche Veranstaltungsort- und Ortsdaten beschränkt: Namen, Kategorien, Adressen und öffentliche Bewertungen. Es deckt nichts ab, was hinter einem Login liegt, und es berührt keine personenbezogenen Daten über einzelne Nutzer oder deren Check-ins. Für den produktiven Einsatz ist die offizielle Foursquare Places API das richtige Werkzeug, und der Abschnitt zur Rechtslage gegen Ende erklärt, warum.
Was Sie bauen werden
Einen kleinen Python-Scraper, der eine öffentliche Foursquare-Such-URL oder eine einzelne Veranstaltungsort-URL entgegennimmt, die vollständig gerenderte Seite über die Crawling API abruft und eine Handvoll öffentlicher Veranstaltungsortfelder parst:
- Veranstaltungsortname der Name des Unternehmens oder Ortes, der im Eintrag angezeigt wird.
- Kategorie der Typ des Veranstaltungsorts, etwa Thai, Bäckerei oder Bar.
- Adresse die öffentliche Straßenadresse des Veranstaltungsorts.
- Bewertung die aggregierte öffentliche Bewertung, die der Veranstaltungsort anzeigt.
- Link der Permalink zur öffentlichen Detailseite des Veranstaltungsorts.
Das Skript verarbeitet mehrere Ergebnisse von einer Suchseite, durchläuft jeden Eintrag und exportiert die gesammelten Datensätze nach JSON und CSV, sodass die Daten für die Recherche lokaler Unternehmen bereitstehen. Beachten Sie, was bewusst fehlt: keine individuellen Nutzerprofile, keine Check-in-Verläufe, keine personenbezogenen Daten, die an eine namentlich genannte Person gebunden sind. Diese liegen hier absichtlich außerhalb des Umfangs.
Warum eine einfache Anfrage bei Foursquare scheitert
Fordern Sie eine Foursquare-Suchseite mit einem schlichten HTTP-Client an, erhalten Sie eine Antwort, die technisch erfolgreich und praktisch nutzlos ist. Der Veranstaltungsort-Inhalt wird dynamisch geladen: Die echten Einträge erscheinen erst, nachdem die Skripte der Seite im Browser ausgeführt wurden und Daten von internen Endpunkten abgerufen haben. Eine rohe Anfrage erfasst die Seite, bevor irgendetwas davon geschieht, sodass es nichts zu parsen gibt.
Über das Rendering hinaus wacht Foursquare über automatisierten Datenverkehr. Datacenter-IP-Bereiche und sich wiederholende Anfragemuster werden mit Challenges belegt oder ratenbegrenzt, bevor der interessante Inhalt geladen wird. Ein funktionierender Scraper benötigt also zwei Dinge in derselben Anfrage: einen echten Browser, der die Seite rendert, und eine IP-Adresse, die die Plattform als gewöhnlichen Besucher liest. Sie können das mit einem Headless-Browser und einem Pool aus Residential-Proxys aufbauen, aber diesen Stack gesund zu halten ist der Großteil der Arbeit. Die Crawling API fasst beides in einem Aufruf zusammen. Sie senden ihr eine URL, sie rendert die Seite hinter einer vertrauenswürdigen Residential-IP und gibt fertiges HTML zurück, das Sie parsen können. Für den tieferen Hintergrund lesen Sie unsere Anleitung dazu, wie man JavaScript-Websites crawlt.
Crawlbase bietet zwei Token-Typen an. Der normale Token ruft statisches HTML ab; der JavaScript-Token (JS) rendert die Seite zuerst in einem echten Browser. Foursquare wird clientseitig gerendert, daher benötigen Sie hier den JS-Token. Der normale Token gibt dieselbe Hülle zurück, die auch ein einfacher Abruf liefern würde, ohne dass etwas Nützliches daraus zu parsen wäre.
Voraussetzungen
Ein paar Dinge sollten Sie zuerst bereithalten. Keines davon dauert lange.
Grundlegende Python-Kenntnisse. Sie sollten sicher sein, ein Skript auszuführen und Pakete mit pip zu installieren. Wenn Sie neu im Parsen von HTML sind, deckt unsere Einführung dazu, wie man BeautifulSoup in Python verwendet, die Extraktionsseite ab.
Python 3.8 oder neuer. Prüfen Sie das mit python --version. Falls Sie es nicht haben, installieren Sie es von python.org.
Ein Crawlbase-Konto und ein JS-Token. Melden Sie sich an, öffnen Sie Ihr Dashboard und kopieren Sie Ihren JavaScript-Token (JS). Crawlbase gibt Ihnen bis zu 20.000 kostenlose Anfragen für den Start, und Sie zahlen nur für erfolgreiche Anfragen. Behandeln Sie den Token wie ein Passwort: Er authentifiziert Ihre Anfragen, halten Sie ihn also aus der Versionskontrolle heraus.
Das Projekt einrichten
Erstellen Sie eine isolierte virtuelle Umgebung und installieren Sie dann die beiden Bibliotheken, die der Scraper benötigt.
python --version python -m venv foursquare_env source foursquare_env/bin/activate pip install crawlbase beautifulsoup4
Unter Windows aktivieren Sie mit foursquare_env\Scripts\activate anstelle 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, sodass Sie einzelne Felder per Selektor herausziehen können.
Schritt 1: Die gerenderte Suchseite abrufen
Beginnen Sie damit, die fertige Seite zu holen. Importieren Sie CrawlingAPI, initialisieren Sie es mit Ihrem JS-Token und fordern Sie eine öffentliche Such-URL an. Da Foursquare Einträge asynchron lädt, übergeben Sie die Optionen ajax_wait und page_wait, damit die API wartet, bis der Inhalt gerendert wurde. Prüfen Sie den Status vor dem Parsen, damit Fehler laut statt still bleiben.
from crawlbase import CrawlingAPI crawling_api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def make_crawlbase_request(url): options = { "ajax_wait": "true", "page_wait": "5000", } response = crawling_api.get(url, options) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Failed to fetch the page. Crawlbase status: {response['headers']['cb_status']}") return None if __name__ == "__main__": url = "https://foursquare.com/explore?near=New%20York&q=Food" html = make_crawlbase_request(url) print(html[:500] if html else "No HTML returned")
Die beiden Wait-Optionen sind für ein clientseitig gerendertes Ziel entscheidend. ajax_wait weist die API an, auf das vollständige Laden asynchroner Inhalte zu warten, und page_wait hält nach dem Laden für eine feste Anzahl von Millisekunden, damit spät rendernde Einträge erscheinen, bevor die Seite erfasst wird. Fünf Sekunden sind ein vernünftiger Ausgangspunkt; erhöhen Sie den Wert, wenn Einträge leer zurückkommen. Die Statusprüfung liest cb_status (legacy pc_status) aus den Antwort-Headern, was der Crawlbase-Status für den Crawl selbst ist. Führen Sie das Skript aus, und Sie sollten echtes Veranstaltungsort-Markup sehen, was bestätigt, dass das Rendering funktioniert, bevor Sie einen einzigen Selektor schreiben.
Foursquare braucht eine gerenderte Seite hinter einer vertrauenswürdigen IP, in einem einzigen Aufruf. Die Crawling API nimmt einen JS-Token entgegen, führt die Seite in einem echten Browser aus, damit diese ajax_wait-Einträge tatsächlich laden, rotiert serverseitig durch Residential-IPs und reicht Ihnen fertiges HTML, sodass Sie sich das Betreiben einer Headless-Flotte und eines Proxy-Pools sparen. Richten Sie sie zunächst im kostenlosen Tarif auf eine öffentliche Suchseite.
Schritt 2: Das Markup inspizieren und Einträge parsen
Bevor Sie Selektoren schreiben, öffnen Sie eine Foursquare-Suchergebnisseite in Ihrem Browser, klicken Sie mit der rechten Maustaste auf einen Eintrag und wählen Sie Untersuchen. Sie suchen nach den Elementen, die jeden Veranstaltungsort umschließen und die gewünschten Felder enthalten. Auf der Suchergebnisseite liegt jeder Ort innerhalb eines Listenelements, und die öffentlichen Felder bilden sich auf diese Selektoren ab:
-
Veranstaltungsortname liegt in einem
<a>-Tag innerhalb einesdiv.venueName. -
Adresse liegt in einem
div.venueAddress. -
Kategorie liegt in einem
span.categoryName. -
Link ist das
hrefdesselbendiv.venueName a-Ankers.
Mit gerendertem HTML in der Hand laden Sie es in BeautifulSoup und durchlaufen jeden Eintrag. Jede Ergebniszeile passt auf ul.recommendationList > li.singleRecommendation. Indem Sie jedes Feld mit einer Existenzprüfung absichern, verhindern Sie, dass der Parser abstürzt, wenn einem Veranstaltungsort eines davon fehlt.
from bs4 import BeautifulSoup def scrape_foursquare_listings(html): soup = BeautifulSoup(html, "html.parser") venues = [] listings = soup.select("ul.recommendationList > li.singleRecommendation") for listing in listings: name_el = listing.select_one("div.venueName a") address_el = listing.select_one("div.venueAddress") category_el = listing.select_one("span.categoryName") rating_el = listing.select_one("span.venueScore") href = name_el["href"] if name_el and name_el.has_attr("href") else "" venues.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 "", "rating": rating_el.text.strip() if rating_el else "", "link": f"https://foursquare.com{href}" if href else "", }) return venues
Die Funktion gibt eine Liste von Dictionaries zurück, eines pro Veranstaltungsort, mit den fünf öffentlichen Feldern. Der Link wird gebildet, indem das relative href an den Ursprung https://foursquare.com angefügt wird, sodass jeder Datensatz einen verwendbaren Permalink trägt. Die Bewertung wird aus span.venueScore gelesen; falls Foursquare diese Klasse auf der von Ihnen inspizierten Seite umbenannt hat, setzen Sie stattdessen die Klasse ein, die die sichtbare Bewertung umschließt. Behandeln Sie die Bewertung als öffentliches Aggregat, nicht als Signal über einen einzelnen Rezensenten.
Foursquare ändert sein Markup und seine Klassennamen ohne Vorankündigung. Wenn ein Feld leer zurückkommt, inspizieren Sie die Live-Seite erneut in den Entwicklertools Ihres Browsers und aktualisieren Sie den Selektor. Regelmäßige Wartung ist für jeden produktiven Scraper normal und kein Zeichen dafür, dass etwas kaputt ist. Die abgesicherte Extraktion oben bedeutet, dass eine umbenannte Klasse einen leeren String statt eines Absturzes ergibt.
Schritt 3: Mehrere Ergebnisseiten verarbeiten
Foursquare-Suchergebnisse verwenden eine schaltflächenbasierte Paginierung: Eine Schaltfläche "See more results" lädt den nächsten Schwung Veranstaltungsorte an Ort und Stelle, anstatt zu einer neuen URL zu navigieren. Die Crawling API kann diese Schaltfläche mit der Option css_click_selector für Sie anklicken, sodass das gerenderte HTML, das Sie erhalten, bereits die erweiterte Liste enthält. Richten Sie den Selektor auf die Schaltfläche, die für das Nachladen zuständig ist.
def make_request_with_pagination(url): options = { "ajax_wait": "true", "page_wait": "5000", "css_click_selector": "li.moreResults > button", } response = crawling_api.get(url, options) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Failed to fetch the page. Crawlbase status: {response['headers']['cb_status']}") return None
Der Wert von css_click_selector zielt auf die Schaltfläche innerhalb von li.moreResults. Falls die Klasse der Schaltfläche auf der von Ihnen inspizierten Seite abweicht, aktualisieren Sie den Selektor entsprechend. Halten Sie das Volumen bescheiden: Die Recherche öffentlicher Daten erfordert nicht, die Einträge einer ganzen Stadt in einem Lauf zu laden. Entnehmen Sie eine Stichprobe in dem Umfang, den Sie brauchen, und hören Sie auf.
Schritt 4: Den vollständigen Scraper zusammensetzen und exportieren
Verdrahten Sie nun Abruf, Parsen und Export zu einem lauffähigen Skript. Das Skript ruft eine Suchseite mit Paginierung ab, parst jeden Eintrag und schreibt die Datensätze sowohl nach JSON als auch nach CSV. JSON erhält die Struktur für die weitere Verarbeitung; CSV landet direkt in einer Tabellenkalkulation für die schnelle Recherche lokaler Unternehmen.
import json import csv from crawlbase import CrawlingAPI from bs4 import BeautifulSoup crawling_api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"}) def make_request_with_pagination(url): options = { "ajax_wait": "true", "page_wait": "5000", "css_click_selector": "li.moreResults > button", } response = crawling_api.get(url, options) if response["headers"]["cb_status"] == "200": return response["body"].decode("utf-8") print(f"Failed to fetch the page. Crawlbase status: {response['headers']['cb_status']}") return None def scrape_foursquare_listings(html): soup = BeautifulSoup(html, "html.parser") venues = [] listings = soup.select("ul.recommendationList > li.singleRecommendation") for listing in listings: name_el = listing.select_one("div.venueName a") address_el = listing.select_one("div.venueAddress") category_el = listing.select_one("span.categoryName") rating_el = listing.select_one("span.venueScore") href = name_el["href"] if name_el and name_el.has_attr("href") else "" venues.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 "", "rating": rating_el.text.strip() if rating_el else "", "link": f"https://foursquare.com{href}" if href else "", }) return venues def save_to_json(data, filename="foursquare_data.json"): with open(filename, "w", encoding="utf-8") as f: json.dump(data, f, indent=4, ensure_ascii=False) print(f"Saved {len(data)} venues to {filename}") def save_to_csv(data, filename="foursquare_data.csv"): if not data: return fields = ["name", "category", "address", "rating", "link"] with open(filename, "w", newline="", encoding="utf-8") as f: writer = csv.DictWriter(f, fieldnames=fields) writer.writeheader() writer.writerows(data) print(f"Saved {len(data)} venues to {filename}") if __name__ == "__main__": url = "https://foursquare.com/explore?near=New%20York&q=Food" html = make_request_with_pagination(url) if html: venues = scrape_foursquare_listings(html) save_to_json(venues) save_to_csv(venues)
Das ist die gesamte Pipeline in einer Datei: Abruf mit Paginierung, Parsen der Einträge und Export in beide Formate. Der CSV-Writer fixiert die Spaltenreihenfolge auf die fünf öffentlichen Felder, sodass die Ausgabe über Läufe hinweg stabil ist. Tauschen Sie die url gegen eine beliebige öffentliche Foursquare-Suche aus, um den Scraper auf eine andere Stadt oder Kategorie auszurichten.
Wie die Ausgabe aussieht
Führen Sie das vollständige Skript aus, und Sie erhalten eine saubere Liste öffentlicher Veranstaltungsort-Datensätze. Hier ist eine gekürzte JSON-Stichprobe dessen, was foursquare_data.json enthält.
[ { "name": "Thai Diner", "category": "Thai", "address": "186 Mott St (at Kenmare), New York", "rating": "9.5", "link": "https://foursquare.com/v/thai-diner/5e46e2ec5791a10008c55728" }, { "name": "Mah-Ze-Dahr Bakery", "category": "Bakery", "address": "28 Greenwich Ave (Charles Street), New York", "rating": "9.1", "link": "https://foursquare.com/v/mahzedahr-bakery/568c0ce238fafac5f5ffe631" } ]
Die CSV-Version trägt dieselben Felder als eine Zeile pro Veranstaltungsort mit einer Kopfzeile, die sich direkt in jedem Tabellenkalkulationswerkzeug öffnet. Von hier aus können Sie nach Kategorie filtern, nach Stadtviertel gruppieren oder die Adressen mit einem anderen Datensatz für die Recherche lokaler Unternehmen verbinden. Wenn Preissignale Teil Ihrer Analyse sind, deckt unsere Anleitung zum Web Scraping für Price Intelligence ab, wie aggregierte öffentliche Daten diese Art von Arbeit speisen.
Skalierung auf Veranstaltungsort-Detailseiten
Der Such-Scraper liefert Ihnen eine Liste und einen Link pro Veranstaltungsort. Um jeden Datensatz anzureichern, führen Sie das Feld link erneut durch dieselbe Abruffunktion und parsen Sie die eigene Seite des Veranstaltungsorts, auf der Foursquare strukturiertere öffentliche Details bereitstellt. Auf einer Veranstaltungsortseite bilden sich die öffentlichen Felder auf diese Selektoren ab: Der Name sitzt in einem h1.venueName, die Adresse in einem div.venueAddress, die Bewertung in einem span[itemprop="ratingValue"] und die öffentliche Anzahl der Rezensionen in einem div.numRatings. Verwenden Sie das abgesicherte Extraktionsmuster aus Schritt 2 erneut, takten Sie Ihre Anfragen zwischen den Detailseiten-Abrufen, und halten Sie den Lauf auf die Veranstaltungsorte beschränkt, die Sie tatsächlich brauchen, anstatt alles zu crawlen, was eine Suche zurückgibt.
Foursquare ist ein nützlicher Einstiegspunkt, aber Veranstaltungsort- und lokale Unternehmensdaten leben auf vielen Oberflächen. Für benachbarte Techniken lesen Sie unsere Anleitungen dazu, wie man Daten von Google Maps scrapt und lokale Unternehmenseinträge scrapt, die beide denselben Ansatz aus Rendering plus vertrauenswürdiger IP auf andere Karten- und Verzeichnisquellen anwenden.
Unblockiert bleiben
Auch wenn das Rendering von der Crawling API übernommen wird, wacht Foursquare über scraper-förmigen Datenverkehr. Ein paar Gewohnheiten halten einen Lauf gesund, und sie gelten für jedes verteidigte Ziel.
- Takten Sie Ihre Anfragen. Seiten in einer engen Schleife zu hämmern ist der schnellste Weg, gedrosselt zu werden. Fügen Sie echte Verzögerungen zwischen den Abrufen ein und widerstehen Sie dem Drang, aggressiv zu parallelisieren.
- Setzen Sie auf Rotation. Ein Pool aus Residential-IPs verteilt Anfragen über viele echte Nutzeradressen, sodass keine einzelne ein Rate-Limit auslöst. Die Crawling API erledigt das für Sie; wenn Sie Ihren eigenen Stack bauen, ist das der Teil, den Sie richtig hinbekommen müssen.
- Lesen Sie die Statuscodes. Ein Lauf, der beginnt, Challenges oder Fehler zurückzugeben, sagt Ihnen, dass das aktuelle Raten- oder IP-Tier nicht mehr ausreicht. Drosseln Sie sich selbst, anstatt stärker zu drücken.
- Halten Sie das Volumen niedrig und die Ziele vielfältig. Die Recherche öffentlicher Daten erfordert nicht das Crawlen einer ganzen Stadt. Entnehmen Sie eine Stichprobe in dem Umfang, den Sie brauchen, und hören Sie auf.
Für das umfassendere Vorgehen lesen Sie unsere Anleitung dazu, wie man Websites scrapt, ohne blockiert zu werden.
Ist es legal, Foursquare zu scrapen?
Dies ist der Abschnitt, den Sie lesen sollten, bevor Sie Produktionscode schreiben. Das Scrapen öffentlicher Veranstaltungsortdaten liegt in einer Grauzone, die stark davon abhängt, wie Sie es tun und was Sie erfassen. Die Nutzungsbedingungen von Foursquare schränken den automatisierten Zugriff ein, lesen Sie sie also zusammen mit der robots.txt der Website und behandeln Sie beide als Grenze dafür, was Sie erfassen und wie schnell Sie es erfassen. Der Code oben macht den technischen Teil funktionsfähig; er ändert nichts daran, was die Bedingungen erlauben.
Beschränken Sie sich auf öffentliche, nicht personenbezogene Veranstaltungsortdaten. Veranstaltungsortnamen, Kategorien, öffentliche Adressen und aggregierte Bewertungen beschreiben Orte, nicht Personen, und das ist die sichere Spur für diese Art von Recherche. Was Sie nicht berühren sollten: alles hinter einem Login, individuelle Nutzerprofile, Check-in-Verläufe oder jegliche personenbezogenen Daten über identifizierbare Nutzer. Die aggregierte Bewertung eines Veranstaltungsorts ist eine öffentliche Zahl über einen Ort; die Einzelpersonen, die Rezensionen hinterlassen oder eingecheckt haben, gehören nicht Ihnen zur Ernte. Sobald überhaupt personenbezogene Daten im Spiel sind, gelten Datenschutzgesetze wie DSGVO und CCPA, was bedeutet, dass Sie eine rechtliche Grundlage zu deren Verarbeitung brauchen und Löschanfragen erfüllen müssen. Der einfachste Weg, sich diese Last zu ersparen, ist, personenbezogene Daten von vornherein nicht zu erfassen, was genau das ist, was diese Anleitung tut.
Für jeden realen, laufenden oder kommerziellen Einsatz ist das richtige Werkzeug die offizielle Foursquare Places API. Sie ist der genehmigte Weg, liefert strukturierte Veranstaltungsort- und Kategoriedaten mit einer klaren Nutzungslizenz und hält Sie innerhalb der Bedingungen von Foursquare. Dieser Artikel ist eine technische Anleitung, eng auf öffentliche Veranstaltungsortdaten beschränkt, und keine Befürwortung einer groß angelegten Erfassung oder irgendeines Umgangs mit personenbezogenen Nutzerdaten. Wenn Ihr Projekt mehr als eine Stichprobe öffentlicher Veranstaltungsortfelder benötigt, ist die Places API oder eine formelle Datenvereinbarung der korrekte Weg, nicht ein cleverer Scraper.
Wichtigste Erkenntnisse
- Foursquare wird clientseitig gerendert. Eine einfache Anfrage gibt eine leere Hülle zurück, daher müssen Sie die Seite rendern, bevor Sie sie parsen, was der JS-Token der Crawling API erledigt.
-
Portieren Sie die echten Selektoren. Einträge leben in
li.singleRecommendation, mit Name, Kategorie, Adresse und Link invenueName,categoryNameundvenueAddress. -
Verarbeiten Sie die Paginierung serverseitig. Die Option
css_click_selectorklickt die Schaltfläche "See more results", sodass das gerenderte HTML bereits die erweiterte Liste enthält. - Exportieren Sie für die Recherche. Schreiben Sie die Veranstaltungsort-Datensätze nach JSON für die Struktur und nach CSV für Tabellenkalkulationen, und filtern oder verbinden Sie sie dann für die Analyse lokaler Unternehmen.
- Nur öffentliche Veranstaltungsorte, bevorzugen Sie die offizielle API. Erfassen Sie Ortsdaten, niemals personenbezogene Nutzerdaten oder Check-ins, und verwenden Sie die Foursquare Places API für alles Reale oder Kommerzielle.
Häufig gestellte Fragen
Warum gibt eine einfache Anfrage keine Daten von Foursquare zurück?
Weil Foursquare seine Veranstaltungsort-Einträge clientseitig mit JavaScript lädt. Das anfängliche HTML ist eine Hülle, die sich erst füllt, nachdem die Skripte der Seite im Browser ausgeführt wurden, sodass eine rohe HTTP-Anfrage einen nahezu leeren Body zurückgibt. Um echte Veranstaltungsortdaten zu erhalten, müssen Sie die Seite zuerst rendern, was der JS-Token der Crawling API für Sie erledigt.
Brauche ich für Foursquare den normalen Token oder den JS-Token?
Den JS-Token. Der normale Token ruft statisches HTML ab, was bei Foursquare dieselbe leere Hülle ist, die eine einfache Anfrage zurückgibt. Der JS-Token rendert die Seite in einem echten Browser, bevor er das HTML zurückreicht, sodass die Veranstaltungsortfelder vorhanden sind, wenn BeautifulSoup sie parst.
Welche Foursquare-Daten dürfen sicher gescrapt werden?
Öffentliche, nicht personenbezogene Veranstaltungsortdaten: Veranstaltungsortnamen, Kategorien, öffentliche Adressen, aggregierte Bewertungen und die öffentlichen Links zu Veranstaltungsortseiten. Alles hinter einem Login, individuelle Nutzerprofile und Check-in-Verläufe sind tabu. Das sind personenbezogene Daten, und ihre Erfassung verstößt gegen die Bedingungen von Foursquare und, an vielen Orten, gegen das Datenschutzrecht.
Wie verarbeite ich die Paginierung beim Scrapen von Foursquare?
Die Foursquare-Suche verwendet eine Schaltfläche "See more results" statt separater URLs. Übergeben Sie der Crawling API die Option css_click_selector, ausgerichtet auf diese Schaltfläche (zum Beispiel li.moreResults > button), und die API klickt sie während des Renderings, sodass das HTML, das Sie erhalten, bereits die erweiterte Liste der Veranstaltungsorte enthält.
Sollte ich die offizielle Foursquare Places API verwenden oder die Website scrapen?
Für jeden realen, laufenden oder kommerziellen Einsatz verwenden Sie die offizielle Foursquare Places API. Sie ist der genehmigte Weg, liefert strukturierte Veranstaltungsort- und Kategoriedaten mit einer klaren Lizenz und hält Sie innerhalb der Bedingungen von Foursquare. Das Scrapen einer kleinen Stichprobe öffentlicher Veranstaltungsortfelder mit dem hier gezeigten Ansatz passt zu leichtgewichtiger Recherche, bei der kein API-Zugang vorhanden ist, solange Sie die Bedingungen, die robots.txt und die Rate-Limits respektieren.
Wie vermeide ich es, beim Scrapen von Foursquare blockiert zu werden?
Halten Sie Ihre Anfragerate pro IP niedrig, fügen Sie echte Verzögerungen zwischen den Anfragen ein, variieren Sie Ihre Ziele, anstatt eine ganze Stadt zu crawlen, und leiten Sie über rotierende Residential-IPs, sodass keine einzelne Adresse ein Rate-Limit auslöst. Die Crawling API verwaltet die Rotation und einen Pool vertrauenswürdiger IPs für Sie. Beobachten Sie die Statuscodes und drosseln Sie sich in dem Moment, in dem Sie anfangen, Challenges zu sehen.
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.
