scrpae google maps by selenium
Controlar el navegador Chrome con Selenium

Utilizando Selenio en el raspado de datos es algo bastante común. Automatiza los navegadores y permite simular las actividades reales de los usuarios para evitar ser bloqueados. Es especialmente útil cuando se raspan sitios generados dinámicamente por JavaScript como Google. Además, ayuda a evitar cualquier tipo de protección contra el rastreo, ya que básicamente simula el comportamiento de los clientes reales.

En este artículo, verás un tutorial paso a paso para desarrollar un scraper que sea capaz de analizar lugares de Google Maps sin bloquearse incluso después de más de 1000 páginas.

Qué necesitaremos para construir la oruga

  1. Python 3+.
  2. Navegador Chrome instalado.
  3. Selenium 3.141.0+ (paquete python).
  4. Controlador de Chrome (para su sistema operativo).
  5. Parsel o cualquier otra biblioteca para extraer datos de HTML como Beautiful Soup.

Tutorial paso a paso para construir el extractor de Google Maps

Descargar y guardar ChromeDriver

Para utilizar Selenium con Google Chrome deberá enlazar el código python con el navegador utilizando ChromeDriver.

Descargue la versión de ChromeDriver que coincida con la versión de su navegador y el tipo de sistema operativo. El número de versión de tu navegador Chrome se puede encontrar aquí: Chrom -> Icono del menú (esquina superior derecha) -> Ayuda -> Acerca de Google Chrome.

Desarchiva el archivo chromedriver y guárdalo en algún lugar de tu sistema (la ruta que usaremos más adelante). En este ejemplo del tutorial, guardamos el archivo en la carpeta del proyecto.

Instalar los paquetes Selenium y Parsel

Instala los paquetes Selenium y Parsel ejecutando los siguientes comandos. Utilizaremos Parsel más adelante cuando analicemos el contenido del HTML.

				
					pip install selenium
pip install parsel # para extraer datos de HTML usando selectores XPath o CSS.
				
			

Inicializar e iniciar Webdriver

Antes de inicializar Webdriver asegúrate de que has hecho los pasos anteriores y tienes la ruta de tu archivo chromedriver. Inicializa el driver con el siguiente código. Deberías ver que se abre la nueva ventana de Chrome.

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # utiliza la ruta del driver que has descargado en los pasos anteriores
driver = webdriver.Chrome(chromedrive_path)
				
			

En mac puede ver lo siguiente: "chromedriver no puede abrirse porque el desarrollador no puede ser verificado". Para superar esto, haz clic en el chromedriver en el Finder, elige Abrir en el menú y luego haz clic en Abrir en el diálogo que aparece. Deberías ver "ChromeDriver se inició con éxito" en la ventana de terminal abierta. Ciérralo y después de esto, podrás iniciar ChromeDriver desde tu código.

Descargar la página de Google Maps

Una vez que inicie el controlador, estará listo para abrir algunas páginas. Para abrir cualquier página, utilice el comando "get".

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

Analizar el contenido de la búsqueda de mapas

Una vez que su página se abre, verá la página en la ventana de su navegador que es controlada por su código python. Puedes ejecutar el siguiente código para obtener el contenido de la página HTML de ChromeDriver.

				
					page_content = driver.page_source
				
			

Para ver cómodamente el contenido HTML, abre la consola de desarrollo en Chrome abriendo el menú de Chrome en la esquina superior derecha de la ventana del navegador y seleccionando Más herramientas > Herramientas de desarrollo. Ahora deberías poder ver los elementos de tu página.

análisis HTML de google maps
Encontrar el xpath a los elementos que queremos obtener con la consola del desarrollador

Puedes analizar el contenido de la página HTML utilizando tus herramientas de análisis favoritas. Nosotros utilizaremos Parsel en este tutorial.

				
					from parsel import Selector

response = Selector(page_content)
				
			

Iterar sobre los listados y obtener los datos de cada lugar.

				
					resultados = []

for el in response.xpath('//div[contains(@aria-label, "Resultados para")]/div/div[./a]'):
    results.append({
        'link': el.xpath('./a/@href').extract_first(''),
        'title': el.xpath('./a/@aria-label').extract_first('')
    })
    
print(resultados)
				
			

Salida de lugares de Google Maps (acortada).

				
					[
  {
    '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',
    'título': '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',
    'título': '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',
    'título': 'Bar de la calle 11'
  },
  ...
]
				
			

Detenga el controlador una vez que el proceso de extracción haya finalizado

Es importante iniciar y detener el controlador antes y después del raspado en consecuencia. Es lo mismo que si abrieras y cerraras tu navegador antes y después de navegar por internet. Cierre el controlador ejecutando el siguiente código.

				
					driver.quit()
				
			

Conclusión y recomendaciones para ampliar y hacer más robusto el rascador

A pesar de la complicada estructura HTML de Google Maps, con Selenium y un buen conocimiento de los selectores XPath y CSS, puedes conseguir resultados bastante buenos en el scraping. Este método de usar un emulador de navegador debería protegerte de ser bloqueado. Sin embargo, si vas a escalar tu aplicación podrías considerar el uso de proxies también para evitar algunos problemas inesperados.

Funcionamiento en paralelo

Es posible ejecutar los controladores en multiproceso (no multihilo) pero cada controlador consumirá una CPU. Asegúrate de tener suficientes.

La forma definitiva de raspar Google Maps a escala empresarial

Como el scraping de Google puede ser todo un reto, muchas compañías y grandes empresas quieren empezar a scrapear millones de páginas sin gastar tiempo en desarrollar y mantener sus propios crawlers.

La forma más fácil de empezar a raspar Google Maps es utilizando Plataforma Outscraper (para obtener los resultados en archivos CSV), APIo SDKs (para integrar en el código).

La forma más fácil de empezar con el scraping de Google Maps

Instale el SDK de Outscraper ejecutando el siguiente comando.

				
					pip install google-services-api
				
			

Inicializa el cliente y busca listados en Google o analiza los específicos enviando los ID de los lugares.

* puede obtener el token de la API (SECRET_API_KEY) del Página de perfil.

				
					from outscraper import ApiClient

api_client = ApiClient(api_key='SECRET_API_KEY')

# Buscar negocios en lugares específicos:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Obtener datos del lugar específico por id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='es')

# Búsqueda con muchas consultas (por lotes)
result = api_client.google_maps_search([
    'restaurantes brooklyn usa',
    'bares brooklyn usa',
], language='en')

print(result)
				
			

Salida de resultados (acortada).

				
					[
  [
    {
      "nombre": "Colonie",
      "full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough": "Brooklyn Heights",
      "street": "127 Atlantic Ave",
      "ciudad": "Brooklyn",
      "código postal": "11201",
      "country_code": "US",
      "country": "Estados Unidos de América",
      "us_state": "New York",
      "state": "New York",
      "plus_code": null,
      "latitud": 40.6908464,
      "longitud": -73.9958422,
      "time_zone": "America/New_York",
      "popular_times": null,
      "site": "http://www.colonienyc.com/",
      "phone": "+1 718-855-7500",
      "tipo": "restaurante americano",
      "categoría": "restaurantes",
      "subtipos": "Restaurante americano, Bar de copas, Restaurante italiano, Restaurante ecológico, Restaurante, Bar de vinos",
      "posts": null,
      "valoración": 4.6,
      "opiniones": 666,
      "reviews_data": 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=en&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",
      "working_hours_old_format": "Lunes: 5\u20139:30PM | Martes: Cerrado | Miércoles: Cerrado | Jueves: 5\u20139:30PM | Viernes: 5\u20139:30PM | Sábado: 11AM\u20133PM,5\u20139:30PM | Domingo: 11AM\u20133PM,5\u20139:30PM",
      "working_hours": {
        "Lunes": "5\u20139:30PM",
        "martes": "Cerrado",
        "miércoles": "Cerrado",
        "Jueves": "Cerrado": "5\u20139:30PM",
        "viernes": "5\u20139:30PM",
        "Sábado": "11AM\\u20133PM,5\\u20139:30PM",
        "Domingo": "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",
      "verified": true,
      "owner_title": "Colonie",
      "owner_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: La forma más fácil de empezar con el Google Reviews Scraping

Puede extraer las revisiones ejecutando el siguiente código (se supone que ha instalado el paquete python y ha iniciado el cliente).

				
					# Obtener reseñas del lugar específico por id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='es')

# Obtener las reseñas de los lugares encontrados por la consulta de búsqueda
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='es')

# Obtener sólo las nuevas reseñas de las últimas 24 horas
from datetime import datetime, timedelta
yesterday_timestamp = int((datetime.now() - timedelta(1)).timestamp())

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

Salida de resultados (acortada).

				
					{
  "nombre": "Memphis Seúl",
  "dirección": "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": "¡Muy buena comida local de fusión! \\ensalada de col con kimchi. Una idea increíble !",
      "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": "Estupendas alitas con varios tipos de salsa picante. El ramen de macarrones con queso es excelente.\NActualización:\NVolví más tarde para probar el slider de pastel de carne, una gruesa rebanada de carne cubierta con ensalada de repollo y una fantástica salsa- delicioso. \\Considéreme un habitual,
      "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
    },
    ...
  ]
}
				
			
Categorías: Pyhton

Vlad

Director de proyectos Linkedin

Comentarios de 0

Deja una respuesta

Marcador de posición de Avatar