Google Trends com Python: Coletar Interesse e Tópicos em Alta
Senior Web Scraping Engineer
TL;DR:
- O interesse do Google Trends é um índice normalizado, não uma contagem de buscas. Preserve a geografia e o intervalo de tempo necessários para interpretar cada observação.
- O Trending Now RSS e o interesse histórico respondem a perguntas diferentes. O feed público fornece tópicos atuais; não é um substituto para uma série de interesse ao longo do tempo.
- Scrapeless expõe uma ferramenta dedicada
google_trends. Descubra o esquema da ferramenta instalada antes de escolher sua consulta e tipo de dados. - Os buckets de tráfego devem permanecer como texto. Um rótulo, como um limite, não deve se tornar uma contagem exata em um painel.
- Grátis para começar. Novas contas Scrapeless incluem tempo de execução gratuito do Scraping Browser — inscreva-se em app.scrapeless.com.
Introdução: decida qual pergunta sobre Trends você precisa responder
O Google Trends pode te informar sobre o interesse de busca relativo e sobre tópicos que estão atraindo atenção atual. Esses são produtos de dados diferentes. Um relatório que compara o interesse de uma palavra-chave ao longo do tempo não pode substituir uma lista dos tópicos em alta de hoje, mesmo que ambos contenham a mesma frase.
Um fluxo de trabalho de coleção em Python deve escolher a superfície primeiro, e então preservar suas configurações. Este guia conecta uma ferramenta dedicada de Trends para dados de interesse e executa um fluxo de trabalho RSS público separado para tópicos atuais. Ele mantém os limites de saída visíveis em vez de forçar métricas incompatíveis em uma única coluna.
Se sua aplicação já usa fluxos de trabalho de ator estruturados, trate o Trends como seu próprio contrato de ator/ferramenta. Os resultados de busca da Google Search API e o interesse do Google Trends são conjuntos de dados separados.
O que o Google Trends realmente mede?
Os valores de interesse ao longo do tempo do Google Trends descrevem o interesse de busca relativo dentro da geografia e período selecionados. A série é escalonada de 0 a 100, e termos de baixo volume podem aparecer como zero sem demonstrar que ninguém os pesquisou.
Normalização e amostragem do Google Trends explica por que um ponto depende da parcela de buscas dentro das condições escolhidas. Um pico de 100 identifica um máximo relativo nessa série, não um número conhecido de buscas.
Mudar o intervalo de datas altera a base de comparação. Um valor de uma solicitação de um mês não é automaticamente comparável à mesma data em uma solicitação mais longa. Dados amostrados e supressão de baixo volume também limitam as conclusões que você pode tirar.
| Superfície | Pergunta adequada | Manter com o resultado |
|---|---|---|
| Interesse ao longo do tempo | Como o interesse relativo mudou? | Consulta, geografia, datas, categoria e fuso horário |
| Interesse por sub-região | Onde o interesse relativo está concentrado? | Escopo geográfico e contexto de normalização |
| Consultas/tópicos relacionados | Quais buscas ou tópicos estão associados? | Tipo de dados e significado da classificação/métrica retornada |
| Trending Now RSS | Quais tópicos estão em alta agora? | Geografia do feed, texto de publicação e horário de observação |
Por que usar a ferramenta dedicada Scrapeless Trends?
A ferramenta dedicada google_trends expõe parâmetros de consulta específicos do Trends, em vez dos parâmetros comuns de resultados de busca. Está disponível através da conexão MCP do Scrapeless e pertence à superfície mais ampla da API de Scraping.
O esquema descoberto localmente inclui q, data_type, date, geo, hl, tz e cat. Exemplos de data_type são interest_over_time, interest_by_subregion, related_queries e related_topics. Selecione o tipo necessário pelo relatório antes de mapear campos para armazenamento.
Uma ferramenta gerenciada não muda o significado das métricas do Google. A saída ainda precisa de geografia, contexto de amostragem e uma distinção entre dados ausentes e valores zero. Confira preços do Scrapeless para os termos atuais do plano; não há custo ou benchmark de frescor neste tutorial.
Pré-requisitos e configuração do pacote
Use Python 3.12, Node.js, MCP 2.2.0, Requests 2.34.2 e scrapeless-mcp-server 0.6.3. O caminho RSS precisa apenas do Requests e das bibliotecas XML/CSV do Python. A captura de dados de interesse precisa adicionalmente de um SCRAPELESS_KEY real com acesso à ferramenta.
A coleção autenticada de Trends permanece pendente de verificação ao vivo sem essa credencial. A descoberta de ferramentas locais e o caminho RSS público funcionam de forma independente; nenhum deles é descrito como uma captura concluída de série de interesse autenticada.
Instale os clientes e o servidor fixos em um projeto descartável:
bash
python -m pip install mcp==2.2.0 requests==2.34.2
pnpm add scrapeless-mcp-server@0.6.3
Descubra o contrato de dados de interesse antes de coletar
A descoberta de ferramentas fornece ao cliente o esquema exato exposto pelo servidor MCP instalado. Um valor de inicialização local de metadata-discovery-only pode ser usado apenas para inspeção de esquema; ele nunca deve ser utilizado para invocar captura remota.
Salve este script como trends_mcp.py. Execute seu modo padrão com aquele valor óbvio de descoberta, ou com sua chave real configurada. O bootstrap suprime o registro de console não protocolar, assim stdout permanece utilizável para mensagens stdio. O cliente Python usa os atributos input_schema e is_error do MCP 2.2.0.
python
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))
O handshake local descobriu 25 ferramentas e selecionou google_trends. Essa contagem descreve o servidor instalado, não um limite eterno da plataforma. O trends-tool-schema.json salvo é a evidência a ser inspecionada quando o pacote do servidor mudar.
Com uma chave real configurada, python trends_mcp.py --capture solicita interesse ao longo do tempo para café nos EUA ao longo do último ano. Nota: o ramo de captura requer credenciais e permanece pendente de verificação ao vivo autenticada. O script preserva o envelope de resultado do MCP antes de fazer suposições sobre seus campos internos. Ele não inventa uma chave de linha do tempo ou fabrica uma série temporal.
Comece a Captura com Scrapeless
Potencialize seu fluxo de trabalho de web scraping e automação com Scrapeless!
Inscreva-se hoje e receba $5 em crédito gratuito — sem cartão de crédito necessário.Reivindique seu crédito gratuito agora no Painel do Scrapeless.
Colete tópicos atuais do feed RSS público
O Trending Now RSS é um feed público de tópicos atuais que pode ser coletado sem um navegador ou credencial da API do Scrapeless. Seus timestamps de publicação e etiquetas de tráfego descrevem as observações de tópicos do feed, não o interesse histórico normalizado.
O seguinte script completo faz uma solicitação de feed e armazena no máximo cinco itens. Ele salva o XML original, registros JSON e CSV em um diretório de observação. Este é o caminho de dados públicos executável de forma independente.
python
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()}))
A execução do feed público salvou cinco itens reais e seu hash fonte. Os tópicos mudam, então o artigo não congela os nomes em uma suposta amostra de saída universal. Os campos do registro são title, link, published, traffic_bucket, geo e observed_at.
O namespace ht identifica o campo de tráfego opcional do feed. Mantenha seu valor como texto retornado, incluindo qualquer notação de limite. Uma etiqueta de tráfego ausente é um campo ausente, não uma estimativa de busca zero. O escritor CSV segue as regras de citação e registro descritas por o formato de intercâmbio CSV, então os títulos dos tópicos que contêm pontuação permanecem intactos.
Preserve a identidade métrica ao armazenar dados de Tendências
Uma tabela de armazenamento de Tendências deve reter a superfície da coleção, bem como os dados. Dê aos tópicos RSS e pontos da série de interesse nomes métricos separados e regras de aceitação separadas.
Para uma série de interesse, mantenha os argumentos de solicitação completos com o resultado bruto. Uma vez que a saída autenticada foi inspecionada, adicione um adaptador de esquema que verifique tipos de pontos, rótulos de consulta e o período reportado. Não converta uma série ausente em um gráfico vazio bem-sucedido simplesmente porque a troca HTTP ou MCP foi concluída.
Para RSS, retenha os bytes originais do feed, a geografia do feed e o diretório de observação. O texto de publicação é fornecido pela fonte; o tempo de observação é quando seu cliente o coletou. Estes são relógios diferentes. O hash fonte conecta cada exportação ao feed do qual foi derivado, um uso prático de relações de proveniência.
Um painel deve mostrar o intervalo de datas selecionado ao lado do gráfico. Exporte esse intervalo com os pontos em vez de mantê-lo apenas em um filtro da interface do usuário. Caso contrário, um destinatário de planilha pode interpretar um pico normalizado como uma estatística de volume que os dados nunca forneceram.
Erros comuns de interpretação
Uma coleção bem-sucedida ainda pode produzir uma análise incorreta se a métrica estiver rotulada incorretamente. As seguintes verificações pertencem ao ponto onde os dados coletados se tornam um relatório.
| Erro | Manipulação correta |
|---|---|
| Tratar interesse 100 como 100 pesquisas | Rotule o campo como interesse normalizado |
| Comparar intervalos de datas escalonados independentemente | Mantenha solicitações alinhadas ou divulgue a base diferente |
| Tratar um balde de tráfego RSS como uma contagem exata | Preserve o texto do limite original |
| Transformar valores ausentes em zero | Preserve a semântica de estado ausente e inspecione a fonte |
| Misturar solicitações globais e de países | Agrupe registros por geografia explícita |
| Chamar a pesquisa geral para histórico de Tendências | Use o contrato de Tendências dedicado |
Conclusão: armazene a pergunta com a métrica
Google Trends com Python é mais útil quando o caminho de coleta corresponde à pergunta sendo feita. O interesse histórico pertence a um contrato específico de Trends; a coleta de tópicos atuais tem um caminho RSS público simples.
Comece com a exportação RSS para estabelecer o manuseio de evidências, depois inspecione o primeiro resultado de interesse autenticado antes de construir seu adaptador. Mantenha a geografia, a faixa de datas e a identidade da métrica anexadas a cada gráfico subsequente.
Pronto para construir seu pipeline de dados com IA?
Junte-se à nossa comunidade para reivindicar um plano gratuito e conectar-se com desenvolvedores que constroem pipelines de dados da web: Discord · Telegram.
Inscreva-se em app.scrapeless.com para um tempo de execução gratuito do Scraping Browser e adapte os padrões acima ao seu próprio fluxo de trabalho de dados públicos.
FAQ
Q: O Google Trends reporta volumes de busca exatos?
Não. Os valores de interesse do Google Trends são medidas normalizadas de interesse relativo. Eles não podem ser convertidos em contagens de busca exatas apenas a partir do índice.
Q: O Python pode coletar Trending Now sem uma chave de API?
Sim. O exemplo público de RSS coleta tópicos atuais com Requests e analisadores da biblioteca padrão. Não recupera uma série de interesse histórico ao longo do tempo.
Q: A API de Pesquisa do Google é a mesma que a ferramenta Trends?
Não. A coleta de resultados de pesquisa e a coleta de Google Trends têm diferentes parâmetros de solicitação e significados de saída. Use google_trends para o fluxo de trabalho específico de Trends mostrado aqui.
Q: Coletar dados públicos do Google Trends é legal?
O escopo aceitável depende de termos, condições de acesso, direitos de uso e jurisdição. Examine essas restrições para a coleta e reutilização pretendidas; um feed público não é permissão irrestrita para cada aplicação.
Q: O fluxo de trabalho RSS precisa de um proxy ou navegador?
Nenhum proxy ou navegador é usado por este exemplo de RSS. Se a resposta não for o documento RSS esperado, pare a exportação e inspecione a resposta capturada em vez de aceitar uma página de desafio como dados do tópico.
Q: Os valores de Trends podem diferir entre as coleções?
Sim. Amostragem, interpretação da consulta, geografia e escolhas de intervalo de tempo afetam a série. Registre essas escolhas para que uma diferença possa ser investigada em vez de automaticamente tratada como uma mudança de demanda.
Q: Este fluxo de trabalho pode funcionar sem um agente de IA?
Sim. Tanto o cliente MCP Python direto quanto o analisador RSS são scripts comuns. Um agente de IA é opcional; ele não fornece credenciais de API ausentes nem substitui a validação de métricas.
Na Scorretless, acessamos apenas dados disponíveis ao público, enquanto cumprem estritamente as leis, regulamentos e políticas de privacidade do site aplicáveis. O conteúdo deste blog é apenas para fins de demonstração e não envolve atividades ilegais ou infratoras. Não temos garantias e negamos toda a responsabilidade pelo uso de informações deste blog ou links de terceiros. Antes de se envolver em qualquer atividade de raspagem, consulte seu consultor jurídico e revise os termos de serviço do site de destino ou obtenha as permissões necessárias.



