Guía para obtener datos de Google Maps con Python

Comentarios: 0

La extracción de datos de Google Maps mediante Python permite recopilar información valiosa sobre ubicaciones, negocios y servicios, lo que resulta beneficioso para el análisis de mercado, la identificación de ubicaciones óptimas para nuevos locales, el mantenimiento de los directorios actuales, el análisis de la competencia y la medición de la popularidad de los lugares. Esta guía proporciona un recorrido completo sobre cómo extraer información de Google Maps utilizando las bibliotecas de Python requests y lxml. Incluye instrucciones detalladas sobre cómo realizar solicitudes, manejar respuestas, analizar datos estructurados y exportarlos a un archivo CSV.

Cómo configurar el entorno

Asegúrate de tener instaladas las siguientes librerías de Python:

  • requests;
  • lxml;
  • csv (biblioteca estándar).

Instala estas librerías usando pip si es necesario:


pip install requests
pip install lxml

A continuación, presentaremos un proceso de scraping paso a paso, completo con ejemplos.

Guía paso a paso para el scraping de datos de Google Maps

En las siguientes secciones, recorreremos un proceso detallado paso a paso para raspar datos de Google Maps, completo con ejemplos visuales para guiarlo a través de cada etapa.

Paso 1. Definir la URL de destino

Especifica la URL desde la que quieres hacer scraping de datos.


url = "https link"

Paso 2. Definir cabeceras y proxies

Configurar las cabeceras apropiadas es crucial para imitar las actividades de un usuario genuino, reduciendo significativamente las posibilidades de que el scraper sea marcado como bot. Además, la integración de servidores proxy ayuda a mantener actividades de scraping continuas al eludir cualquier bloqueo que pueda surgir por superar los límites de solicitudes asociados a una única dirección 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",
}

Paso 3. Obtener el contenido de la página

Envía una petición a la URL de Google Maps y obtén el contenido de la página:


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

Paso 4. Analizar el contenido HTML

Utiliza lxml para analizar el contenido HTML:


from lxml import html

parser = html.fromstring(page_content)

Identificación de los XPaths de datos

Entender la estructura del documento HTML es crucial para extraer los datos correctamente. Usted necesita identificar las expresiones XPath para los puntos de datos que desea raspar. He aquí cómo puedes hacerlo:

  1. Inspeccione la página web: Abre la página de Google Maps en un navegador web y utiliza las herramientas de desarrollador del navegador (botón derecho > Inspeccionar) para examinar la estructura HTML.
  2. Encuentra los elementos relevantes: Busque los elementos HTML que contienen los datos que desea raspar (por ejemplo, nombres de restaurantes, direcciones).
  3. Escriba XPaths: Basándose en la estructura HTML, escriba expresiones XPath para extraer los datos. Para esta guía, los XPaths son:

Nombre del restaurante:


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

Dirección:


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

Opciones:


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

Geo Latitud:


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

Longitud geográfica:


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

Paso 5. Extracción de datos

Extraer los datos utilizando los XPaths identificados:


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]

    # Añadir a la lista de datos
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

Paso 6. Guardar los datos en CSV

Guarde los datos extraídos en un archivo 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)

Código completo

Aquí tienes el código completo para scrapear los datos de Google Maps:


import requests
from lxml import html
import csv

# Definir la URL de destino y las cabeceras
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",
}

# Obtener el contenido de la página
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()

# Analizar el contenido HTML
parser = html.fromstring(page_content)

# Extraer datos mediante 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]

    # Añadir a la lista de datos
    data.append({
        "restaurant_name": restaurant_name,
        "address": address,
        "options": options,
        "geo_latitude": geo_latitude,
        "geo_longitude": geo_longitude
    })

# Guardar datos en 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.")

Para un raspado web eficaz, es crucial utilizar las cabeceras de solicitud y los proxies adecuados. Las opciones óptimas de proxy son los proxies de centros de datos o ISP, que ofrecen altas velocidades y baja latencia. Sin embargo, dado que se trata de proxies estáticos, es necesario implementar la rotación de IP para evitar el bloqueo de forma eficaz. Una opción alternativa y más fácil de usar es utilizar proxies residenciales. Estos proxies dinámicos simplifican el proceso de rotación y tienen un mayor factor de confianza, lo que los hace más eficaces para eludir los bloqueos.

Comentarios:

0 Comentarios