Guida allo scraping dei dati di Google Maps con Python

Commenti: 0

Lo scraping di dati da Google Maps utilizzando Python consente di raccogliere informazioni preziose su luoghi, aziende e servizi, utili per l'analisi di mercato, l'identificazione di nuove sedi ottimali, la manutenzione degli elenchi attuali, l'analisi della concorrenza e la valutazione della popolarità dei luoghi. Questa guida fornisce una guida completa su come estrarre informazioni da Google Maps utilizzando le librerie Python requests e lxml. Include istruzioni dettagliate su come effettuare le richieste, gestire le risposte, analizzare i dati strutturati ed esportarli in un file CSV.

Impostazione dell'ambiente

Assicurarsi di avere installato le seguenti librerie Python:

  • Richieste;
  • lxml;
  • csv (libreria standard).

Installare queste librerie usando pip, se necessario:


pip install requests
pip install lxml

Di seguito, presenteremo un processo di scraping passo dopo passo, completo di esempi.

Guida passo passo allo scraping di dati da Google Maps

Nelle sezioni che seguono, illustreremo un processo dettagliato, passo dopo passo, per lo scraping dei dati da Google Maps, completo di esempi visivi che vi guideranno in ogni fase.

Fase 1. Definire l'URL di destinazione

Specificare l'URL da cui si desidera effettuare lo scraping dei dati.


url = "https link"

Fase 2. Definire intestazioni e deleghe

L'impostazione di intestazioni appropriate è fondamentale per imitare le attività di un utente reale, riducendo in modo significativo le possibilità che lo scraper venga segnalato come bot. Inoltre, l'integrazione di server proxy aiuta a mantenere un'attività di scraping continua, aggirando eventuali blocchi che potrebbero derivare dal superamento dei limiti di richiesta associati a un singolo indirizzo IP.


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",
}

Fase 3. Recuperare il contenuto della pagina

Inviare una richiesta all'URL di Google Maps e ottenere il contenuto della pagina:


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}")

Fase 4. Analizzare il contenuto HTML

Utilizzare lxml per analizzare il contenuto HTML:


from lxml import html

parser = html.fromstring(page_content)

Identificazione degli XPath dei dati

La comprensione della struttura del documento HTML è fondamentale per estrarre correttamente i dati. È necessario identificare le espressioni XPath per i punti di dati che si desidera estrarre. Ecco come fare:

  1. Ispettare la pagina web: Aprite la pagina di Google Maps in un browser web e utilizzate gli strumenti di sviluppo del browser (clic destro > Ispeziona) per esaminare la struttura HTML.
  2. Trovare gli elementi rilevanti: Cercare gli elementi HTML che contengono i dati che si desidera scrappare (ad esempio, nomi di ristoranti, indirizzi).
  3. Scrivere XPaths: Sulla base della struttura HTML, scrivere espressioni XPath per estrarre i dati. Per questa guida, gli XPath sono:

Nome del ristorante:


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

Indirizzo:


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

Opzioni:


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

Geo Latitudine:


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

Geo Longitudine:


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

Fase 5. Estrazione dei dati

Estrarre i dati utilizzando gli XPath identificati:


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]

    # Aggiungere all'elenco dei dati
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

Fase 6. Salvare i dati in CSV

Salvare i dati estratti in un file CSV:


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)

Codice completo

Ecco il codice completo per lo scraping dei dati di Google Maps:


import requests
from lxml import html
import csv

# Definire l'URL di destinazione e le intestazioni
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",
}

# Recuperare il contenuto della pagina
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()

# Analizzare il contenuto HTML
parser = html.fromstring(page_content)

# Estrarre i dati con XPath
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]

    # Aggiungere all'elenco dei dati
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# Salvare i dati in 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)

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

Per uno scraping web efficace, è fondamentale utilizzare le intestazioni di richiesta e i proxy giusti. I proxy ottimali sono quelli dei centri dati o degli ISP, che offrono velocità elevate e bassa latenza. Tuttavia, poiché si tratta di proxy statici, è necessario implementare la rotazione degli IP per prevenire efficacemente il blocco. Un'opzione alternativa e più semplice è quella di utilizzare i proxy residenziali. Questi proxy dinamici semplificano il processo di rotazione e hanno un fattore di fiducia più elevato, che li rende più efficaci nell'aggirare i blocchi.

Commenti:

0 Commenti