Volver al blog

Google Trends con Python: Recoger Intereses y Temas de Tendencia

Alex Johnson
Alex Johnson

Senior Web Scraping Engineer

30-Sep-2026

TL;DR:

  • El interés de Google Trends es un índice normalizado, no un conteo de búsquedas. Preserve la geografía y el rango temporal necesarios para interpretar cada observación.
  • Trending Now RSS y el interés histórico responden a diferentes preguntas. El feed público proporciona temas actuales; no es un reemplazo para una serie de interés a lo largo del tiempo.
  • Scrapeless expone una herramienta dedicada google_trends. Descubre el esquema de herramienta instalada antes de elegir su consulta y tipo de datos.
  • Los buckets de tráfico deben permanecer en texto. Una etiqueta como un umbral no debe convertirse en un conteo exacto en un dashboard.
  • Gratis para comenzar. Las nuevas cuentas de Scrapeless incluyen tiempo de ejecución gratuito de Scraping Browser; regístrate en app.scrapeless.com.

Google Trends puede decirte sobre el interés de búsqueda relativo y sobre temas que atraen la atención actual. Estos son productos de datos diferentes. Un informe que compara el interés de una palabra clave a lo largo del tiempo no puede sustituir una lista de los temas en tendencia de hoy, incluso si ambos contienen la misma frase.

Un flujo de trabajo de colección en Python debe elegir la superficie primero y luego preservar sus configuraciones. Esta guía conecta una herramienta dedicada de Trends para datos de interés y ejecuta un flujo de trabajo RSS público separado para temas actuales. Mantiene visibles los límites de salida en lugar de forzar métricas incompatibles en una columna.

Si tu aplicación ya utiliza flujos de trabajo de actores estructurados, trata Trends como su propio contrato de actor/herramienta. Los resultados de búsqueda de Google Search API y el interés de Google Trends son conjuntos de datos separados.

¿Qué mide realmente Google Trends?

Los valores de interés a lo largo del tiempo de Google Trends describen el interés de búsqueda relativo dentro de la geografía y el período seleccionados. La serie se escala de 0 a 100, y los términos de bajo volumen pueden aparecer como cero sin demostrar que nadie los buscó.

Normalización y muestreo de Google Trends explica por qué un punto depende de la proporción de búsquedas dentro de las condiciones elegidas. Un pico de 100 identifica un máximo relativo en esa serie, no un número conocido de búsquedas.

Cambiar el rango de fechas cambia la base de comparación. Un valor de una solicitud de un mes no es automáticamente comparable a la misma fecha en una solicitud más larga. Los datos muestreados y la supresión de bajo volumen también limitan las conclusiones que puedes sacar.

Superficie Pregunta adecuada Mantener con el resultado
Interés a lo largo del tiempo ¿Cómo cambió el interés relativo? Consulta, geografía, fechas, categoría y zona horaria
Interés por subregión ¿Dónde se concentra el interés relativo? Alcance geográfico y contexto de normalización
Consultas/temas relacionados ¿Qué búsquedas o temas están asociados? Tipo de datos y significado del ranking/métrica devuelta
Trending Now RSS ¿Qué temas están en tendencia ahora? Geografía del feed, texto de publicación y tiempo de observación

¿Por qué utilizar la herramienta dedicada de Scrapeless Trends?

La herramienta dedicada google_trends expone parámetros de consulta específicos de Trends en lugar de parámetros de resultados de búsqueda ordinarios. Está disponible a través de la conexión MCP de Scrapeless y pertenece a la superficie más amplia de Scraping API.

El esquema descubierto localmente incluye q, data_type, date, geo, hl, tz y cat. Ejemplos de data_type son interest_over_time, interest_by_subregion, related_queries y related_topics. Selecciona el tipo requerido por el informe antes de mapear campos en almacenamiento.

Una herramienta administrada no cambia el significado de las métricas de Google. La salida aún necesita geografía, contexto de muestreo y una distinción entre datos faltantes y valores cero. Consulta los precios de Scrapeless para conocer los términos actuales del plan; no hay costo ni referencia de frescura en este tutorial.

Prerrequisitos y configuración del paquete

Utiliza Python 3.12, Node.js, MCP 2.2.0, Requests 2.34.2 y scrapeless-mcp-server 0.6.3. La ruta RSS necesita solo Requests y las bibliotecas XML/CSV de Python. La captura de datos de interés necesita además un SCRAPELESS_KEY real con acceso a la herramienta.

La colección de Trends autenticada permanece pendiente de verificación en vivo sin esa credencial. El descubrimiento de herramientas locales y la ruta RSS pública funcionan de forma independiente; ninguna se describe como una captura de serie de interés autenticada completa.
Instale los clientes y el servidor anclados en un proyecto desechable:

bash Copy
python -m pip install mcp==2.2.0 requests==2.34.2
pnpm add scrapeless-mcp-server@0.6.3

Descubra el contrato de interés-datos antes de recopilar

La exploración de herramientas le da al cliente el esquema exacto expuesto por su servidor MCP instalado. Un valor de inicio local de metadata-discovery-only puede usarse solo para la inspección del esquema; nunca debe usarse para invocar una captura remota.

Guarde este script como trends_mcp.py. Ejecute su modo predeterminado con ese valor de descubrimiento obvio, o con su clave real configurada. El arranque suprime el registro en consola no relacionado con el protocolo, por lo que stdout sigue siendo utilizable para mensajes de stdio. El cliente de Python utiliza los atributos input_schema y is_error de la versión MCP 2.2.0.

python Copy
import argparse
import asyncio
import json
import os
from pathlib import Path
from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client

async def main(capture):
    key = os.environ['SCRAPELESS_KEY']
    server = StdioServerParameters(
        command='node',
        args=['--input-type=module', '-e',
              'console.log = () => {}; await import(process.argv[1]);',
              str(Path('node_modules/scrapeless-mcp-server/build/index.js').resolve())],
        env={**os.environ, 'SCRAPELESS_KEY': key})
    async with stdio_client(server) as streams:
        async with ClientSession(*streams) as session:
            await session.initialize()
            listed = await session.list_tools()
            tool = next(t for t in listed.tools if t.name == 'google_trends')
            Path('trends-tool-schema.json').write_text(
                json.dumps(tool.input_schema, indent=2))
            print(json.dumps({'discovered_tools': len(listed.tools),
                              'selected_tool': tool.name}))
            if capture:
                if key == 'metadata-discovery-only':
                    raise ValueError('A real key is required for remote capture')
                args = {'q': 'coffee', 'data_type': 'interest_over_time',
                        'date': 'today 12-m', 'geo': 'US',
                        'hl': 'en', 'tz': '0', 'cat': '0'}
                result = await session.call_tool(tool.name, args)
                Path('trends-result.json').write_text(json.dumps({
                    'request': args, 'result': result.model_dump(mode='json')
                }, indent=2))
                if result.is_error:
                    raise ValueError('Tool error; inspect saved result')
                print('Raw result saved; inspect its actual fields before mapping a series.')

parser = argparse.ArgumentParser()
parser.add_argument('--capture', action='store_true')
asyncio.run(main(parser.parse_args().capture))

El apretón de manos local descubrió 25 herramientas y seleccionó google_trends. Esa cantidad describe el servidor instalado, no un límite eterno de plataforma. El trends-tool-schema.json guardado es la evidencia que se debe inspeccionar cuando el paquete del servidor cambia.

Con una clave real configurada, python trends_mcp.py --capture solicita interés a lo largo del tiempo para el café en EE.UU. durante el último año. Nota: la rama de captura requiere credenciales y permanece pendiente de verificación en vivo autenticada. El script preserva el sobre del resultado MCP antes de hacer suposiciones sobre sus campos internos. No inventa una clave de línea de tiempo ni fabrica una serie temporal.

Comience a raspar con Scrapeless

¡Potencie su flujo de trabajo de raspado web y automatización con Scrapeless!
Regístrese hoy y obtenga $5 en crédito gratis — no se requiere tarjeta de crédito.

Reclame su crédito gratis ahora en el Tablero de Scrapeless.

Recopile temas actuales del feed RSS público

Trending Now RSS es un feed de temas actuales público que se puede recopilar sin un navegador o credencial de API de Scrapeless. Sus marcas de tiempo de publicación y etiquetas de tráfico describen las observaciones temáticas del feed, no el interés normalizado histórico.

El siguiente script completo hace una solicitud de feed y almacena como máximo cinco elementos. Guarda el XML original, registros JSON y CSV en un directorio de observación. Este es el camino de datos públicos ejecutable de forma independiente.

python Copy
import csv
import hashlib
import json
from datetime import datetime, timezone
from pathlib import Path
from xml.etree import ElementTree as ET
import requests

url = 'https://trends.google.com/trending/rss?geo=US'
response = requests.get(url, timeout=30)
response.raise_for_status()
root = ET.fromstring(response.content)
channel = root.find('channel')
if channel is None:
    raise ValueError('Expected RSS channel, received another document')
observed = datetime.now(timezone.utc).strftime('%Y%m%dT%H%M%SZ')
folder = Path('trending-rss') / observed
folder.mkdir(parents=True, exist_ok=True)
(folder / 'source.xml').write_bytes(response.content)
ns = {'ht': 'https://trends.google.com/trending/rss'}
rows = []
for item in channel.findall('item')[:5]:
    title = (item.findtext('title') or '').strip()
    link = (item.findtext('link') or '').strip()
    if not title or not link:
        raise ValueError('RSS item missing title or link')
    rows.append({'title': title, 'link': link,
                 'published': item.findtext('pubDate'),
                 'traffic_bucket': item.findtext('ht:approx_traffic', namespaces=ns),
                 'geo': 'US', 'observed_at': observed})
if not rows:
    raise ValueError('No items; inspect source before treating this as valid empty data')
(folder / 'records.json').write_text(json.dumps(rows, ensure_ascii=False, indent=2))
with (folder / 'records.csv').open('w', newline='', encoding='utf-8') as out:
    writer = csv.DictWriter(out, fieldnames=list(rows[0]))
    writer.writeheader()
    writer.writerows(rows)
print(json.dumps({'source': response.url, 'items_saved': len(rows),
                  'source_sha256': hashlib.sha256(response.content).hexdigest()}))

La ejecución del feed público guardó cinco elementos reales y su hash de origen. Los temas cambian, por lo que el artículo no congela los nombres en una supuesta muestra de salida universal. Los campos del registro son title, link, published, traffic_bucket, geo y observed_at.

El espacio de nombres ht identifica el campo de tráfico opcional del feed. Mantenga su valor como texto devuelto, incluyendo cualquier notación de umbral. Una etiqueta de tráfico faltante es un campo faltante, no una estimación de búsqueda cero. El escritor CSV sigue las reglas de cita y registro descritas por el formato de intercambio CSV, por lo que los títulos de los temas que contienen puntuación permanecen intactos.

Preserve la identidad métrica al almacenar datos de Tendencias

Una tabla de almacenamiento de Tendencias debe retener la superficie de colección así como los datos. Asigne nombres métricos separados a los temas RSS y a los puntos de la serie de interés, así como reglas de aceptación separadas.

Para una serie de interés, mantenga los argumentos de solicitud completos con el resultado en bruto. Una vez que se haya inspeccionado la salida autenticada, agregue un adaptador de esquema que verifique los tipos de puntos, etiquetas de consulta y el período informado. No convierta una serie faltante en un gráfico exitoso vacío simplemente porque la comunicación HTTP o MCP se completó.

Para RSS, retenga los bytes originales del feed, la geografía del feed y el directorio de observación. El texto de publicación es suministrado por la fuente; el tiempo de observación es cuando su cliente lo recopiló. Estos son relojes diferentes. El hash de origen conecta cada exportación con el feed del cual se derivó, un uso práctico de relaciones de procedencia.

Un tablero debe mostrar el rango de fechas seleccionado junto al gráfico. Exporte ese rango con los puntos en lugar de mantenerlo solo en un filtro de UI. De lo contrario, un destinatario de la hoja de cálculo puede interpretar un pico normalizado como una estadística de volumen que los datos nunca proporcionaron.

Errores comunes de interpretación

Una colección exitosa aún puede producir un análisis incorrecto si la métrica está mal etiquetada. Las siguientes comprobaciones pertenecen al punto donde los datos recopilados se convierten en un informe.

Error Manejo correcto
Tratar el interés 100 como 100 búsquedas Etiquetar el campo como interés normalizado
Comparar rangos de fechas escalados independientemente Mantener las solicitudes alineadas o divulgar la base diferente
Tratar un bucket de tráfico RSS como un conteo exacto Preservar el texto del umbral original
Convertir valores faltantes en cero Preservar la semántica del estado faltante e inspeccionar la fuente
Mezclar solicitudes mundiales y nacionales Agrupar registros por geografía explícita
Llamar a la búsqueda general para el historial de Tendencias Utilizar el contrato de Tendencias dedicado

Conclusión: almacena la pregunta con la métrica

Google Trends con Python es más útil cuando el camino de colección coincide con la pregunta que se está haciendo. El interés histórico pertenece a un contrato específico de Trends; la colección de temas actuales tiene un camino RSS público simple.

Comienza con la exportación RSS para establecer el manejo de evidencia, luego inspecciona el primer resultado de interés autenticado antes de construir su adaptador. Mantén la geografía, el rango de fechas y la identidad métrica vinculados a cada gráfico descendente.


¿Listo para construir tu pipeline de datos potenciado por IA?

Únete a nuestra comunidad para reclamar un plan gratuito y conectarte con desarrolladores que construyen pipelines de datos web: Discord · Telegram.

Regístrate en app.scrapeless.com para obtener un tiempo de ejecución gratuito del Scraping Browser y adapta los patrones anteriores a tu propio flujo de trabajo de datos públicos.


FAQ

Q: ¿Google Trends informa volúmenes de búsqueda exactos?

No. Los valores de interés de Google Trends son medidas normalizadas de interés relativo. No pueden convertirse en conteos de búsqueda exactos a partir del índice solo.

Q: ¿Puede Python recolectar Trending Now sin una clave API?

Sí. El ejemplo de RSS público recolecta temas actuales con Requests y parsers de la biblioteca estándar. No recupera una serie de interés histórico a lo largo del tiempo.

Q: ¿Es la API de Búsqueda de Google la misma que la herramienta de Trends?

No. La colección de resultados de búsqueda y la colección de Google Trends tienen diferentes parámetros de solicitud y significados de salida. Usa google_trends para el flujo de trabajo específico de Trends que se muestra aquí.

Q: ¿Es legal recolectar datos públicos de Google Trends?

El alcance aceptable depende de los términos, condiciones de acceso, derechos de uso y jurisdicción. Revisa esas limitaciones para la colección y reutilización previstas; un feed público no es un permiso ilimitado para cada aplicación.

Q: ¿El flujo de trabajo RSS necesita un proxy o un navegador?

No se utiliza proxy ni navegador en este ejemplo de RSS. Si la respuesta no es el documento RSS esperado, detén la exportación e inspecciona la respuesta capturada en lugar de aceptar una página de desafío como datos de tema.

Q: ¿Pueden los valores de Trends diferir entre colecciones?

Sí. El muestreo, la interpretación de consultas, la geografía y las opciones de rango temporal afectan la serie. Registra esas elecciones para que se pueda investigar una diferencia en lugar de tratarla automáticamente como un cambio de demanda.

Q: ¿Puede este flujo de trabajo ejecutarse sin un agente de IA?

Sí. Tanto el cliente MCP de Python como el parser RSS son scripts ordinarios. Un agente de IA es opcional; no proporciona credenciales de API faltantes ni reemplaza la validación de métricas.

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar