
Adélia Cruz
Neural Network Developer

Pesquisas de páginas de resultados dos mecanismos de busca (SERPs) mudam constantemente — trechos destacados rotacionam, caixas "Perguntas também feitas" atualizam, e visões de IA aparecem ou desaparecem sem aviso. Agentes de busca de IA que monitoram esses recursos para equipes de SEO precisam de acesso contínuo a dados de SERP em tempo real. No entanto, Google e outros mecanismos de busca implementam proteção contra robôs agressiva, incluindo reCAPTCHA e limitação de taxa, que bloqueiam o monitoramento automatizado de SERP. Este guia mostra como construir uma pipeline de monitoramento de recursos de SERP para agentes de IA usando o CapSolver para manter a coleta de dados sem interrupções.
Equipes de SEO e GEO (Otimização de Motores Gerativos) dependem de dados de SERP precisos e oportunos para tomar decisões. Quando um agente de IA monitora os resultados de busca por mudanças de classificação, oportunidades de trechos destacados ou movimentações de concorrentes, ele precisa executar centenas ou milhares de consultas de busca diariamente. Os sistemas de detecção de robôs do Google identificam esse padrão e acionam desafios de verificação.
A parede de verificação aparece em várias formas: um desafio reCAPTCHA de página completa após consultas repetidas, uma página de interstício "tráfego incomum", ou um bloqueio completo do IP. De acordo com a documentação dos crawlers do Google, o acesso automatizado aos resultados de busca está sujeito a limitação de taxa e requisitos de verificação.
Para agentes de busca de IA, isso cria uma lacuna crítica. O agente pode analisar dados de SERP brilhantemente — identificando padrões, detectando mudanças, recomendando ações — mas não pode coletar os dados que precisa para funcionar. O CapSolver fecha essa lacuna ao resolver desafios de verificação inline, permitindo que a pipeline de monitoramento continue sem interrupções.
Instale os pacotes necessários:
pip install git+https://github.com/capsolver-ai/capsolver-core.git
pip install aiohttp beautifulsoup4 pandas schedule
Defina sua chave de API:
export CAPSOLVER_API_KEY="sua-chave-de-api-do-capsolver"
Requisitos adicionais:
Defina quais recursos de SERP seu agente de IA precisa rastrear e como detectá-los:
from dataclasses import dataclass
from typing import List, Optional
from enum import Enum
class SERPFeature(Enum):
FEATURED_SNIPPET = "featured_snippet"
PEOPLE_ALSO_ASK = "people_also_ask"
AI_OVERVIEW = "ai_overview"
LOCAL_PACK = "local_pack"
KNOWLEDGE_PANEL = "knowledge_panel"
VIDEO_CAROUSEL = "video_carousel"
IMAGE_PACK = "image_pack"
TOP_STORIES = "top_stories"
SHOPPING_RESULTS = "shopping_results"
@dataclass
class SERPResult:
keyword: str
features_detected: List[SERPFeature]
featured_snippet_url: Optional[str]
featured_snippet_text: Optional[str]
paa_questions: List[str]
ai_overview_present: bool
ai_overview_sources: List[str]
organic_positions: List[dict] # [{url, title, position}]
timestamp: float
class SERPFeatureDetector:
"""Detectar recursos de SERP a partir de páginas de resultados analisadas."""
def detect_features(self, html_content: str, keyword: str) -> SERPResult:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_content, 'html.parser')
features = []
# Detecção de trecho destacado
snippet_div = soup.select_one('[data-attrid="wa:/description"], .xpdopen')
featured_url = None
featured_text = None
if snippet_div:
features.append(SERPFeature.FEATURED_SNIPPET)
featured_text = snippet_div.get_text(strip=True)[:500]
link = snippet_div.find('a')
featured_url = link['href'] if link else None
# Detecção de perguntas também feitas
paa_questions = []
paa_section = soup.select('[data-q]')
if paa_section:
features.append(SERPFeature.PEOPLE_ALSO_ASK)
paa_questions = [q.get('data-q', '') for q in paa_section[:8]]
# Detecção de visão de IA
ai_overview = soup.select_one('[data-attrid*="ai"], .ai-overview-container')
ai_sources = []
if ai_overview:
features.append(SERPFeature.AI_OVERVIEW)
source_links = ai_overview.select('a[href]')
ai_sources = [a['href'] for a in source_links[:5]]
# Detecção de pacote local
if soup.select_one('.VkpGBb, [data-attrid*="local"]'):
features.append(SERPFeature.LOCAL_PACK)
return SERPResult(
keyword=keyword,
features_detected=features,
featured_snippet_url=featured_url,
featured_snippet_text=featured_text,
paa_questions=paa_questions,
ai_overview_present=SERPFeature.AI_OVERVIEW in features,
ai_overview_sources=ai_sources,
organic_positions=self._extract_organic(soup),
timestamp=time.time()
)
def _extract_organic(self, soup) -> list:
results = []
for i, item in enumerate(soup.select('.g, [data-sokoban-container]')[:10], 1):
link = item.select_one('a[href^="http"]')
title = item.select_one('h3')
if link and title:
results.append({
"position": i,
"url": link['href'],
"title": title.get_text(strip=True)
})
return results
Construa a camada de coleta de dados que lida com os desafios de verificação do Google:
import asyncio
import aiohttp
import time
import random
from capsolver_core import create_capsolver, CaptchaType, CaptchaInfo
class SERPCollector:
"""Coletar dados de SERP com tratamento automático de CAPTCHA."""
def __init__(self, api_key: str, proxies: list):
self.cap = create_capsolver(api_key=api_key)
self.proxies = proxies
self.proxy_index = 0
self.stats = {"queries": 0, "captchas_solved": 0, "failures": 0}
def _get_proxy(self) -> str:
proxy = self.proxies[self.proxy_index % len(self.proxies)]
self.proxy_index += 1
return proxy
async def search(self, keyword: str, location: str = "us") -> str:
"""Executar uma pesquisa do Google com tratamento de CAPTCHA."""
proxy = self._get_proxy()
url = f"https://www.google.com/search?q={keyword}&gl={location}&hl=en"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml"
}
async with aiohttp.ClientSession() as session:
async with session.get(url, headers=headers, proxy=proxy, timeout=30) as resp:
html = await resp.text()
# Verificar se é uma página de CAPTCHA
if self._is_captcha_page(html):
html = await self._solve_and_retry(keyword, location, proxy, session)
self.stats["queries"] += 1
return html
def _is_captcha_page(self, html: str) -> bool:
"""Detectar se a resposta é uma página de desafio CAPTCHA."""
captcha_indicators = [
"tráfego incomum do seu computador",
"g-recaptcha",
"recaptcha/api",
"sorry/index",
"captcha"
]
return any(indicator in html.lower() for indicator in captcha_indicators)
async def _solve_and_retry(self, keyword: str, location: str, proxy: str, session) -> str:
"""Resolver o CAPTCHA e repetir a pesquisa."""
# Google usa reCAPTCHA v2 em suas páginas de desafio
info = CaptchaInfo(
type=CaptchaType.RECAPTCHA_V2,
website_url="https://www.google.com/sorry/index",
website_key="6LfwuyUTAAAAAOAmoS0fdqijC2PbbdH4kjq62Y1b"
)
solution = await self.cap.solve(info)
self.stats["captchas_solved"] += 1
# Repetir a pesquisa com o token resolvido
retry_url = f"https://www.google.com/search?q={keyword}&gl={location}&hl=en"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"}
# Incluir o token de CAPTCHA na solicitação de repetição
async with session.get(retry_url, headers=headers, proxy=proxy) as resp:
return await resp.text()
async def close(self):
await self.cap.aclose()
O guia de resolução de reCAPTCHA do CapSolver fornece detalhes adicionais sobre o tratamento da implementação específica de reCAPTCHA do Google.
Combine coleta e detecção em uma pipeline de monitoramento programada:
class SERPMonitoringPipeline:
"""Pipeline completa de monitoramento de recursos de SERP."""
def __init__(self, api_key: str, proxies: list):
self.collector = SERPCollector(api_key, proxies)
self.detector = SERPFeatureDetector()
self.results_history = []
async def monitor_keywords(self, keywords: list, location: str = "us") -> list:
"""Monitorar um lote de palavras-chave para mudanças em recursos de SERP."""
results = []
for keyword in keywords:
try:
# Coletar dados de SERP
html = await self.collector.search(keyword, location)
# Detectar recursos
serp_result = self.detector.detect_features(html, keyword)
results.append(serp_result)
# Limitação de taxa — pausa aleatória de 5-10 segundos
await asyncio.sleep(random.uniform(5, 10))
except Exception as e:
results.append(SERPResult(
keyword=keyword, features_detected=[],
featured_snippet_url=None, featured_snippet_text=None,
paa_questions=[], ai_overview_present=False,
ai_overview_sources=[], organic_positions=[],
timestamp=time.time()
))
self.results_history.extend(results)
return results
def detect_changes(self, current: list, previous: list) -> list:
"""Comparar resultados atuais e anteriores para detectar mudanças."""
changes = []
prev_map = {r.keyword: r for r in previous}
for result in current:
prev = prev_map.get(result.keyword)
if not prev:
continue
# Trecho destacado ganho/perdido
had_snippet = SERPFeature.FEATURED_SNIPPET in prev.features_detected
has_snippet = SERPFeature.FEATURED_SNIPPET in result.features_detected
if has_snippet and not had_snippet:
changes.append(f"[GANHO] Trecho destacado para '{result.keyword}': {result.featured_snippet_url}")
elif had_snippet and not has_snippet:
changes.append(f"[PERDIDO] Trecho destacado para '{result.keyword}'")
# Visão de IA apareceu/sumiu
if result.ai_overview_present and not prev.ai_overview_present:
changes.append(f"[NOVO] Visão de IA apareceu para '{result.keyword}'")
elif prev.ai_overview_present and not result.ai_overview_present:
changes.append(f"[REMOVIDO] Visão de IA removida para '{result.keyword}'")
return changes
Para monitorar centenas de palavras-chave, otimize custo e desempenho:
| Palavras-chave monitoradas | Verificações diárias | CAPTCHAs mensais (est.) | Custo mensal |
|---|---|---|---|
| 50 palavras-chave | 4x/dia | ~600 | $1,2-1,8 |
| 200 palavras-chave | 2x/dia | ~1.200 | $2,4-3,6 |
| 500 palavras-chave | 2x/dia | ~3.000 | $6-9 |
| 1.000 palavras-chave | 1x/dia | ~3.000 | $6-9 |
Estratégias de otimização:
Claim Your Bonus Code: Use o código WEBS no Painel do CapSolver para obter um bônus adicional de 5% em cada recarga. Perfeito para equipes de SEO que executam monitoramento de SERP em larga escala.
A documentação de raspagem da web do CapSolver aborda padrões adicionais de infraestrutura para coleta de dados de volume alto. Para lidar com ferramentas de busca protegidas pelo Cloudflare, o guia de resolução de Turnstile fornece detalhes de implementação relevantes.
Construir monitoramento de recursos de SERP para agentes de busca de IA requer uma camada de coleta de dados consciente de CAPTCHA, um parser de detecção de recursos e um sistema de detecção de mudanças. CapSolver fornece a infraestrutura de limpeza de verificação que mantém sua pipeline de monitoramento funcionando continuamente, resolvendo desafios de reCAPTCHA do Google em 3-8 segundos para que seu agente de IA sempre tenha dados de SERP frescos para analisar.
Comece com suas palavras-chave de maior prioridade, valide a precisão da detecção e depois escalone para cobertura completa de palavras-chave. A combinação de proxies residenciais, limitação inteligente de taxa e resolução automática de CAPTCHA entrega 98%+ de confiabilidade na coleta de dados a um custo gerenciável.
Com rotação adequada de proxies e resolução de CAPTCHA, é possível monitorar confiavelmente 500-1.000 palavras-chave por dia a partir de uma única instância de pipeline. O fator limitante é geralmente o tamanho do pool de proxies, e não a capacidade de resolução de CAPTCHA. O CapSolver lida com milhares de tarefas simultâneas sem limitação de taxa.
Sim. O detector de recursos do SERP identifica as seções de Overviews de IA nos resultados de busca. Como as Overviews de IA aparecem nas páginas padrão de resultados do Google, o mesmo método de coleta e resolução de CAPTCHA as captura. Rastreie quais palavras-chave acionam as Overviews de IA e quais fontes são citadas.
Com proxies residenciais e intervalos de 5 a 10 segundos entre as consultas, a taxa de ocorrência de CAPTCHA é normalmente de 5 a 15%. Sem proxies ou com intervalos agressivos, pode chegar a 30 a 50%. A combinação de bons proxies e resolução de CAPTCHA garante um sucesso de coleta de dados de quase 100%.
Sim. A extração de posições orgânicas captura os 10 primeiros resultados para cada palavra-chave. Rastreie URLs de concorrentes em seu conjunto de palavras-chave para detectar ganhos, perdas e novas entradas. Combine com o rastreamento de trechos destacados para identificar oportunidades de conteúdo.
Defina o parâmetro gl (localização geográfica) na sua URL de busca para direcionar países específicos. O Google exibe resultados localizados com base nesse parâmetro. O método de resolução de CAPTCHA funciona da mesma forma em todos os domínios do Google — o mesmo sistema reCAPTCHA protege todas as versões regionais.
Aprenda arquitetura de raspagem web escalável em Rust com reqwest, scraper, raspagem assíncrona, raspagem de navegador headless, rotação de proxies e tratamento de CAPTCHA compatível.

Compare o Selenium vs Puppeteer para resolver CAPTCHA. Descubra benchmarks de desempenho, notas de estabilidade e como integrar o CapSolver para o máximo de sucesso.
