Índice de contenidos

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

El raspado de Google con todas sus protecciones y páginas de representación dinámica puede ser una tarea difícil. Afortunadamente, hay muchas herramientas que puedes utilizar para raspar reseñas en python o cualquier otro lenguaje de programación. En esta entrada del blog, verás las dos herramientas más comunes de scraping de reseñas de Google: la emulación del navegador y la plataforma Outscraper. Cada una de ellas es suficiente para obtener todas las reseñas de cualquier listado de los mapas.

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 scraper de reseñas con Selenium necesitaremos:

  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.

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 # para extraer datos de HTML usando selectores XPath o CSS.
				
			

Iniciar el navegador

Antes de iniciar el driver 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 del navegador.

				
					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 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 que su página se abra, verá la página en su ventana de Chrome que está 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 desarrollo. Ahora deberías poder ver los elementos de tu página.

raspar los comentarios de google en python
Encontrar el xpath a las revisiones que queremos obtener con la consola de 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)
				
			

Repasa las revisiones.

				
					resultados = []

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)
				
			

Salida del Crwaler de Reseñas de Google (acortada).

				
					[
  {
    'título': 'Wanda Garrett',
    'rating': '5',
    'body': '¡Hermoso parque ✨ con un ambiente familiar! Me lo pasé muy bien aquí; ver todos los animales y aprender todos los datos interesantes fue una manera fantástica de pasar el día. El zoo está bellamente ajardinado y rodeado de...'
  },
  {
    'título': 'Bernadette Bennett',
    'rating': '4',
    'body': '¡Merece la pena ir por las focas! Son la atracción principal y están situadas en el centro del zoo. Vimos una alimentación en vivo y fue genial. A los niños les encantó. El zoo está muy bien cuidado y rodeado de preciosos jardines. Hay muchos bancos para descansar...".
  },
  {
    'título': 'Mary Cutrufelli',
    'rating': '3',
    'body': "Así que no voy a mentir... Venimos de PA. Mi hijo esperaba ver leones, hipopótamos y cebras de Madagascar. Nada de eso que está allí. Es limpio es un zoológico agradable. Sin embargo, no volvería a ir".
  },
  ...
]
				
			

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 en XPath y selectores CSS puedes lograr 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.

Multiprocesamiento y otras recomendaciones

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

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

La extracción de datos de Google con los navegadores tiene sus pros y sus contras. Aunque puedes desarrollar el scraper por ti mismo, durante el escalado, puede suponer 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 Outscraper, APIo SDKs Outscraper proporciona la solución más sencilla para que las empresas y los particulares empiecen a hacer scraping de reseñas de Google sin tener que 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='es',
    limit=100
)
				
			

5. Espere unos segundos hasta que se obtengan las revisiones.

				
					[
    {
        "nombre": "Bar Do o Dive",
        "full_address": "1108 Bedford Ave, Brooklyn, NY 11216, Estados Unidos",
        "borough": "Bedford-Stuyvesant",
        "street": "1108 Bedford Ave",
        "ciudad": "Brooklyn",
        "postal_code": "11216",
        "country_code": "US",
        "country": "Estados Unidos de América",
        "us_state": "New York",
        "state": "New York",
        "plus_code": null,
        "latitud": 40.686779099999995,
        "longitud": -73.9548217,
        "time_zone": "America/New_York",
        "site": "https://www.doordivebedstuy.com/",
        "phone": "+1 917-867-5309",
        "tipo": "Bar",
        "valoración": 4.5,
        "opiniones": 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": "Acogedora cava de espinillas con un surtido de bebidas. Tienen una fuerte especialidad por 10bucks y merchan también. Tienen comedor al aire libre, así como zona de patio trasero. Pregunte por Brandon cada dos sábados. Es muy guapo",
                "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": "Gran ambiente, siempre divertido y buenas cervezas. Vivo en la zona y este es un local de confianza. Lo recomendaría a cualquiera que no sea pretencioso y le guste un poco de desorden en su abrevadero",
                "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": "Todos los camareros son rad. Bebidas baratas, y un bonito patio trasero. Tienen calefactores, pero yo recomendaría abrigarse bien si planeas pasar un rato allí. La noche de Jeopardy siempre es divertida. No puedo esperar a sentarme dentro de nuevo",
                "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"
            },
            ...
        ]
]
				
			

Tutorial en vídeo sobre cómo raspar las reseñas de Google Maps en Python


Extra

Inscríbase ahora y utilice el código de promoción OUTSCRAPER1 conseguir un 10% APAGADO descuento.

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

Vlad

Director de proyectos Linkedin