Cómo extraer datos de Google Trends con Python

Aprenda a extraer datos de Google Trends con Python y utilícelos para la investigación de palabras clave, la obtención de información sobre el mercado y el análisis de tendencias.
14 min de lectura
How to Scrape Google Trends with Python blog image

Google Trendses una herramienta gratuita que proporciona información sobre lo que la gente busca en Internet. Al analizar estas tendencias de búsqueda, las empresas pueden identificar las tendencias emergentes del mercado, comprender el comportamiento de los consumidores y tomar decisiones basadas en datos para impulsar las ventas y los esfuerzos de marketing. La extracción de datos de Google Trends permite a las empresas mantenerse por delante de la competencia al adaptar sus estrategias.

En este artículo, aprenderás a extraer datos de Google Trends utilizando Python y a almacenar y analizar esos datos de forma eficaz.

Por qué extraer datos de Google Trends

Extraer y analizar datos de Google Trends puede ser muy útil en diversos escenarios, entre los que se incluyen los siguientes:

  • Investigación de palabras clave:los creadores de contenido y los especialistas en SEO necesitan saber qué palabras clave están ganando terreno para poder atraer más tráfico orgánico a sus sitios web. Google Trends ayuda a explorar los términos de búsqueda más populares por región, categoría o tiempo, lo que le permite optimizar su estrategia de contenido en función de los intereses cambiantes de los usuarios.
  • Estudio de mercado:los profesionales del marketing deben comprender los intereses de los clientes y anticiparse a los cambios en la demanda para tomar decisiones informadas. Recopilar y analizar los datos de Google Trends les permite comprender los patrones de búsqueda de los clientes y supervisar las tendencias a lo largo del tiempo.
  • Investigación social:varios factores, como los acontecimientos locales y mundiales, las innovaciones tecnológicas, los cambios económicos y los acontecimientos políticos, pueden influir significativamente en el interés público y las tendencias de búsqueda. Los datos de Google Trends proporcionan información valiosa sobre estas tendencias cambiantes a lo largo del tiempo, lo que permite realizar análisis exhaustivos y predicciones futuras fundamentadas.
  • Supervisión de la marca:Las empresas y los equipos de marketing deben supervisar cómo se percibe su marca en el mercado. Al recopilar datos de Google Trends, puede comparar la visibilidad de su marca con la de sus competidores y reaccionar rápidamente a los cambios en la percepción del público.

La alternativa de Bright Data al rastreo de Google Trends: la API SERP de Bright Data

En lugar de extraer manualmente los datos de Google Trends, utilice la API SERP de Bright Data para automatizar la recopilación de datos en tiempo real de los motores de búsqueda. La API SERP ofrece datos estructurados, como resultados de búsqueda y tendencias, con una geolocalización precisa y sin riesgo de bloqueos o CAPTCHAs. Solo se paga por las solicitudes exitosas, y los datos se entregan en formatos JSON o HTML para facilitar su integración.

Esta solución es más rápida, más escalable y elimina la necesidad de complejos scripts de scraping. Comience su prueba gratuita y optimice su recopilación de datos con el scraper de Google Trends de Bright Data.

Cómo extraer datos de Google Trends

Google Trends no ofrece API oficiales para extraer datos de tendencias, pero puede utilizar varias API y bibliotecas de terceros para acceder a esta información, comopytrends, una biblioteca de Python que proporciona API fáciles de usar que le permiten descargar automáticamente informes de Google Trends. Sin embargo, aunque pytrends es fácil de usar, proporciona datos limitados porque no puede acceder a datos que se representan dinámicamente o que se encuentran detrás de elementos interactivos. Para solucionar este problema, puede utilizarSeleniumconBeautiful Souppara extraer datos de Google Trends y extraer datos de páginas web renderizadas dinámicamente. Selenium es una herramienta de código abierto para interactuar con sitios web y extraer datos de ellos que utiliza JavaScript para cargar contenido dinámicamente. Beautiful Soup ayuda a realizar el Parseo del contenido HTML extraído, lo que le permite extraer datos específicos de las páginas web.

Antes de comenzar este tutorial, debe tenerPythoninstalado y configurado en su equipo. También debe crear un directorio de proyecto vacío para los scripts de Python que creará en las siguientes secciones.

Crear un entorno virtual

Un entorno virtual le permite aislar los paquetes de Python en directorios separados para evitar conflictos de versiones. Para crear un nuevo entorno virtual, ejecute el siguiente comando en su terminal:

# navega a la raíz del directorio de tu proyecto antes de ejecutar el comando
python -m venv myenv

Este comando crea una carpeta llamada myenv en el directorio del proyecto. Active el entorno virtual ejecutando el siguiente comando:

source myenv/bin/activate

Cualquier comando Python o pip posterior también se ejecutará en este entorno.

Instala tus dependencias

Como se ha mencionado anteriormente, necesitas Selenium y Beautiful Soup para extraer y parsear páginas web. Además, para analizar y visualizar los datos extraídos, debes instalar los módulos PythonpandasyMatplotlib. Utiliza el siguiente comando para instalar estos paquetes:

pip install beautifulsoup4 pandas matplotlib selenium

Consultar los datos de búsqueda de Google Trends

Elpanel de control de Google Trendsle permite explorar las tendencias de búsqueda por región, intervalo de fechas y categoría. Por ejemplo, esta URL muestra las tendencias de búsqueda de café en Estados Unidos durante los últimos siete días:

https://trends.google.com/trends/explore?date=now%207-d&geo=US&q=coffee

Cuando abras esta página web en tu navegador, verás que los datos se cargan dinámicamente utilizando JavaScript. Para extraer contenido dinámico, puedes utilizarSelenium WebDriver, que imita las interacciones del usuario, como hacer clic, escribir o desplazarse.

Puede utilizarwebdriveren su script de Python para cargar la página web en una ventana del navegador y extraer el código fuente de la página una vez que se haya cargado el contenido. Para manejar contenido dinámico, puede añadir untime.sleepexplícito para asegurarse de que todo el contenido se haya cargado antes de obtener el código fuente de la página. Si desea aprender más técnicas para manejar contenido dinámico, consulteesta guía.

Cree un archivo main.py en la raíz del proyecto y añádale el siguiente fragmento de código:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

import time

def get_driver():
    # actualice la ruta a la ubicación de su binario de Chrome
    CHROME_PATH = "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"

    options = Options()
    # options.add_argument("--headless=new")
    options.binary_location = CHROME_PATH

    driver = webdriver.Chrome(options=options)

    return driver


def get_raw_trends_data(
    driver: webdriver.Chrome, date_range: str, geo: str, query: str)
 -> str:
    url = f"https://trends.google.com/trends/explore?date={date_range}&geo={geo}&q={query}"

    print(f"Obteniendo datos de {url}")

    driver.get(url)
    # solución alternativa para obtener el código fuente de la página tras el error inicial 429
    driver.get(url)
    driver.maximize_window()

    # Esperar a que se cargue la página
    time.sleep(5)

    return driver.page_source

El método get_raw_trends_data acepta como parámetros el intervalo de fechas, la región geográfica y el nombre de la consulta, y utiliza Chrome WebDriver para recuperar el contenido de la página. Tenga en cuenta que el método driver.get se llama dos veces como solución alternativa para corregir el error 429 inicial que genera Google cuando se carga la URL por primera vez.

Utilizará este método en las siguientes secciones para recuperar datos.

Analizar datos con Beautiful Soup

La página Tendencias de un término de búsqueda incluye un widget Interés por subregión que contiene registros paginados con valores entre 0 y 100, lo que indica la popularidad del término de búsqueda en función de la ubicación. Utilice el siguiente fragmento de código para analizar estos datos con Beautiful Soup:

# Añadir importación
from bs4 import BeautifulSoup

def extract_interest_by_sub_region(content: str) -> dict:
    soup = BeautifulSoup(content, "html.parser")

    interest_by_subregion = soup.find("div", class_="geo-widget-wrapper geo-resolution-subregion")

    related_queries = interest_by_subregion.find_all("div", class_="fe-atoms-generic-content-container")

    # Diccionario para almacenar los datos extraídos
    interest_data = {}

    # Extraer el nombre de la región y el porcentaje de interés
    for query in related_queries:
        items = query.find_all("div", class_="item")
        for item in items:
            region = item.find("div", class_="label-text").text.strip()
            interest = item.find("div", class_="progress-value").text.strip()
            interest_data[region] = interest

    return interest_data

Este fragmento de código busca el div coincidente para los datos de la subregión utilizando su nombre de clase y recorre el resultado para construir un diccionario interest_data.

Ten en cuenta que el nombre de la clase podría cambiar en el futuro y que es posible que tengas que utilizar lafunciónInspeccionarelemento de Chrome DevToolspara encontrar el nombre correcto.

Ahora que ha definido los métodos auxiliares, utilice el siguiente fragmento de código para consultar los datos de «café»:

# Parámetros
date_range = "now 7-d"
geo = "US"
query = "coffee"

# Obtener los datos sin procesar
driver = get_driver()

raw_data = get_raw_trends_data(driver, "now 7-d", "US", "coffee")

# Extraer el interés por región
interest_data = extract_interest_by_sub_region(raw_data)

# Imprimir los datos extraídos
for region, interest in interest_data.items():
    print(f"{region}: {interest}")

El resultado será similar a este:

Hawái: 100
Montana: 96
Oregón: 90
Washington: 86
California: 84

Gestionar la paginación de datos

Dado que los datos del widget están paginados, el fragmento de código de la sección anterior solo devuelve los datos de la primera página del widget. Para obtener más datos, puede utilizar Selenium WebDriver para buscar y hacer clic en el botón Siguiente. Además, su script debe gestionar el banner de consentimiento de cookies haciendo clic en el botón Aceptar para garantizar que el banner no obstruya otros elementos de la página.

Para gestionar las cookies y la paginación, añada este fragmento de código al final de main.py:

# Añadir importación
from selenium.webdriver.common.by import By


all_data = {}

# Aceptar las cookies
driver.find_element(By.CLASS_NAME, "cookieBarConsentButton").click()

# Obtener datos de interés paginados
while True:
    # Hacer clic en el botón md para cargar más datos si están disponibles
    try:
        geo_widget = driver.find_element(
            By.CSS_SELECTOR, "div.geo-widget-wrapper.geo-resolution-subregion"
        )
        
        # Buscar el botón «Cargar más» con el nombre de clase «md-button» y la etiqueta aria «Siguiente»
        load_more_button = geo_widget.find_element(
            By.CSS_SELECTOR, "button.md-button[aria-label='Next']"
        )
        
        icon = load_more_button.find_element(By.CSS_SELECTOR, ".material-icons")
        
        # Comprueba si el botón está desactivado verificando que el nombre de la clase incluye arrow-right-disabled.
        if "arrow-right-disabled" in icon.get_attribute("class"):
            print("No hay más datos para cargar")
            break
        
        load_more_button.click()
        time.sleep(2)
        
        extracted_data = extract_interest_by_sub_region(driver.page_source)
        all_data.update(extracted_data)
    except Exception as e:
        print("No hay más datos que cargar", e)
        break

driver.quit()

Este fragmento utiliza la instancia del controlador existente para buscar y hacer clic en el botón Siguiente, comparándolo con su nombre de clase. Comprueba la presencia de la clase flecha-derecha-desactivada en el elemento para determinar si el botón está desactivado, lo que indica que ha llegado a la última página del widget. Sale del bucle cuando se cumple esta condición.

Visualizar los datos

Para acceder fácilmente y analizar más a fondo los datos que ha recopilado, puede conservar los datos de la subregión extraídos en un archivo CSV utilizando un csv.DictWriter.

Comience definiendo save_interest_by_sub_region en main.py para guardar el diccionario all_data en un archivo CSV:

# Añadir importación
import csv


def save_interest_by_sub_region(interest_data: dict):
    interest_data = [{"Region": region, "Interest": interest} for region, interest in interest_data.items()]

    csv_file = "interest_by_region.csv"

    # Abrir el archivo CSV para escribir
    with open(csv_file, mode='w', newline='') as file:
        writer = csv.DictWriter(file, fieldnames=["Region", "Interest"])
        writer.writeheader()  # Escribir el encabezado
        writer.writerows(interest_data)  # Escribir los datos

    print(f"Datos guardados en {csv_file}")
    return csv_file

A continuación, puede utilizarpandaspara abrir el archivo CSV como unDataFramey realizar análisis, como filtrar datos por condiciones específicas, agregar datos con operacionesde agrupacióno visualizar tendencias con gráficos.

Por ejemplo, visualicemos los datos como ungráfico de barraspara comparar el interés por subregiones. Para crear gráficos, utilice la biblioteca Pythonmatplotlib, que funciona a la perfección con DataFrames. Añada la siguiente función al archivomain.pypara crear un gráfico de barras y guárdelo como imagen:

# Añadir importaciones
import pandas as pd
import matplotlib.pyplot as plt


def plot_sub_region_data(csv_file_path, output_file_path):
    # Cargar los datos del archivo CSV
    df = pd.read_csv(csv_file_path)

    # Crear un gráfico de barras para comparar por región
    plt.figure(figsize=(30, 12))
    
    plt.bar(df["Region"], df["Interest"], color="skyblue")
    
    # Añadir títulos y etiquetas
    plt.title('Interés por región')
    plt.xlabel('Región')
    plt.ylabel('Interés')

    # Girar las etiquetas del eje x si es necesario
    plt.xticks(rotation=45)

    # Mostrar el gráfico
    plt.savefig(output_file_path)

Añade el siguiente fragmento de código al final del archivo main.py para llamar a las funciones anteriores:

csv_file_path = save_interest_by_sub_region(all_data)

output_file_path = "interest_by_region.png"
plot_sub_region_data(csv_file_path, output_file_path)

Este fragmento crea un gráfico similar al siguiente:

Plot of interest in coffee by sub-regions

Todo el código de este tutorial está disponible eneste repositorio de GitHub.

Retos del scraping

En este tutorial, ha extraído una pequeña cantidad de datos de Google Trends, pero a medida que sus scripts de scraping crecen en tamaño y complejidad, es probable que se enfrente a retos como bloqueos de IP y CAPTCHAs.

Por ejemplo, a medida que envías tráfico más frecuente a un sitio web utilizando este script, podrías enfrentarte a bloqueos de IP, ya que muchos sitios web cuentan con medidas de seguridad para detectar y bloquear el tráfico de bots. Para evitarlo, puedes utilizar la rotación manual de IP o uno de los mejores servicios de proxy. Si no estás seguro de qué tipo de proxy debes utilizar, lee nuestro artículo que trata sobre los mejores tipos de proxy para el Scraping web.

Encontrar un CAPTCHA o reCAPTCHA es otro desafío común que utilizan los sitios web cuando detectan o sospechan tráfico de bots o anomalías. Para evitarlo, puede reducir la frecuencia de las solicitudes, utilizar encabezados de solicitud adecuados o utilizar servicios de terceros que puedan resolver estos desafíos.

Conclusión

En este artículo, ha aprendido a extraer datos de Google Trends con Python utilizando Selenium y Beautiful Soup.

A medida que continúe en su viaje por el scraping web, es posible que se encuentre con retos como prohibiciones de IP y CAPTCHAs. En lugar de gestionar complejos scripts de scraping, considere la posibilidad de utilizar la API SERP de Bright Data, que automatiza el proceso de recopilación de datos precisos y en tiempo real de los motores de búsqueda, incluyendo Google Trends. La API SERP gestiona el contenido dinámico, la segmentación basada en la ubicación y garantiza altas tasas de éxito, lo que le ahorra tiempo y esfuerzo.

¡Regístrate ahora y comienza tu prueba gratuita de la API SERP!