Índice

Como ya sabrá, el API oficial de Google Places está limitado a 5 opiniones por lugar. Por lo tanto, los desarrolladores están estudiando la posibilidad de obtener todas las reseñas de cualquier negocio en Google Maps.

Scrapear Google con todas sus protecciones y páginas de renderizado dinámico puede ser una tarea difícil. Afortunadamente, hay muchas herramientas que puedes utilizar para scrapear reseñas en python o cualquier otro lenguaje de programación. En esta entrada de blog, verás las dos herramientas más comunes para scrapear reseñas de Google: emulación de navegador y Plataforma Outscraper. Cada una de ellas es suficiente para obtener todas las reseñas de cualquier listado de maps.

Scraping Google Reviews en Python usando el navegador para renderizar contenido dinámico

Utilizaremos Selenio para controlar el navegador Chrome. El navegador renderizará las páginas dinámicas de Google Reviews. Para empezar a construir el raspador de reseñas con Selenium, necesitaremos lo siguiente:

  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 librería para extraer datos de HTML, como Beautiful Soup.

Instalar Selenium y otros paquetes

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
				
			

Iniciar el navegador

Antes de iniciar el driver, asegúrate de que has realizado los pasos anteriores y de que tienes la ruta a tu archivo chromedriver. Inicializa el driver con el siguiente código. Deberías ver la nueva ventana del navegador abierta.

				
					from selenium import webdriver


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

Puede que veas lo siguiente en mac: "chromedriver no se puede abrir porque el desarrollador no puede ser verificado". Para solucionarlo, haz control-clic en el chromedriver en Finder, elige 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 todas las reseñas

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/place/Central+Park+Zoo/@40.7712318,-73.9674707,15z/data=!3m1!5s0x89c259a1e735d943:0xb63f84c661f84258!4m16!1m8!3m7!1s0x89c258faf553cfad:0x8e9cfc7444d8f876!2sTrump+Tower!8m2!3d40.7624284!4d-73.973794!9m1!1b1!3m6!1s0x89c258f1fcd66869:0x65d72e84d91a3f14!8m2!3d40.767778!4d-73.9718335!9m1!1b1?hl=en&hl=en'
driver.get(url)
				
			

Reseñas de Parse

Una vez abierta la página, verá en la ventana de Chrome la página controlada por su código. Puede ejecutar el siguiente código para obtener el contenido de la página HTML del controlador.

				
					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.

raspar los comentarios de google en python
Cómo encontrar la ruta X a las reseñas 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)
				
			

Repasa las revisiones.

				
					results = []

for el in response.xpath('//div/div[@data-review-id]/div[contains(@class, "content")]'):
    results.append({
        'title': el.xpath('.//div[contains(@class, "title")]/span/text()').extract_first(''),
        'rating': el.xpath('.//span[contains(@aria-label, "stars")]/@aria-label').extract_first('').replace('stars' ,'').strip(),
        'body': el.xpath('.//span[contains(@class, "text")]/text()').extract_first(''),
    })
    
print(results)
				
			

Resultado del rastreador de reseñas de Google (abreviado).

				
					[
  {
    'title': 'Wanda Garrett',
    'rating': '5',
    'body': 'Beautiful ✨ park with a family-friendly atmosphere! I had a great time here; seeing all of the animals and learning all of the interesting facts was a fantastic way to spend the day. The zoo is beautifully landscaped and surrounded by …'
  },
  {
    'title': 'Bernadette Bennett',
    'rating': '4',
    'body': 'Worth going for the seals! They are the main attraction and located in the center of the zoo. We watched a live feeding and it was great. The kids loved it. The zoo is well manicured surrounded by gorgeous gardens. Lots of benches to rest …'
  },
  {
    'title': 'Mary Cutrufelli',
    'rating': '3',
    'body': "So not gonna lie... We came from PA. My kid expected to see lions and hippos and zebra from Madagascar. None of that which is there. It's clean it's a nice zoo. I wouldn't go again though."
  },
  ...
]
				
			

Detener el navegador

Es importante iniciar y detener el controlador antes y después del raspado en consecuencia. Es lo mismo que abrir y cerrar el navegador antes y después de navegar por Internet. Detén el navegador ejecutando el siguiente código.

				
					driver.quit()
				
			

A pesar de la complicada estructura HTML de Google Reviews, con Selenium y un buen conocimiento de XPath y selectores CSS, puedes conseguir resultados bastante buenos en el scraping. Este método de utilizar un emulador de navegador debería protegerte de ser bloqueado. Sin embargo, si escalas tu aplicación, considera el uso de proxies para evitar problemas inesperados.

Multiprocesamiento y otras recomendaciones

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

La forma más fácil de scrapear reseñas de Google en Python

Extraer datos de Google con navegadores tiene sus pros y sus contras. Aunque puedes desarrollar el scraper por ti mismo, durante el escalado, podría conllevar grandes gastos por el uso de servidores con enormes cantidades de CPU para manejar las emulaciones de los navegadores. Además, debe haber una persona que mantenga el rastreador y lo actualice durante los cambios del sitio de Google.

Mediante el uso Plataforma OutscraperAPISDKs, Outscraper proporciona la solución más sencilla para que empresas y particulares empiecen a hacer Scraping de reseñas de Google sin necesidad de manejar proxies, emular navegadores ni invertir en desarrollo.

Raspar reseñas en Python usando el SDK

1. Necesitará python3+ y esto paquete python. Instale el paquete ejecutando el comando.

				
					pip install google-services-api
				
			

2. Obtenga su clave API en el Página de perfil.

3. Importar el paquete e inicializarlo con la clave.

4. Especifique la ubicación proporcionando un enlace, un Id de lugar o un nombre.

				
					from outscraper import ApiClient


api_cliet = ApiClient(api_key='KEY_FROM_OUTSCRAPER')
response = api_cliet.google_maps_reviews(
    'https://www.google.com/maps/place/Do+or+Dive+Bar/@40.6867831,-73.9570104,17z/data=!3m2!4b1!5s0x89c25b96a0b10eb9:0xfe4f81ff249e280d!4m5!3m4!1s0x89c25b96a0b30001:0x643d0464b3138078!8m2!3d40.6867791!4d-73.9548217',
    language='en',
    limit=100
)
				
			

5. Espere unos segundos hasta que se obtengan las reseñas.

				
					[
    {
        "name": "Do or Dive Bar",
        "full_address": "1108 Bedford Ave, Brooklyn, NY 11216, United States",
        "borough": "Bedford-Stuyvesant",
        "street": "1108 Bedford Ave",
        "city": "Brooklyn",
        "postal_code": "11216",
        "country_code": "US",
        "country": "United States of America",
        "us_state": "New York",
        "state": "New York",
        "plus_code": null,
        "latitude": 40.686779099999995,
        "longitude": -73.9548217,
        "time_zone": "America/New_York",
        "site": "https://www.doordivebedstuy.com/",
        "phone": "+1 917-867-5309",
        "type": "Bar",
        "rating": 4.5,
        "reviews": 425,
        "reviews_data": [
            {
                "google_id": "0x89c25b96a0b30001:0x643d0464b3138078",
                "autor_link": "https://www.google.com/maps/contrib/115539085325450648866?hl=en-US",
                "autor_name": "Sam Grjaznovs",
                "autor_id": "115539085325450648866",
                "autor_image": "https://lh3.googleusercontent.com/a-/AOh14GgxmEH7a10v6Bo8AFb6OkbyxxfIBPXbMYVAxeSIRA=c0x00000000-cc-rp-ba3",
                "review_text": "Cozy shin dig with an assortment of drinks. They have a strong specialty for 10bucks and merch too. They have out side dining as well as back yard area. Ask for Brandon every other Saturday. He\u2019s hella cute!",
                "review_img_url": "https://lh5.googleusercontent.com/p/AF1QipPNs8QvvdkBonV5wuxdoylFjLY3k7L6muepbDq-",
                "owner_answer": null,
                "owner_answer_timestamp": null,
                "owner_answer_timestamp_datetime_utc": null,
                "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s115539085325450648866!2s0x0:0x643d0464b3138078?hl=en-US",
                "review_rating": 5,
                "review_timestamp": 1603781021,
                "review_datetime_utc": "10/27/2020 06:43:41",
                "review_likes": 0,
                "reviews_id": "7222934207919784056"
            },
            {
                "google_id": "0x89c25b96a0b30001:0x643d0464b3138078",
                "autor_link": "https://www.google.com/maps/contrib/110571545135018844510?hl=en-US",
                "autor_name": "Arabella Stephens",
                "autor_id": "110571545135018844510",
                "autor_image": "https://lh3.googleusercontent.com/a-/AOh14GisqDfheDO0Aq0cu1Z7YBTbzLyvSEvM3IMDKg3q=c0x00000000-cc-rp",
                "review_text": "Great atmosphere, always fun vibe and good beers. I live in the area and this is a very reliable standby. Would recommend to anyone who is not pretentious and likes a bit of clutter in their watering hole.",
                "review_img_url": "https://lh3.googleusercontent.com/a-/AOh14GisqDfheDO0Aq0cu1Z7YBTbzLyvSEvM3IMDKg3q",
                "owner_answer": null,
                "owner_answer_timestamp": null,
                "owner_answer_timestamp_datetime_utc": null,
                "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s110571545135018844510!2s0x0:0x643d0464b3138078?hl=en-US",
                "review_rating": 5,
                "review_timestamp": 1614111762,
                "review_datetime_utc": "02/23/2021 20:22:42",
                "review_likes": 0,
                "reviews_id": "7222934207919784056"
            },
            {
                "google_id": "0x89c25b96a0b30001:0x643d0464b3138078",
                "autor_link": "https://www.google.com/maps/contrib/101725757133547547783?hl=en-US",
                "autor_name": "Jack Parker",
                "autor_id": "101725757133547547783",
                "autor_image": "https://lh3.googleusercontent.com/a-/AOh14GjFK9CLb8__u5PtJzH1rGuX4DVgPvjaEeIkSJnCNw=c0x00000000-cc-rp",
                "review_text": "All the bartenders are rad. Cheap drinks, and a nice backyard. They have space heaters, but I would still recommend bundling up if you plan on spending a while there. Jeopardy night is always fun too. Can\u2019t wait to sit inside again!",
                "review_img_url": "https://lh3.googleusercontent.com/a-/AOh14GjFK9CLb8__u5PtJzH1rGuX4DVgPvjaEeIkSJnCNw",
                "owner_answer": null,
                "owner_answer_timestamp": null,
                "owner_answer_timestamp_datetime_utc": null,
                "review_link": "https://www.google.com/maps/reviews/data=!4m5!14m4!1m3!1m2!1s101725757133547547783!2s0x0:0x643d0464b3138078?hl=en-US",
                "review_rating": 5,
                "review_timestamp": 1611947492,
                "review_datetime_utc": "01/29/2021 19:11:32",
                "review_likes": 0,
                "reviews_id": "7222934207919784056"
            },
            ...
        ]
]
				
			

Paquete Python ► https://pypi.org/project/google-services-api
API ► https://app.outscraper.com/api-docs

Video Tutorial

Preguntas más frecuentes

Preguntas y respuestas más frecuentes

Gracias a la API de reseñas de Google Maps de Outscraper, es posible scrapear todas las reseñas de Google Maps. Los servicios API de Outscraper le permiten hacer scraping sin límites.

Existe un servicio API para las reseñas de Google Maps. Se trata de Outscraper's Google Maps Reviews API. Gracias a los servicios de Outscraper, puede exportar y descargar todas las reseñas de Google Maps.

Las revisiones se pueden raspar con Python y Selenium. Se explica en detalle en el artículo "Scraping de todas las reseñas de Google en Python“.


Vlad

Director de proyectos Linkedin