Índice

Utilizando Selenio en el raspado de datos es algo bastante común. Automatiza los navegadores y permite simular actividades de usuarios reales para evitar ser bloqueado. Es especialmente útil cuando se rastrean 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.

scrpae google maps by selenium
Control del navegador Chrome con Selenium

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.

Descarga la versión de ChromeDriver que coincida con la versión de tu navegador y el tipo de sistema operativo. Puedes encontrar el número de versión de tu navegador Chrome 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 # to extract data from HTML using XPath or CSS selectors
				
			

Inicializar e iniciar Webdriver

Antes de inicializar Webdriver asegúrese de haber realizado los pasos anteriores y de tener la ruta a su archivo chromedriver. Inicializa el driver con el siguiente código. Deberías ver la nueva ventana de Chrome abierta.

				
					from selenium import webdriver


chromedrive_path = './chromedriver' # use the path to the driver you downloaded from previous steps
driver = webdriver.Chrome(chromedrive_path)
				
			

En mac puede que veas lo siguiente "chromedriver no se puede abrir porque no se puede verificar el desarrollador". Para solucionarlo, haz clic en el chromedriver en Finder, selecciona Abrir en el menú y, a continuación, haz clic en Abrir en el cuadro de diálogo que aparece. Deberías ver "ChromeDriver se ha iniciado correctamente" en la ventana de terminal abierta. Ciérrala 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 desarrollador en Chrome abriendo el menú de Chrome en la esquina superior derecha de la ventana del navegador y seleccionando Más herramientas > Herramientas de desarrollador. Ahora deberías poder ver elementos de tu página.

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

Puede analizar el contenido de la página HTML utilizando sus herramientas de análisis preferidas. 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.

				
					results = []

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

Salida de lugares de Google Maps (abreviada).

				
					[
  {
    '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'
  },
  ...
]
				
			

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 que tienes 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), APISDKs (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')

# Search for businesses in specific locations:
result = api_client.google_maps_search('restaurants brooklyn usa', limit=20, language='en')

# Get data of the specific place by id
result = api_client.google_maps_search('ChIJrc9T9fpYwokRdvjYRHT8nI4', language='en')

# Search with many queries (batching)
result = api_client.google_maps_search([
    'restaurants brooklyn usa',
    'bars brooklyn usa',
], language='en')

print(result)
				
			

Salida de resultados (acortada).

				
					[
  [
    {
      "name": "Colonie",
      "full_address": "127 Atlantic Ave, Brooklyn, NY 11201",
      "borough": "Brooklyn Heights",
      "street": "127 Atlantic Ave",
      "city": "Brooklyn",
      "postal_code": "11201",
      "country_code": "US",
      "country": "United States of America",
      "us_state": "New York",
      "state": "New York",
      "plus_code": null,
      "latitude": 40.6908464,
      "longitude": -73.9958422,
      "time_zone": "America/New_York",
      "popular_times": null,
      "site": "http://www.colonienyc.com/",
      "phone": "+1 718-855-7500",
      "type": "American restaurant",
      "category": "restaurants",
      "subtypes": "American restaurant, Cocktail bar, Italian restaurant, Organic restaurant, Restaurant, Wine bar",
      "posts": null,
      "rating": 4.6,
      "reviews": 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": "Monday: 5\\u20139:30PM | Tuesday: Closed | Wednesday: Closed | Thursday: 5\\u20139:30PM | Friday: 5\\u20139:30PM | Saturday: 11AM\\u20133PM,5\\u20139:30PM | Sunday: 11AM\\u20133PM,5\\u20139:30PM",
      "working_hours": {
        "Monday": "5\\u20139:30PM",
        "Tuesday": "Closed",
        "Wednesday": "Closed",
        "Thursday": "5\\u20139:30PM",
        "Friday": "5\\u20139:30PM",
        "Saturday": "11AM\\u20133PM,5\\u20139:30PM",
        "Sunday": "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).

				
					# Get reviews of the specific place by id
result = api_client.google_maps_reviews('ChIJrc9T9fpYwokRdvjYRHT8nI4', reviewsLimit=20, language='en')

# Get reviews for places found by search query
result = api_client.google_maps_reviews('Memphis Seoul brooklyn usa', reviewsLimit=20, limit=500, language='en')

# Get only new reviews during last 24 hours
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).

				
					{
  "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": "Very good local comfort fusion food ! \\nKimchi coleslaw !! Such an amazing idea !",
      "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": "Great wings with several kinds of hot sauce. The mac and cheese ramen is excellent.\\nUPDATE:\\nReturned later to try the meatloaf slider, a thick meaty slice  topped with slaw and a fantastic sauce- delicious. \\nConsider me a regular.\\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
    },
    ...
  ]
}
				
			

Preguntas más frecuentes

Preguntas y respuestas más frecuentes

Gracias al SDK de Outscraper, es posible scrapear datos de Google Maps con Python Selenium. Consulta la documentación de Outscraper Google Maps Places API para ver lo que puedes hacer.

Usando Python y Selenium, es posible automatizar el proceso de scraping de datos de Google Maps. Outscraper ofrece un API de Places de Google Maps y SDK que simplifican esta tarea.

Es posible automatizar el scraping de Google Maps utilizando Python y Selenium. Outscraper API de Google Maps Places y los SDK le permiten hacerlo de la forma más sencilla.

Categorías: Pyhton

Vlad

Director de proyectos Linkedin

Comentarios de 0

Deja una respuesta

Marcador de posición de Avatar