CAPSOLVER
Blog
GLM-5.3 Web Scraping: Extração Confiável e Tratamento de CAPTCHA

GLM-5.3 Web Scraping: Construir um pipeline de extração confiável com gerenciamento de CAPTCHA

Logo of CapSolver

Adélia Cruz

How to use CapSolver

29-Sep-2026

TL;DR

  • Use GLM-5.3 após o acesso e renderização, não como substituto da camada do navegador. O modelo deve receber texto de página permitido, capturas de tela ou registros normalizados apenas após a aplicação ter classificado a resposta.
  • Separe o acesso, tratamento de desafios, extração e validação. Isso permite distinguir um resultado vazio de uma página de login, limite de taxa, shell JavaScript ou checkpoint de CAPTCHA.
  • Use o CapSolver apenas para tarefas de verificação suportadas em fluxos autorizados. Mantenha o sessão do navegador, URL do site, parâmetros da tarefa, orçamento de tentativas e validação final sob controle da aplicação.
  • Exija saída estruturada do GLM-5.3 e a valide no código. Uma resposta JSON sintaticamente válida ainda pode conter valores ausentes, duplicados ou não suportados.
  • Armazene evidências com cada registro. URL de origem, horário de extração, hash de conteúdo e status de validação tornam os fluxos de trabalho de IA e dados mais fáceis de auditar.

Introdução: Onde o GLM-5.3 se encaixa em uma pipeline de raspagem de web

Modelos de linguagem grandes podem transformar conteúdo web inconsistente em registros úteis, mas não eliminam o trabalho operacional necessário para obter dados de página confiáveis. Uma pipeline de produção ainda precisa de verificações de permissão, limites de solicitação, execução do navegador quando o JavaScript for necessário, tratamento explícito para checkpoints de verificação e validação determinística antes que um registro chegue a um banco de dados.

GLM-5.3 é útil na camada de interpretação. Seu fluxo de trabalho compatível com API pode classificar conteúdo renderizado, mapear texto para um esquema, explicar por que um campo está ausente e ajudar a normalizar diferenças entre páginas. Para automação autorizada que encontre uma tarefa de verificação suportada, CapSolver pode ser colocado antes da extração enquanto a aplicação mantém o controle da sessão da página e verifica o resultado final.

Este guia apresenta uma arquitetura genérica, não instruções para um site específico. Use-o apenas para dados públicos ou de outra forma autorizados e pare quando um fluxo atingir limites de login, pagamento, dados pessoais ou permissões fora do escopo aprovado.

A arquitetura confiável: acesso primeiro, modelo depois

Um sistema robusto de raspagem de web com GLM-5.3 usa uma sequência de estágios pequenos. Cada estágio produz um resultado tipado que o próximo estágio pode verificar.

Estágio Responsabilidade Saída esperada Condição de parada
Porta de permissão Verificar destino, escopo de dados, taxa e propósito Definição de trabalho aprovada Escopo não autorizado
Camada de acesso Buscar ou renderizar a página Status, cabeçalhos, URL final, HTML ou captura de tela Login, pagamento, dados privados ou acesso negado
Classificador de resposta Identificar conteúdo, página vazia, limite de taxa ou página de verificação Estado da página nomeado Estado desconhecido ou não suportado
Adaptador de verificação Submeter uma tarefa documentada quando permitido Pronto, processando ou erro terminal Prazo ou orçamento de tentativas atingido
Extração do GLM Converter conteúdo permitido em um esquema estrito Registro JSON candidato Saída inválida ou não suportada por evidência
Validação determinística Verificar tipos, campos obrigatórios, duplicatas e evidência de origem Registro aceito ou rejeição explícita Qualquer regra de negócio falhar
Armazenamento Realizar gravação idempotente ID de registro estável e link de rastreamento Chave de origem já existe sem nova versão

A fronteira mais importante é entre acesso e interpretação. Se um modelo receber o HTML de uma página de desafio, ele pode descrever confiantemente essa página como o conteúdo alvo. Classifique a resposta antes de acionar o modelo.

Pré-requisitos

O exemplo de orquestração usa Python 3.11 ou superior e o pacote requests. Mantenha credenciais em variáveis de ambiente e nunca as inclua em código-fonte, prompts, logs, capturas de tela ou configuração comprometida.

bash Copy
python -m venv .venv
source .venv/bin/activate
pip install requests

export ZAI_API_KEY="replace-with-your-z-ai-key"
export CAPSOLVER_API_KEY="replace-with-your-capsolver-key"

A documentação oficial da API Z.ai usa o ponto final chat-completions em https://api.z.ai/api/paas/v4/chat/completions. Confirme o identificador do modelo atual no repositório GLM-5 ou no seu console Z.ai antes da implantação; este guia usa glm-5.3-flash como padrão configurável por ambiente.

Etapa 1: Defina um contrato de extração estrito

Não peça ao modelo para "extrair tudo importante". Defina os campos, comportamento permitido de nulos e requisitos de evidência antes de coletar uma página.

python Copy
from dataclasses import dataclass
from datetime import datetime, timezone
from typing import Any

@dataclass(frozen=True)
class ExtractionJob:
    source_url: str
    allowed_host: str
    required_fields: tuple[str, ...]
    max_input_chars: int = 40_000

def validate_record(job: ExtractionJob, record: dict[str, Any]) -> dict[str, Any]:
    missing = [name for name in job.required_fields if not record.get(name)]
    if missing:
        raise ValueError(f"missing_required_fields:{','.join(missing)}")
    if record.get("source_url") != job.source_url:
        raise ValueError("source_url_mismatch")
    record["validated_at"] = datetime.now(timezone.utc).isoformat()
    return record

O modelo só pode retornar null quando o esquema permitir explicitamente. Valores obrigatórios devem ser confirmados contra evidência da página por código comum.

Etapa 2: Classifique a página antes de enviá-la para o GLM-5.3

A camada de acesso deve retornar um pequeno objeto de estado em vez de apenas uma string de HTML. O classificador pode usar códigos de status, URL final, tipo de conteúdo, seletores esperados e marcadores conhecidos de checkpoint.

python Copy
from enum import Enum

class PageState(str, Enum):
    CONTENT = "content"
    JAVASCRIPT_REQUIRED = "javascript_required"
    RATE_LIMITED = "rate_limited"
    LOGIN_REQUIRED = "login_required"
    VERIFICATION = "verification"
    UNKNOWN = "unknown"

def choose_action(state: PageState) -> str:
    return {
        PageState.CONTENT: "extract",
        PageState.JAVASCRIPT_REQUIRED: "render_in_authorized_browser",
        PageState.RATE_LIMITED: "back_off",
        PageState.LOGIN_REQUIRED: "stop_for_operator",
        PageState.VERIFICATION: "evaluate_supported_task",
        PageState.UNKNOWN: "stop_for_review",
    }[state]

HTTP 403 e HTTP 429 não devem entrar em um loop de tentativa genérico. Uma solicitação recusada requer revisão de permissão e configuração. Uma solicitação limitada de taxa requer redução da concorrência global e respeito a qualquer janela de tentativa fornecida pelo servidor.

Etapa 3: Mantenha o tratamento de verificação limitado

A API oficial do CapSolver usa createTask para submeter uma tarefa documentada. Tarefas assíncronas são verificadas com getTaskResult. A aplicação deve selecionar o tipo de tarefa do documento atual task documentation e passar apenas os campos necessários para esse checkpoint autorizado.

python Copy
import os
import time
import requests

CAPSOLVER_BASE = "https://api.capsolver.com"

def solve_supported_task(task: dict, *, timeout_seconds: int = 45) -> dict:
    api_key = os.environ["CAPSOLVER_API_KEY"]
    created = requests.post(
        f"{CAPSOLVER_BASE}/createTask",
        json={"clientKey": api_key, "task": task},
        timeout=15,
    ).json()
    if created.get("errorId") != 0:
        raise RuntimeError(created.get("errorCode", "create_task_failed"))
    if created.get("status") == "ready":
        return created["solution"]

    task_id = created.get("taskId")
    if not task_id:
        raise RuntimeError("missing_task_id")

    deadline = time.monotonic() + timeout_seconds
    while time.monotonic() < deadline:
        time.sleep(3)
        result = requests.post(
            f"{CAPSOLVER_BASE}/getTaskResult",
            json={"clientKey": api_key, "taskId": task_id},
            timeout=15,
        ).json()
        if result.get("errorId") != 0:
            raise RuntimeError(result.get("errorCode", "task_failed"))
        if result.get("status") == "ready":
            return result["solution"]
        if result.get("status") not in {"idle", "processing"}:
            raise RuntimeError("unexpected_task_status")

    raise TimeoutError("verification_task_deadline_exceeded")

O chamador deve permitir apenas uma tentativa limitada por padrão. A solução retornada deve ser aplicada por meio do caminho de integração documentado no mesmo contexto de navegador que detectou o checkpoint. Se a página não transitar para o estado esperado, retorne uma falha ou solicite revisão humana.

Resgate seu código de bônus do CapSolver

Aumente seu orçamento de automação instantaneamente!
Use o código de bônus CAP26 ao recarregar sua conta do CapSolver para obter um bônus adicional de 5% em cada recarga — sem limites.
Resgate-o agora em seu Painel do CapSolver
Código de Bônus

Etapa 4: Envie conteúdo normalizado para o GLM-5.3

Após confirmar que a página é conteúdo, remova ruídos de navegação, scripts, elementos ocultos, banners repetidos e chrome de página irrelevante. Preserve títulos, rótulos, tabelas e referências de origem. Não envie cookies do navegador, cabeçalhos de autorização, dados pessoais ou rastros de sessão brutos para o modelo.

python Copy
import json
import os
import requests

ZAI_ENDPOINT = "https://api.z.ai/api/paas/v4/chat/completions"

def extract_with_glm(job: ExtractionJob, normalized_text: str) -> dict:
    prompt = {
        "source_url": job.source_url,
        "required_fields": list(job.required_fields),
        "rules": [
            "Retorne um objeto JSON e nenhuma prosa.",
            "Use apenas evidência presente em page_text.",
            "Não infira um valor obrigatório ausente.",
            "Inclua source_url exatamente como fornecido.",
        ],
        "page_text": normalized_text[: job.max_input_chars],
    }
    response = requests.post(
        ZAI_ENDPOINT,
        headers={
            "Authorization": f"Bearer {os.environ['ZAI_API_KEY']}",
            "Content-Type": "application/json",
        },
        json={
            "model": os.getenv("GLM_MODEL", "glm-5.3-flash"),
            "messages": [
                {"role": "system", "content": "Extraia dados estruturados com base em evidências."},
                {"role": "user", "content": json.dumps(prompt, ensure_ascii=False)},
            ],
            "temperature": 0,
        },
        timeout=60,
    )
    response.raise_for_status()
    content = response.json()["choices"][0]["message"]["content"]
    return json.loads(content)

Trate o exemplo como uma fronteira de adaptador. Confirme as opções de solicitação e recursos de saída estruturada na documentação oficial da Z.ai antes do uso em produção. Se o modelo envolver JSON em Markdown ou retornar texto fora do contrato, rejeite a resposta em vez de tentar repará-la silenciosamente.

Duas validações diferentes são necessárias.

Primeiro, valide o resultado do navegador. Confirme que a URL final, o título esperado, o contêiner de destino e a ausência de um novo erro correspondam ao fluxo pretendido. Uma resposta de tarefa bem-sucedida não é prova de que a página tenha continuado.

Segundo, valide o registro extraído. Verifique strings obrigatórias, intervalos numéricos, datas, URLs normalizadas, chaves duplicadas e trechos de evidência. Para campos de alto impacto, compare o valor com um seletor determinístico ou uma segunda representação independente da página.

python Copy
def run_extraction(job: ExtractionJob, state: PageState, page_text: str) -> dict:
    action = choose_action(state)
    if action != "extract":
        raise RuntimeError(f"page_not_ready_for_model:{action}")
    candidate = extract_with_glm(job, page_text)
    return validate_record(job, candidate)

Essa última etapa previne que uma página de desafio, alucinação do modelo ou renderização parcial entre no conjunto de dados como raspagem bem-sucedida.

Observabilidade e controles de custo

Registre um ID de rastreamento, URL de origem, URL final, estado da página, hash de conteúdo, nome do modelo, versão do prompt, versão do esquema, resultado da validação e tempo de processamento. Armazene IDs de tarefa e códigos de erro para depuração operacional de curto prazo, mas não armazene tokens de solução, segredos ou dados de sessão irrelevantes.

Aplicar um orçamento em toda a tarefa. Contar tentativas HTTP, navegações do navegador, tentativas de verificação, chamadas do GLM, caracteres de entrada e tempo decorrido. Quando o orçamento for esgotado, retorne uma falha tipada em vez de permitir que um componente reinicie o fluxo.

Um conjunto útil de métricas inclui:

  • percentual de páginas classificadas como conteúdo real antes do uso do modelo;
  • taxa de passagem da validação de esquema;
  • taxa de registros duplicados e vazios;
  • custo do navegador e modelo por registro aceito;
  • número de revisões humanas por motivo de parada;
  • sucesso total confirmado pela evidência da página final.

Modos comuns de falha

Sintoma Causa provável Ação correta
GLM retorna detalhes sobre uma página de verificação A resposta não foi classificada antes do prompt Pare a chamada do modelo e corrija a detecção do estado da página
JSON é analisado, mas os campos obrigatórios estão vazios Prompt ou evidência da fonte é incompleta Rejeite o registro e inspecione o conteúdo normalizado
Tarefa está pronta, mas a página permanece bloqueada Contexto do navegador ou parâmetros da tarefa não correspondem Compare URL, sessão, agente do usuário, tempo e requisitos documentados
Custo aumenta enquanto registros aceitos permanecem estáticos Escalação de navegador ou modelo é muito ampla Adicione filtros determinísticos e orçamentos por tarefa
Linhas duplicadas aparecem após tentativas Armazenamento não é idempotente Atualize por chave de origem estável e versão de conteúdo
HTTP 429 repete Concorrência é controlada por trabalhador, não globalmente Introduza um orçamento de taxa compartilhado e respeite as orientações de tentativa

Conclusão

O GLM-5.3 pode tornar a extração de dados da web mais flexível, mas a confiabilidade vem do sistema ao redor. Mantenha controle de acesso, renderização, classificação de estado da página, tratamento de verificação, validação de esquema e armazenamento como estágios explícitos. Use o modelo apenas após a aplicação ter confirmado que está olhando para o conteúdo pretendido.

Para um fluxo de navegador autorizado com uma tarefa de verificação suportada, CapSolver pode fornecer a fronteira da tarefa documentada. A aplicação permanece responsável por permissão, continuidade da sessão, tentativas limitadas, tratamento de segredos e prova de que o fluxo original foi concluído.

Fontes e leitura adicional

Perguntas frequentes

Q: O GLM-5.3 pode substituir um navegador em raspagem de web?

Não. Ele pode interpretar texto, capturas de tela ou registros normalizados, mas um navegador ou cliente HTTP ainda é responsável pela navegação, renderização, estado, permissões e verificação do resultado final.

Q: O HTML bruto deve ser enviado diretamente para o GLM-5.3?

Normalmente não. Classifique a resposta primeiro, remova scripts e ruído de layout repetido, preservando rótulos e estrutura significativos, e limite a entrada aos dados necessários pelo esquema de extração.

Q: Quando o fluxo de trabalho deve chamar o CapSolver?

Apenas após detectar uma tarefa suportada em um fluxo de trabalho permitido. Use o tipo de tarefa atualmente documentado, preservando o contexto do navegador necessário, defina um prazo e verifique se a página realmente continuou.

Q: Um JSON válido significa que o registro extraído está correto?

Não. A sintaxe JSON não comprova a precisão fática. Campos obrigatórios, tipos, URLs, datas, intervalos numéricos, duplicatas e evidências da fonte ainda devem ser verificados no código.

Q: O que deve acontecer quando o estado da página for desconhecido?

Pare e solicite revisão. Não envie conteúdo desconhecido para o modelo ou tente novamente por meio de etapas adicionais de navegador e verificação.

Q: O design pode ser usado para dados privados ou restritos?

O design não cria permissão. Use-o apenas para dados públicos ou de outra forma autorizados, minimize as informações coletadas e siga os termos, contratos e leis aplicáveis.

Declaração de Conformidade: As informações fornecidas neste blog são apenas para fins informativos. A CapSolver está comprometida em cumprir todas as leis e regulamentos aplicáveis. O uso da rede CapSolver para atividades ilegais, fraudulentas ou abusivas é estritamente proibido e será investigado. Nossas soluções de resolução de captcha melhoram a experiência do usuário enquanto garantem 100% de conformidade ao ajudar a resolver dificuldades de captcha durante a coleta de dados públicos. Incentivamos o uso responsável de nossos serviços. Para mais informações, visite nossos Termos de Serviço e Política de Privacidade.

Mais

Um resultado de CAPTCHA passa por verificações separadas da ferramenta, do solucionador e do navegador antes que um agente de IA prossiga.
Como Retornar Resultados de Ferramentas CAPTCHA que um Agente de IA Possa Usar

Leia corretamente os resultados da ferramenta de CAPTCHA: distinga erros de transporte, tarefas pendentes, saída do solucionador e sucesso no navegador antes de permitir que um agente de IA continue.

ai
Logo of CapSolver

Adélia Cruz

30-Oct-2026

Duas tarefas de navegador recebem seus próprios resultados de CAPTCHA mesmo quando a segunda tarefa termina primeiro.
Como Correspondenciar Resultados de CAPTCHA a Tarefas Paralelas de Agente de Navegador

Impeça que agentes de navegador paralelos misturem resultados de CAPTCHA. Mapeie IDs de tarefa para os donos das páginas, rejeite respostas obsoletas e teste o roteamento antes de aplicar uma solução.

ai
Logo of CapSolver

Adélia Cruz

29-Oct-2026

Duas rotas para uma tarefa de CAPTCHA por um agente de IA: requisições diretas à API ou uma chamada de ferramenta MCP, seguidas de verificação pela aplicação.
Como Escolher entre uma API de CAPTCHA e MCP para Agentes de IA

Escolha uma API de CAPTCHA ou MCP para o seu agente de IA comparando o controle de tarefas, a descoberta de ferramentas, o tratamento de resultados e as responsabilidades do navegador antes de integrar.

ai
Logo of CapSolver

Adélia Cruz

29-Oct-2026

Diagrama que separa a página ativa de um agente de uma sessão de navegador MCP baseada em URL.
Como corrigir chamadas MCP de CAPTCHA usando a sessão de navegador errada

Diagnostique chamadas MCP de CAPTCHA que abrem uma sessão de navegador diferente. Inspecione as entradas da ferramenta, mantenha a página original e verifique a tarefa antes de continuar.

ai
Logo of CapSolver

Adélia Cruz

28-Oct-2026

Qwen Code conecta-se a um servidor MCP local aprovado que expõe ferramentas de CAPTCHA.
Como configurar as ferramentas MCP de solução de CAPTCHA no Qwen Code

Conecte as ferramentas MCP de resolução de CAPTCHA ao Qwen Code, aprove o servidor do projeto, verifique sua conexão e escolha o token ou fluxo de trabalho de navegador adequado para a sua tarefa.

ai
Logo of CapSolver

Adélia Cruz

26-Oct-2026

Ferramenta Haystack conectada a uma página de navegador e um resultado de parâmetro CAPTCHA contendo tipo, URL e chave do site.
Como adicionar ferramentas de detecção de CAPTCHA aos agentes Haystack

Adicione uma ferramenta de inspeção de CAPTCHA ao Haystack, leia os parâmetros do reCAPTCHA com o SDK oficial e verifique a conexão antes de uma etapa separada de resolução.

ai
Logo of CapSolver

Adélia Cruz

22-Oct-2026