Anleitung zum Scrapen von Google Maps-Daten mit Python

Bemerkungen: 0

Das Scraping von Daten aus Google Maps mit Python ermöglicht die Sammlung wertvoller Informationen über Standorte, Unternehmen und Dienstleistungen, die für Marktanalysen, die Ermittlung optimaler neuer Veranstaltungsorte, die Pflege aktueller Verzeichnisse, die Analyse von Wettbewerbern und die Messung der Beliebtheit von Orten von Nutzen sind. Dieses Handbuch bietet eine umfassende Anleitung, wie man mit den Python-Bibliotheken requests und lxml Informationen aus Google Maps extrahiert. Er enthält detaillierte Anweisungen für die Erstellung von Anfragen, die Behandlung von Antworten, das Parsen strukturierter Daten und den Export in eine CSV-Datei.

Einrichten der Umgebung

Stellen Sie sicher, dass Sie die folgenden Python-Bibliotheken installiert haben:

  • requests;
  • lxml;
  • csv (Standardbibliothek).

Installieren Sie diese Bibliotheken bei Bedarf mit pip:


pip install requests
pip install lxml

Im Folgenden wird das Scraping Schritt für Schritt und anhand von Beispielen erläutert.

Schritt-für-Schritt-Anleitung zum Scraping von Daten aus Google Maps

In den folgenden Abschnitten werden wir einen detaillierten Schritt-für-Schritt-Prozess für das Scraping von Daten aus Google Maps durchlaufen, komplett mit visuellen Beispielen, um Sie durch jede Phase zu führen.

Schritt 1. Definieren Sie die Ziel-URL

Geben Sie die URL an, von der Sie Daten abrufen möchten.


url = "https link"

Schritt 2. Kopfzeilen und Proxys definieren

Die Einrichtung geeigneter Header ist entscheidend für die Nachahmung der Aktivitäten eines echten Benutzers, wodurch die Wahrscheinlichkeit, dass der Scraper als Bot eingestuft wird, erheblich verringert wird. Darüber hinaus hilft die Integration von Proxy-Servern dabei, kontinuierliche Scraping-Aktivitäten aufrechtzuerhalten, indem Sperren umgangen werden, die durch das Überschreiten der mit einer einzelnen IP-Adresse verbundenen Anfragelimits entstehen könnten.


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}

proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

Schritt 3. Abrufen des Seiteninhalts

Senden Sie eine Anfrage an die Google Maps URL und rufen Sie den Seiteninhalt ab:


import requests

response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")

Schritt 4. Parsen des HTML-Inhalts

Verwenden Sie lxml, um den HTML-Inhalt zu parsen:


from lxml import html

parser = html.fromstring(page_content)

Identifizierung der Daten XPaths

Das Verständnis der Struktur des HTML-Dokuments ist entscheidend für die korrekte Extraktion von Daten. Sie müssen die XPath-Ausdrücke für die Datenpunkte identifizieren, die Sie auslesen wollen. So können Sie dies tun:

  1. Inspect the Web Page: Öffnen Sie die Google Maps-Seite in einem Webbrowser und verwenden Sie die Entwicklertools des Browsers (Rechtsklick > Untersuchen), um die HTML-Struktur zu untersuchen.
  2. Finden Sie die relevanten Elemente: Suchen Sie nach den HTML-Elementen, die die Daten enthalten, die Sie auslesen möchten (z. B. Restaurantnamen, Adressen).
  3. XPaths schreiben: Schreiben Sie auf der Grundlage der HTML-Struktur XPath-Ausdrücke, um die Daten zu extrahieren. Für diese Anleitung lauten die XPaths:

Restaurant Name:


//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()

Adresse:


 //div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[2]/text()

Optionen:


 = ', '.join(result.xpath('.//div[@jscontroller="AtSb"]/div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))

Geo-Breitengrad:


//div[@jscontroller="AtSb"]/div/@data-lat

Geo-Längengrad:


 //div[@jscontroller="AtSb"]/div/@data-lng

Schritt 5. Daten extrahieren

Extrahieren Sie die Daten anhand der ermittelten XPaths:


results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    # An die Datenliste anhängen
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

Schritt 6. Daten im CSV-Format speichern

Speichern Sie die extrahierten Daten in einer CSV-Datei:


import csv

with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

Kompletter Code

Hier ist der vollständige Code für das Scraping von Google Maps-Daten:


import requests
from lxml import html
import csv

# Definieren Sie die Ziel-URL und die Kopfzeilen
url = "https://www.google.com/search?sca_esv=04f11db33f1535fb&sca_upv=1&tbs=lf:1,lf_ui:4&tbm=lcl&sxsrf=ADLYWIIFVlh6WQCV6I2gi1yj8ZyvZgLiRA:1722843868819&q=google+map+restaurants+near+me&rflfq=1&num=10&sa=X&ved=2ahUKEwjSs7fGrd2HAxWh1DgGHbLODasQjGp6BAgsEAE&biw=1920&bih=919&dpr=1"
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Not)A;Brand";v="99", "Google Chrome";v="127", "Chromium";v="127"',
    'sec-ch-ua-arch': '"x86"',
    'sec-ch-ua-bitness': '"64"',
    'sec-ch-ua-full-version-list': '"Not)A;Brand";v="99.0.0.0", "Google Chrome";v="127.0.6533.72", "Chromium";v="127.0.6533.72"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-model': '""',
    'sec-ch-ua-platform': '"Linux"',
    'sec-ch-ua-platform-version': '"6.5.0"',
    'sec-ch-ua-wow64': '?0',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
}
proxies = {
    "http": "http://username:password@your_proxy_ip:port",
    "https": "https://username:password@your_proxy_ip:port",
}

# Abrufen des Seiteninhalts
response = requests.get(url, headers=headers, proxies=proxies)
if response.status_code == 200:
    page_content = response.content
else:
    print(f"Failed to retrieve the page. Status code: {response.status_code}")
    exit()

# Analysieren Sie den HTML-Inhalt
parser = html.fromstring(page_content)

# Daten mit XPath extrahieren
results = parser.xpath('//div[@jscontroller="AtSb"]')
data = []

for result in results:
    restaurant_name = result.xpath('.//div/div/div/a/div/div/div/span[@class="OSrXXb"]/text()')[0]
    address = result.xpath('.//div/div/div/a/div/div/div[2]/text()')[0]
    options = ', '.join(result.xpath('.//div/div/div/a/div/div/div[4]/div/span/span[1]//text()'))
    geo_latitude = result.xpath('.//div/@data-lat')[0]
    geo_longitude = result.xpath('.//div/@data-lng')[0]

    # An die Datenliste anhängen
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# Daten im CSV-Format speichern
with open("google_maps_data.csv", "w", newline='', encoding='utf-8') as csv_file:
    writer = csv.DictWriter(csv_file, fieldnames=["restaurant_name", "address", "options", "geo_latitude", "geo_longitude"])
    writer.writeheader()
    for entry in data:
        writer.writerow(entry)

print("Data has been successfully scraped and saved to google_maps_data.csv.")

Für effektives Web-Scraping ist es entscheidend, die richtigen Anfrage-Header und Proxys zu verwenden. Die optimale Wahl für Proxys sind Rechenzentrums- oder ISP-Proxys, die hohe Geschwindigkeiten und geringe Latenzzeiten bieten. Da es sich hierbei jedoch um statische Proxys handelt, muss eine IP-Rotation implementiert werden, um eine Blockierung wirksam zu verhindern. Eine alternative und benutzerfreundlichere Option ist die Verwendung von Proxys für Privatanwender. Diese dynamischen Proxys vereinfachen den Rotationsprozess und haben einen höheren Vertrauensfaktor, wodurch sie Sperren effektiver umgehen können.

Bemerkungen:

0 Bemerkungen