scrpae google maps durch selenium
Steuerung des Chrome-Browsers mit Selenium

Verwendung von Selen in data scraping is quite a common thing. It automates browsers and allows you to simulate real user activities to avoid getting blocked. It is specially helpful while scraping JavaScript dynamically generated sites like Google. Moreover, it helps to avoid any kind of crawling protection as it basically simulates real clients' behavior.

In diesem Artikel sehen Sie eine Schritt-für-Schritt-Anleitung zur Entwicklung eines Scrapers, der in der Lage ist, Orte aus Google Maps zu analysieren, ohne selbst nach über 1000 Seiten blockiert zu werden.

Was wir für den Bau des Crawlers benötigen

  1. Python 3+.
  2. Chrome-Browser installiert.
  3. Selenium 3.141.0+ (Python-Paket).
  4. Chrome-Treiber (für Ihr Betriebssystem).
  5. Parsel oder eine andere Bibliothek zur Extraktion von Daten aus HTML wie Beautiful Soup.

Schritt-für-Schritt-Anleitung zum Erstellen des Google Maps Extractors

ChromeDriver herunterladen und speichern

Um Selenium mit Google Chrome zu verwenden, müssen Sie Python-Code mit dem Browser verknüpfen, indem Sie ChromeDriver.

Laden Sie die Version von ChromeDriver herunter, die Ihrer Browserversion und Ihrem Betriebssystemtyp entspricht. Die Versionsnummer Ihres Chrome-Browsers können Sie hier finden: Chrom -> Menüsymbol (obere rechte Ecke) -> Hilfe -> Über Google Chrome.

Entpacken Sie die Chromedriver-Datei und speichern Sie sie irgendwo auf Ihrem System (den Pfad dazu werden wir später verwenden). In diesem Übungsbeispiel speichern wir die Datei im Projektordner.

Selenium- und Parsel-Pakete installieren

Installieren Sie die Pakete Selenium und Parsel, indem Sie die folgenden Befehle ausführen. Wir werden Parsel später verwenden, wenn wir Inhalte aus HTML parsen.

				
					pip install selenium
pip install parsel # zum Extrahieren von Daten aus HTML mit XPath oder CSS-Selektoren
				
			

Webdriver initialisieren und starten

Bevor Sie den Webdriver initialisieren, vergewissern Sie sich, dass Sie die vorherigen Schritte durchgeführt haben und dass Sie den Pfad zu Ihrer Chromedriver-Datei haben. Initialisieren Sie den Treiber mit dem folgenden Code. Sie sollten sehen, dass sich das neue Chrome-Fenster öffnet.

				
					von selenium import webdriver


chromedrive_path = './chromedriver' # verwenden Sie den Pfad zum Treiber, den Sie aus den vorherigen Schritten heruntergeladen haben
driver = webdriver.Chrome(chromedrive_path)
				
			

Auf dem Mac sehen Sie möglicherweise Folgendes: "chromedriver kann nicht geöffnet werden, weil der Entwickler nicht verifiziert werden kann". Um dieses Problem zu beheben, klicken Sie bei gedrückter Maustaste auf den Chromedriver im Finder, wählen Sie im Menü den Eintrag Öffnen und klicken Sie dann im erscheinenden Dialog auf Öffnen. Im geöffneten Terminalfenster sollten Sie "ChromeDriver wurde erfolgreich gestartet" sehen. Schließen Sie es und danach können Sie ChromeDriver aus Ihrem Code heraus starten.

Google Maps Seite herunterladen

Once you start the driver you are ready to open some pages. To open any page, use the "get" command.

				
					url = 'https://www.google.com/maps/search/bars+nahe+NY,+USA/@40.7443439,-74.0197995,13z'
driver.get(url)
				
			

Parsen von Karten Suchinhalt

Sobald Ihre Seite geöffnet ist, sehen Sie die Seite in Ihrem Browserfenster, die von Ihrem Python-Code gesteuert wird. Sie können den folgenden Code ausführen, um den HTML-Seiteninhalt von ChromeDriver abzurufen.

				
					Seite_Inhalt = driver.page_source
				
			

To comfortably see the HTML content, open the developer console in Chrome by opening the Chrome Menu in the upper-right-hand corner of the browser window and selecting More Tools > Developer Tools. Now you should be able to see elements of your page.

Google Maps HTML-Parsing
Suche nach xpath zu Elementen, die wir mit der Entwicklerkonsole erhalten möchten

Sie können den Inhalt der HTML-Seite mit Hilfe Ihrer bevorzugten Parsing-Tools analysieren. Wir verwenden Parsel in diesem Lernprogramm.

				
					von parsel importieren Selektor

Antwort = Selektor(Seite_Inhalt)
				
			

Iterieren Sie über die Listen und rufen Sie die Daten jedes Ortes ab.

				
					Ergebnisse = []

for el in response.xpath('//div[enthält(@aria-label, "Ergebnisse für")]/div/div[./a]'):
    results.append({
        'link': el.xpath('./a/@href').extract_first(''),
        'title': el.xpath('./a/@aria-label').extract_first('')
    })
    
print(results)
				
			

Ausgabe von Google Maps places (gekürzt).

				
					[
  {
    'link': 'https://www.google.com/maps/place/Black+Iron+Burger/data=!4m5!3m4!1s0x89c259acf2c7299d:0x149a07481483ce!8m2!3d40.7542649!4d-73.990364?authuser=0&hl=en&rclk=1',
    'title': 'Black Iron Burger'
  },
  {
    'link': 'https://www.google.com/maps/place/Fools+Gold+NYC/data=!4m5!3m4!1s0x89c259846e633763:0x69420cb6024065f9!8m2!3d40.723028!4d-73.989794?authuser=0&hl=en&rclk=1',
    'title': 'Fools Gold NYC'
  },
  {
    'link': 'https://www.google.com/maps/place/11th+St.+Bar/data=!4m5!3m4!1s0x89c25976492b11ff:0x14f9cacdef3eb7c1!8m2!3d40.7280546!4d-73.9812525?authuser=0&hl=en&rclk=1',
    'title': '11th St. Bar'
  },
  ...
]
				
			

Stoppen Sie den Treiber, sobald der Extraktionsprozess abgeschlossen ist

Es ist wichtig, den Treiber vor und nach dem Scrapen entsprechend zu starten und zu stoppen. Das ist dasselbe, wie wenn Sie Ihren Browser vor und nach dem Surfen im Internet öffnen und schließen würden. Schließen Sie den Treiber, indem Sie den folgenden Code ausführen.

				
					Treiber.quit()
				
			

Schlussfolgerung und Empfehlungen zur Skalierung und zur Verbesserung der Robustheit des Scrapers

Despite the tricky HTML structure of Google Maps, with Selenium and a good knowledge of XPath and CSS selectors, you can achieve quite good results in scraping. This method of using a browser emulator should protect you from getting blocked. However, if you are going to scale your application you might consider using proxies as well in order to avoid some unexpected troubles.

Parallel laufen

Es ist möglich, Treiber im Multiprocessing (nicht Multithreading) zu betreiben, aber jeder Treiber verbraucht eine CPU. Stellen Sie sicher, dass Sie genug davon haben.

Der ultimative Weg zum Scraping von Google Maps im Unternehmensmaßstab

Da das Scrapen von Google eine ziemliche Herausforderung sein kann, möchten viele Firmen und große Unternehmen mit dem Scrapen von Millionen von Seiten beginnen, ohne Zeit in die Entwicklung und Wartung ihrer eigenen Crawler zu investieren.

Der einfachste Weg, um mit dem Scrapen von Google Maps zu beginnen, ist die Verwendung von Outscraper-Plattform (um Ergebnisse in CSV-Dateien zu erhalten), API, oder SDKs (zur Integration in den Code).

Der einfachste Weg, um mit Google Maps Scraping anzufangen

Installieren Sie das SDK von Outscraper, indem Sie den folgenden Befehl ausführen.

				
					pip install google-services-api
				
			

Initialisieren Sie den Client und suchen Sie nach Einträgen in Google oder analysieren Sie bestimmte Einträge durch Senden von Orts-IDs.

* Sie können das API-Token (SECRET_API_KEY) aus dem Profil-Seite.

				
					von outscraper importieren ApiClient

api_client = ApiClient(api_key='SECRET_API_KEY')

# Suche nach Unternehmen in bestimmten Orten:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Abrufen der Daten eines bestimmten Ortes anhand der ID
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Suche mit vielen Abfragen (Batching)
Ergebnis = api_client.google_maps_search([
    'restaurants brooklyn usa',
    'bars brooklyn usa',
], language='en')

print(result)
				
			

Ergebnisausgabe (gekürzt).

				
					[
  [
    {
      "name": "Colonie",
      "full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough": "Brooklyn Heights",
      "street": "127 Atlantic Ave", "street": "127 Atlantic Ave",
      "Stadt": "Brooklyn",
      "postal_code": "11201",
      "country_code": "US",
      "Land": "Vereinigte Staaten von Amerika",
      "us_state": "New York",
      "state": "New York",
      "plus_code": null,
      "latitude": 40.6908464,
      "longitude": -73.9958422,
      "time_zone": "Amerika/New_York",
      "beliebte_Zeiten": null,
      "site": "http://www.colonienyc.com/",
      "phone": "+1 718-855-7500",
      "typ": "Amerikanisches Restaurant",
      "Kategorie": "Restaurants",
      "subtypes": "Amerikanisches Restaurant, Cocktailbar, Italienisches Restaurant, Bio-Restaurant, Restaurant, Weinbar",
      "Beiträge": null,
      "rating": 4.6,
      "reviews": 666,
      "bewertungen_daten": null,
      "photos_count": 486,
      "google_id": "0x89c25a4590b8c863:0xc4a4271f166de1e2",
      "place_id": "ChIJY8i4kEVawokR4uFtFh8npMQ",
      "reviews_link": "https://search.google.com/local/reviews?placeid=ChIJY8i4kEVawokR4uFtFh8npMQ&q=restaurants+brooklyn+usa&authuser=0&hl=de&gl=US",
      "reviews_id": "-4277250731621359134",
      "photo": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w800-h500-k-no",
      "street_view": "https://lh5.googleusercontent.com/p/AF1QipN_Ani32z-7b9XD182oeXKgQ-DIhLcgL09gyMZf=w1600-h1000-k-no",
      "arbeitszeiten_alt_format": "Monday: 5\u20139:30PM | Tuesday: Geschlossen | Mittwoch: Geschlossen | Donnerstag: 5\u20139:30PM | Freitag: 5\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\u20133PM,5\u20139:30PM",
      "working_hours": {
        "Monday": "5\u20139:30PM",
        "Dienstag": "Geschlossen",
        "Mittwoch": "Geschlossen",
        "Donnerstag": "17:30 Uhr",
        "Freitag": "5\u20139:30PM",
        "Samstag": "11AM\\u20133PM,5\\u20139:30PM",
        "Sonntag": "11AM\\u20133PM,5\\u20139:30PM"
      },
      "business_status": "OPERATIONAL",
      },
      "reserving_table_link": "https://resy.com/cities/ny/colonie",
      "booking_appointment_link": "https://resy.com/cities/ny/colonie",
      "owner_id": "114275131377272904229",
      "verifiziert": wahr,
      "owner_title": "Kolonie",
      "eigentümer_link": "https://www.google.com/maps/contrib/114275131377272904229",
      "location_link": "https://www.google.com/maps/place/Colonie/@40.6908464,-73.9958422,14z/data=!4m8!1m2!2m1!1sColonie!3m4!1s0x89c25a4590b8c863:0xc4a4271f166de1e2!8m2!3d40.6908464!4d-73.9958422"
      ...
    },
   ...
  ]
]
				
			

Extra: Der einfachste Weg, mit dem Scraping von Google-Bewertungen anzufangen

Sie können Bewertungen extrahieren, indem Sie den folgenden Code ausführen (vorausgesetzt, Sie haben das Python-Paket installiert und den Client gestartet).

				
					# Abrufen von Bewertungen für einen bestimmten Ort nach einer ID
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Abrufen von Bewertungen für Orte, die durch eine Suchanfrage gefunden wurden
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Nur neue Bewertungen der letzten 24 Stunden abrufen
from datetime import datetime, timedelta
gestern_Zeitstempel = int((datetime.now() - timedelta(1)).timestamp())

ergebnis = api_client.google_maps_reviews(
    'ChIJrc9T9fpYwokRdvjYRHT8nI4', sort='newest', cutoff=yesterday_timestamp, reviewsLimit=100, language='de')
				
			

Ergebnisausgabe (gekürzt).

				
					{
  "name": "Memphis Seoul",
  "address": "569 Lincoln Pl, Brooklyn, NY 11238, \\\u0421\\u043f\\u043e\\u043b\u0443\\u0447\u0435\\u043d\\u0456 \\u0428\u0442\u0430\u0442\u0438",
  "address_street": "569 Lincoln Pl",
  "owner_id": "100347822687163365487",
  "owner_link": "https://www.google.com/maps/contrib/100347822687163365487",
  ...
  "reviews_data": [
    {
      "google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link": "https://www.google.com/maps/contrib/112314095435657473333?hl=en-US",
      "autor_name": "Eliott Levy",
      "autor_id": "112314095435657473333",
      "review_text": "Sehr gutes lokales Komfort-Fusion-Essen ! \\nKimchi Krautsalat !! So eine tolle Idee !",
      "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s112314095435657473333!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating": 5,
      "review_timestamp": 1560692128,
      "review_datetime_utc": "06/16/2019 13:35:28",
      "review_likes": null
    },
    {
      "google_id": "0x89c25bb5950fc305:0x330a88bf1482581d",
      "autor_link": "https://www.google.com/maps/contrib/106144075337788507031?hl=en-US",
      "autor_name": "fenwar1",
      "autor_id": "106144075337788507031",
      "review_text": "Tolle Wings mit verschiedenen Arten von scharfer Sauce. Die Mac and Cheese Ramen sind ausgezeichnet.\\nUPDATE:\\nWir sind später zurückgekehrt, um den Hackbraten-Slider zu probieren, eine dicke, fleischige Scheibe mit Krautsalat und einer fantastischen Soße - köstlich. \\\nBetrachten Sie mich als Stammgast.\\ud83d\\udc4d",
      "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s106144075337788507031!2s0x0:0x330a88bf1482581d?hl=en-US",
      "review_rating": 5,
      "review_timestamp": 1571100055,
      "review_datetime_utc": "10/15/2019 00:40:55",
      "review_likes": null
    },
    ...
  ]
}
				
			
Kategorien: Pyhton

Vlad

Projektleiter Linkedin

0 Kommentare

Schreibe einen Kommentar

Avatar-Platzhalter