ProdutosIntegraçõesRecursosDocumentaçãoPreços
Começar agora

© 2026 CapSolver. All rights reserved.

Contacte-nos

Slack: lola@capsolver.com

Produtos

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • AWS WAF
  • Extensão de Navegador
  • Mais tipos de CAPTCHA

Integrações

  • Selenium
  • Playwright
  • Puppeteer
  • n8n
  • Parceiros
  • Ver todas as integrações

Recursos

  • Programa de Referenciação
  • Documentação
  • Referência da API
  • Blog
  • FAQ
  • Glossário
  • Estado

Legal

  • Termos de Serviço
  • Política de Privacidade
  • Política de Reembolso
  • Não vender os meus dados pessoais
//Como construir scrapers para coleta de dados na web no n8n com o CapSolver
Apr03, 2026

Como construir scrapers para coleta de dados na web no n8n com o CapSolver

Adélia Cruz

Adélia Cruz

Neural Network Developer

Se você já tentou coletar preços, dados de produtos ou conteúdo de páginas protegidas, já sabe que o difícil não é apenas carregar a URL. O fluxo de trabalho também precisa resolver os captchas do site, enviar o token resolvido da forma que o site espera e, em seguida, extrair os dados corretos da resposta protegida.

É por isso que exemplos simples de "resolver captchas e pronto" não são suficientes para automação real. Um site pode esperar o token em um cabeçalho, corpo do formulário, payload JSON, string de consulta, cookie ou outro campo específico da aplicação. Ele pode usar reCAPTCHA, Turnstile ou outro desafio de captcha totalmente diferente. E, uma vez que a resposta protegida retorne, os seletores e a lógica de saída ainda precisam corresponder ao seu objetivo.

Neste guia, você aprenderá a construir raspadores para sites protegidos por captcha no n8n usando CapSolver. A explicação principal está baseada no fluxo de trabalho do repositório Scraping — Price & Product Details — CapSolver + Schedule + Webhook, mas o mesmo modelo pode ser adaptado para:

  • coleta de preços e dados de produtos
  • verificação de estoque ou mudanças em conteúdo protegido
  • entrar em sua própria conta
  • disparar uma coleta em destino fixo de outra serviço por meio de um webhook

Este artigo trata de automação prática e autorizada em destinos que você possui, gerencia ou está autorizado a testar.

Importante: Estes fluxos de trabalho são exemplos e modelos iniciais, não receitas universais. Você deve esperar modificar as configurações de captcha, o método de envio do token, o payload da requisição, cabeçalhos, cookies, seletores de extração e a lógica de saída para corresponder a cada site específico.


O que este guia constrói

O exemplo principal deste artigo é um modelo de raspador de destino fixo que agora suporta dois modos de ativação:

  • Agendamento: execução automática a cada 6 horas
  • Webhook: disparar o mesmo destino configurado sob demanda

No modelo padrão do repositório, esse fluxo de trabalho:

  • resolve reCAPTCHA v3
  • busca uma página de produto protegida
  • envia o token através do cabeçalho x-recaptcha-token
  • extrai price e productName
  • compara o valor atual com $workflow.staticData
  • retorna um payload de alerta ou um payload de sem alteração

O mesmo padrão pode se tornar:

  • um raspador
  • um raspador de detalhes de produto
  • um verificador de estoque
  • um fluxo de login para sua própria conta

Casos de uso comuns

Esses modelos de repositório seguem o mesmo esqueleto reutilizável:

ativador → resolver captchas → enviar requisição protegida → extrair resultado → comparar/armazenar/saída

Essa estrutura se encaixa em vários casos de uso legítimos:

Caso de uso O que muda
Raspagem Extrair campos de preço e comparar ao longo do tempo
Raspagem de dados de produto Extrair campos como título, SKU, vendedor, estoque ou descrição
Verificação de estoque Comparar texto de disponibilidade, quantidade ou estado do botão de compra
Entrar em sua própria conta Enviar o token resolvido com sua requisição de login e verificar o sucesso do login
Recuperação de conteúdo protegido Buscar conteúdo com acesso restrito e retornar os campos extraídos
Raspagem disparada por webhook Permitir que outro serviço ative o destino configurado fixo sob demanda

A estrutura permanece reutilizável, mas os detalhes da implementação real podem ser diferentes em cada site. Na prática, os usuários devem tratar cada fluxo aqui como exemplo e, em seguida, adaptar a configuração de resolução, formato da requisição, localização do token e lógica de extração para o destino que estão automatizando.


Fluxo de trabalho: Exemplos de casos de uso

O fluxo de trabalho principal acima recupera conteúdo bruto da página e compara preços. Os fluxos a seguir estendem o mesmo padrão de resolução de captcha — Ativador → Resolver Captcha → Enviar Requisição Protegida → Avaliar Resultado — para casos de uso específicos. Cada um requer os mesmos pré-requisitos: uma instância n8n, uma credencial CapSolver e os parâmetros de captcha do destino.

Fluxo Propósito
Scraping — Price & Product Details — CapSolver + Schedule + Webhook Modelo de agendamento + webhook de destino fixo que resolve reCAPTCHA v3, envia o token no cabeçalho x-recaptcha-token, extrai price e productName, compara os valores com $workflow.staticData e pode ser usado para raspagem, extração de detalhes de produto ou verificações semelhantes em páginas de produto protegidas

Nota de ativação: Este modelo é importado como active: false. O caminho do webhook não está ativo até que você configure os espaços reservados, escolha sua credencial CapSolver e ative o fluxo de trabalho no n8n.


Pré-requisitos

Antes de começar, certifique-se de ter:

  1. Uma instância n8n
  2. Uma conta CapSolver com chave de API e saldo
  3. Um nó CapSolver configurado no n8n
  4. Um URL de destino e os campos que você deseja extrair
  5. Os parâmetros de captcha necessários para esse destino
  6. Uma compreensão clara de como a requisição protegida é realmente enviada no navegador

Para o exemplo principal deste artigo, o destino é assumido como usando reCAPTCHA, então os valores-chave são:

  • websiteURL
  • websiteKey
  • pageAction para reCAPTCHA v3

Importante: A explicação de identificação de parâmetros abaixo está intencionalmente limitada a exemplos de reCAPTCHA. Destinos reais podem usar um tipo de desafio diferente — como Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF ou MTCaptcha — e, nesse caso, a configuração do nó de resolução, campos necessários e padrão de requisição protegida serão diferentes.


Como Identificar os Parâmetros de reCAPTCHA

Para páginas protegidas por reCAPTCHA, os valores principais geralmente são:

Parâmetro O que significa
websiteURL A URL onde o captcha é exibido ou necessário
websiteKey A chave pública usada pela página
pageAction A string de ação esperada pela reCAPTCHA v3

No modelo de monitoramento de preço do repositório, o nó CapSolver é configurado com:

  • operation: reCAPTCHA v3
  • websiteURL: https://SEU-ALVO-SITE.com/pagina-de-produto
  • websiteKey: SUA_CHAVE_AQUI
  • pageAction: visualizar_produto

Ao inspecionar um destino de reCAPTCHA, verifique:

  • qual versão de reCAPTCHA ela usa
  • se pageAction é necessário
  • onde o token resolvido é realmente enviado

Importante: Esta não é uma seção de detecção universal de captchas. Se o destino usar um tipo de desafio diferente — como Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF ou MTCaptcha — você precisará alterar tanto as configurações do CapSolver quanto a requisição HTTP que envia o token resolvido.


Fluxo de trabalho principal: Scraping — Price & Product Details — CapSolver + Schedule + Webhook

O fluxo de trabalho do repositório Scraping — Price & Product Details — CapSolver + Schedule + Webhook agora suporta dois caminhos de ativação de destino fixo:

  • Todo 6 horas para verificações recorrentes
  • Webhook Trigger para execuções sob demanda

Ambos os caminhos usam os mesmos espaços reservados de destino e a mesma lógica de raspagem. A versão do webhook simplesmente termina em Responder ao Webhook para que o chamador receba o payload final de alerta ou sem alteração como JSON.

Caminho de Agendamento

O caminho de agendamento usa esses nós:

  1. Todo 6 horas
  2. Resolver reCAPTCHA v3
  3. Buscar Página de Produto
  4. Extrair Dados
  5. Comparar Dados
  6. Dados Alterados?
  7. Criar Alerta
  8. Sem Alteração

Caminho de Webhook

O caminho de webhook duplica a mesma lógica para o mesmo destino fixo:

  1. Webhook Trigger
  2. Resolver reCAPTCHA v3 [Webhook]
  3. Buscar Página de Produto [Webhook]
  4. Extrair Dados [Webhook]
  5. Comparar Dados [Webhook]
  6. Dados Alterados? [Webhook]
  7. Criar Alerta [Webhook]
  8. Sem Alteração [Webhook]
  9. Responder ao Webhook

Como a Lógica Principal Funciona

1. Ativador

Use agendamento quando quiser verificações recorrentes, como raspagem ou verificação de estoque.

Use webhook quando outro fluxo, serviço ou aplicação devem ativar o mesmo destino configurado sob demanda.

2. Resolver reCAPTCHA v3

O modelo usa:

Configuração Valor
Operação reCAPTCHA v3
websiteURL https://SEU-ALVO-SITE.com/pagina-de-produto
websiteKey SUACHAVE_AQUI
pageAction visualizar_produto

3. Buscar a Página Protegida

O token resolvido é enviado em um cabeçalho de requisição:

Cabeçalho Valor
user-agent Usuário do navegador
x-recaptcha-token {{ $json.data.solution.gRecaptchaResponse }}

Este é um dos detalhes mais importantes do fluxo de trabalho. O modelo do repositório não assume que o token sempre pertence a g-recaptcha-response. Neste exemplo, ele vai para um cabeçalho personalizado.

4. Extrair price e productName

O nó HTML extrai:

Chave Seletor CSS
price .product-price, [data-price], .price
productName h1, .product-title

5. Comparar com Execuções Anteriores

O nó Código armazena e compara os valores usando:

  • $workflow.staticData.lastPrice
  • $workflow.staticData.lastChecked

Isso permite que o fluxo de trabalho distinga entre:

  • primeira verificação
  • sem alteração
  • preço aumentado
  • preço diminuído

6. Ramificar para Alerta ou Sem Alteração

O nó IF verifica {{ $json.changed }}.

Se o preço mudou, o fluxo de trabalho vai para Criar Alerta.

Se não, vai para Sem Alteração.

No caminho do webhook, qualquer ramificação então vai para Responder ao Webhook.


Por Que Isto é Realmente um Modelo de Raspador

Embora o exemplo principal inclua lógica de comparação de preços, é mais útil pensar nele como um modelo de raspador de página de produto protegida com lógica de comparação.

As partes reutilizáveis são:

  • o modo de ativação
  • o tipo de captcha
  • as configurações de resolução
  • a requisição protegida
  • os seletores de extração
  • a lógica de comparação ou saída

É por isso que a mesma estrutura pode impulsionar:

  • raspagem
  • extração de detalhes de produto
  • verificação de estoque
  • validação de página protegida
  • verificação de login para sua própria conta

O Que Você Provavelmente Precisará Alterar

Esta é a parte que importa mais em um destino real.

Para a maioria dos sites reais, você deve assumir que quase tudo aqui é ajustável: o tipo de desafio, parâmetros de resolução, onde o token é enviado, o corpo da requisição, cookies, cabeçalhos, seletores e até os critérios finais de sucesso. Esses fluxos de trabalho do repositório são exemplos de padrões funcionais, não receitas fixas que se encaixam em cada site inalteradas.

1. Modo de Ativação

Os fluxos de caso de uso do repositório agora suportam agendamento + webhook.

Use:

  • agendamento para verificações recorrentes
  • webhook para ativação sob demanda de outro serviço

Os caminhos de webhook nestes modelos são ativadores de destino fixo, não APIs públicas para destinos fornecidos por usuários arbitrários.

2. Tipo de CAPTCHA

O exemplo principal de monitoramento de preço usa reCAPTCHA v3, mas seu destino pode usar:

  • reCAPTCHA v2
  • reCAPTCHA v3
  • Cloudflare Turnstile
  • Cloudflare Challenge
  • GeeTest V3 / V4
  • DataDome
  • AWS WAF
  • MTCaptcha
  • outro tipo de desafio suportado

Se isso mudar, você precisará atualizar o passo de resolução correspondente.

3. Configurações de Resolução de CAPTCHA

Mesmo que dois sites usem reCAPTCHA, as configurações ainda podem diferir.

Você pode precisar alterar:

  • a operação do CapSolver ou tipo de tarefa
  • websiteURL
  • websiteKey
  • pageAction
  • opções relacionadas a invisível/empresa
  • quaisquer outras configurações específicas do site

O modelo de raspador expõe esses como campos de configuração de espaço reservado porque eles são esperados para mudar.

4. Onde o Token É Enviado

Não assuma que o token sempre vai para o mesmo lugar.

Este repositório já mostra vários padrões:

Padrão Exemplo do repositório
Cabeçalho de requisição Scraping — CapSolver + Schedule usa x-recaptcha-token
Corpo do formulário Fluxos de login normalmente usam g-recaptcha-response no corpo codificado em formulário

Em sites reais, o token resolvido pode pertencer a:

  • um cabeçalho
  • um campo do formulário
  • um payload JSON
  • um parâmetro de consulta
  • um cookie
  • um campo oculto
  • outro valor específico da aplicação

Este exemplo do repositório é um padrão de envio, não um universal.

5. A Própria Requisição Protegida

A requisição protegida pode exigir mais do que apenas o token de captcha ou desafio.

Você pode precisar ajustar:

  • cabeçalhos
  • cookies
  • valores CSRF
  • campos ocultos
  • codificação de formulário
  • formato do corpo JSON
  • método de requisição

Isso é especialmente comum para:

  • fluxos de login
  • submissões de checkout ou formulários com acesso restrito

6. O Que Você Extrai

O modelo principal de raspagem extrai:

  • price
  • productName

Mas você pode trocar por:

  • título
  • status de estoque
  • SKU
  • descrição
  • valores de variante
  • texto de disponibilidade
  • blocos completos de conteúdo protegido

7. O Que Você Compara ou Saída

O código de monitoramento de preço atual compara valores numéricos, mas o mesmo padrão pode ser adaptado para:

  • mudança de preço
  • mudança de estoque
  • sucesso do login
  • sucesso do cadastro
  • diferença de conteúdo
  • estado de saúde do site
  • exportação de dados brutos sem comparação

Importar Este Fluxo de Trabalho

O JSON abaixo é a versão importável atual de Scraping — Price & Product Details — CapSolver + Schedule + Webhook deste repositório, incluindo os caminhos de agendamento + webhook.

Clique para expandir o JSON do fluxo
json Copy
{
  "nodes": [
    {
      "parameters": {
        "content": "## Scraping \u2014 Price & Product Monitor\n\n### Como funciona\n\n1. Dispara por meio de um agendamento ou entrada de webhook para iniciar o monitoramento de preços.\n2. Resolve reCAPTCHA para acessar a página de produto alvo.\n3. Recupera e extrai dados da página de produto para análise posterior.\n4. Compara os dados recentemente obtidos com os dados anteriormente armazenados para detectar mudanças.\n5. Verifica se houve mudanças e prepara alertas, se necessário.\n6. Envia respostas com base na análise dos dados por canais designados.\n\n### Passos de configuração\n\n- [ ] Configure o intervalo do gatilho agendado no nó 'Todo 6 horas'.\n- [ ] Defina os detalhes do site alvo no nó 'Definir Configuração do Alvo [Agendamento]'.\n- [ ] Configure o solucionador de reCAPTCHA com a chave de API no nós 'Resolver reCAPTCHA v3'.\n- [ ] Defina a URL e caminho do webhook no 'Webhook Trigger'.\n- [ ] Defina os critérios e destino do alerta nos nós 'Criar Alerta'.\n\n### Personalização\n\nAjuste o padrão de extração nos nós 'Extrair Dados' para se adequar aos detalhes específicos do produto.",
        "height": 896,
        "width": 480
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -1328,
        -304
      ],
      "id": "52c7808e-d2bc-4779-85e6-909a51066338",
      "name": "Nota Colante"
    },
    {
      "parameters": {
        "content": "## Configuração do gatilho agendado\n\nInicia o processo de monitoramento de dados a cada 6 horas usando um gatilho agendado e define a configuração do destino para raspagem.",
        "height": 320,
        "width": 496,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -752,
        -160
      ],
      "id": "3c5cee67-552d-48ea-8717-7c5126269e2e",
      "name": "Nota Colante1"
    },
    {
      "parameters": {
"content": "## Processo de raspagem agendado\n\nResolve o reCAPTCHA, busca a página do produto, extrai os dados e os compara com registros anteriores para identificar mudanças, seguindo um gatilho agendado.",
        "height": 496,
        "width": 1680,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -144,
        -304
      ],
      "id": "d0315be2-111c-4893-bf42-2f2cc2eb186f",
      "name": "Nota Colante2"
    },
    {
      "parameters": {
        "content": "## Configuração do gatilho de webhook\n\nGerencia a monitoração de dados acionada manualmente por meio de um webhook de entrada e resolve o reCAPTCHA para prosseguir.",
        "height": 304,
        "width": 816,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        -768,
        336
      ],
      "id": "a78f1606-07fb-40fd-af82-e1dc9b766206",
      "name": "Nota Colante3"
    },
    {
      "parameters": {
        "content": "## Processo de raspagem por webhook\n\nProcessa solicitações acionadas por webhook buscando a página do produto, extraíndo dados e identificando mudanças.",
        "height": 272,
        "width": 1088,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        160,
        320
      ],
      "id": "1a677fd9-a3a8-404f-ba9a-2b087d7bfe11",
      "name": "Nota Colante4"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 6
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        -704,
        0
      ],
      "id": "sc-901",
      "name": "A cada 6 horas"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "cfg-001",
              "name": "websiteURL",
              "value": "https://SEU-SITE-ALVO.com/pagina-do-produto",
              "type": "string"
            },
            {
              "id": "cfg-002",
              "name": "websiteKey",
              "value": "CHAVE_DO_SITE_AQUI",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -400,
        0
      ],
      "id": "sc-900",
      "name": "Definir Configuração de Alvo [Agendamento]"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v3",
        "websiteURL": "={{ $json.websiteURL }}",
        "websiteKey": "={{ $json.websiteKey }}",
        "optional": {
          "pageAction": "visualizar_produto"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        0
      ],
      "id": "sc-902",
      "name": "Resolver reCAPTCHA v3",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "Conta CapSolver"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Definir Configuração de Alvo [Agendamento]').first().json.websiteURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "x-recaptcha-token",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {}
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        0
      ],
      "id": "sc-903",
      "name": "Buscar Página do Produto"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".preco-do-produto, [data-preco], .preco"
            },
            {
              "key": "productName",
              "cssSelector": "h1, .titulo-do-produto"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        0
      ],
      "id": "sc-904",
      "name": "Extrair Dados"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produto';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'caiu' : 'aumentou') : 'sem alteração';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'primeira verificação', changed, direction, diff: changed ? `R$${diff}` : null, checkedAt: new Date().toISOString() } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        0
      ],
      "id": "sc-905",
      "name": "Comparar Dados"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "if-1",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1104,
        0
      ],
      "id": "sc-906",
      "name": "Dados Alterados?"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "alert",
              "value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "severidade",
              "value": "={{ $json.direction === 'caiu' ? 'oferta' : 'informação' }}",
              "type": "string"
            },
            {
              "id": "a3",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1392,
        -192
      ],
      "id": "sc-907",
      "name": "Criar Alerta"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "n1",
              "name": "status",
              "value": "sem_alteracao",
              "type": "string"
            },
            {
              "id": "n2",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "n3",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1392,
        32
      ],
      "id": "sc-908",
      "name": "Sem Alteração"
    },
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "monitoramento-de-precos",
        "responseMode": "responseNode",
        "options": {}
      },
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2.1,
      "position": [
        -720,
        464
      ],
      "id": "sc-909",
      "name": "Gatilho de Webhook",
      "webhookId": "sc-909-webhook",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "operation": "reCAPTCHA v3",
        "websiteURL": "={{ $json.body.websiteURL }}",
        "websiteKey": "={{ $json.body.websiteKey }}",
        "optional": {
          "pageAction": "={{ $json.body.pageAction || 'visualizar_produto' }}"
        }
      },
      "type": "n8n-nodes-capsolver.capSolver",
      "typeVersion": 1,
      "position": [
        -96,
        464
      ],
      "id": "sc-910",
      "name": "Resolver reCAPTCHA v3 [Webhook]",
      "credentials": {
        "capSolverApi": {
          "id": "BeBFMAsySMsMGeE9",
          "name": "Conta CapSolver"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Gatilho de Webhook').item.json.body.websiteURL }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "user-agent",
              "value": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
            },
            {
              "name": "x-recaptcha-token",
              "value": "={{ $json.data.solution.gRecaptchaResponse }}"
            }
          ]
        },
        "options": {
          "response": {
            "response": {}
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        208,
        432
      ],
      "id": "sc-911",
      "name": "Buscar Página do Produto [Webhook]"
    },
    {
      "parameters": {
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".preco-do-produto, [data-preco], .preco"
            },
            {
              "key": "productName",
              "cssSelector": "h1, .titulo-do-produto"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.html",
      "typeVersion": 1.2,
      "position": [
        512,
        432
      ],
      "id": "sc-912",
      "name": "Extrair Dados [Webhook]"
    },
    {
      "parameters": {
        "jsCode": "const staticData = $workflow.staticData;\nconst currentPrice = $input.first().json.price;\nconst previousPrice = staticData.lastPrice;\nconst productName = $input.first().json.productName || 'Produto';\nconst parsePrice = (str) => { if (!str) return null; const match = str.match(/[\\d,]+\\.?\\d*/); return match ? parseFloat(match[0].replace(',', '')) : null; };\nconst currentNum = parsePrice(currentPrice);\nconst previousNum = parsePrice(previousPrice);\nstaticData.lastPrice = currentPrice;\nstaticData.lastChecked = new Date().toISOString();\nconst changed = previousNum !== null && currentNum !== null && currentNum !== previousNum;\nconst direction = changed ? (currentNum < previousNum ? 'caiu' : 'aumentou') : 'sem alteração';\nconst diff = changed ? Math.abs(currentNum - previousNum).toFixed(2) : '0';\nreturn [{ json: { productName, currentPrice, previousPrice: previousPrice || 'primeira verificação', changed, direction, diff: changed ? `R$${diff}` : null, checkedAt: new Date().toISOString() } }];"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        432
      ],
      "id": "sc-913",
      "name": "Comparar Dados [Webhook]"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "if-2",
              "leftValue": "={{ $json.changed }}",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1104,
        432
      ],
      "id": "sc-914",
      "name": "Dados Alterados? [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a4",
              "name": "alert",
              "value": "=Preço {{ $json.direction }} para {{ $json.productName }}: {{ $json.previousPrice }} → {{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "a5",
              "name": "severidade",
              "value": "={{ $json.direction === 'caiu' ? 'oferta' : 'informação' }}",
              "type": "string"
            },
            {
              "id": "a6",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1424,
        384
      ],
      "id": "sc-915",
      "name": "Criar Alerta [Webhook]"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "n4",
              "name": "status",
              "value": "sem_alteracao",
              "type": "string"
            },
            {
              "id": "n5",
              "name": "currentPrice",
              "value": "={{ $json.currentPrice }}",
              "type": "string"
            },
            {
              "id": "n6",
              "name": "checkedAt",
              "value": "={{ $json.checkedAt }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1440,
        592
      ],
      "id": "sc-916",
      "name": "Sem Alteração [Webhook]"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ JSON.stringify($json) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.5,
      "position": [
        1712,
        512
      ],
      "id": "sc-917",
      "name": "Responder ao Webhook"
    }
  ],
  "connections": {
    "A cada 6 horas": {
      "main": [
        [
          {
"node": "Configurar Alvo [Agendamento]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Configurar Alvo [Agendamento]": {
      "main": [
        [
          {
            "node": "Resolver reCAPTCHA v3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Resolver reCAPTCHA v3": {
      "main": [
        [
          {
            "node": "Buscar Página do Produto",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Buscar Página do Produto": {
      "main": [
        [
          {
            "node": "Extrair Dados",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extrair Dados": {
      "main": [
        [
          {
            "node": "Comparar Dados",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comparar Dados": {
      "main": [
        [
          {
            "node": "Dados Alterados?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dados Alterados?": {
      "main": [
        [
          {
            "node": "Criar Alerta",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Nenhuma Alteração",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gatilho Webhook": {
      "main": [
        [
          {
            "node": "Resolver reCAPTCHA v3 [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Resolver reCAPTCHA v3 [Webhook]": {
      "main": [
        [
          {
            "node": "Buscar Página do Produto [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Buscar Página do Produto [Webhook]": {
      "main": [
        [
          {
            "node": "Extrair Dados [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extrair Dados [Webhook]": {
      "main": [
        [
          {
            "node": "Comparar Dados [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Comparar Dados [Webhook]": {
      "main": [
        [
          {
            "node": "Dados Alterados? [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dados Alterados? [Webhook]": {
      "main": [
        [
          {
            "node": "Criar Alerta [Webhook]",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Nenhuma Alteração [Webhook]",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Criar Alerta [Webhook]": {
      "main": [
        [
          {
            "node": "Responder ao Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Nenhuma Alteração [Webhook]": {
      "main": [
        [
          {
            "node": "Responder ao Webhook",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "meta": {
    "instanceId": "962ff0267b713be0344b866fa54daae28de8ed2144e2e6867da355dae193ea1f"
  }
}

Teste

Após configurar os marcadores de posição e ativar o fluxo de trabalho, dispare o caminho do webhook:

bash Copy
curl -X POST https://sua-instância-n8n.com/webhook/monitoramento-de-preços \
  -H "Content-Type: application/json" \
  -d '{}'

Resposta esperada (primeira verificação):

json Copy
{
  "status": "sem_alteração",
  "preço_atual": "$29.99",
  "verificado_em": "2026-03-11T08:00:00.000Z"
}

Resposta esperada (preço alterado):

json Copy
{
  "alerta": "O preço caiu para Widget Pro: $39.99 → $29.99 (-$10.00)",
  "gravidade": "oferta",
  "verificado_em": "2026-03-11T14:00:00.000Z"
}

Uma resposta com dados de preço reais confirma que o pipeline completo funcionou — captcha resolvido, página protegida obtida, dados extraídos e lógica de comparação executada.


Solução de Problemas

Token Resolvido, Mas Ainda Bloqueado

Se o CapSolver retornar um token, mas o site ainda bloquear a solicitação, o problema geralmente não está na resolução em si. Causas comuns:

  • tipo de captcha incorreto
  • configurações de resolução incorretas
  • pageAction incorreto
  • token enviado no local errado
  • cookies, cabeçalhos ou campos ocultos ausentes

O Site Usa um Tipo de Desafio Diferente

Se o alvo usar um desafio não reCAPTCHA — como Cloudflare Turnstile, Cloudflare Challenge, GeeTest, DataDome, AWS WAF ou MTCaptcha — o exemplo principal não funcionará sem alterações. Você precisará atualizar:

  • a configuração do nó CapSolver
  • os parâmetros de desafio esperados
  • a requisição protegida que envia o token

Seletores Retornam Nada

Se o nó HTML não extrair os campos que você espera:

  • verifique se você está realmente recebendo a página protegida
  • confirme os seletores contra o HTML retornado
  • certifique-se de que os dados estão presentes na resposta bruta e não apenas após o renderização do lado do cliente

Webhook Não Funciona

Os modelos do repositório são importados como inativos. Até que você:

  1. configure os marcadores de posição
  2. escolha as credenciais
  3. ative o fluxo de trabalho

o caminho do webhook não estará ativo.


Práticas Recomendadas

  1. Use o token imediatamente após resolvê-lo.
  2. Inspeção o pedido exato do navegador antes de copiá-lo para o n8n.
  3. Suponha que cada alvo possa precisar de configurações de resolução diferentes.
  4. Suponha que cada alvo possa precisar de lógica de envio diferente.
  5. Verifique a resposta protegida antes de depurar os seletores.
  6. Trate os modelos do repositório como pontos de partida, não como soluções universais.
  7. Mantenha os modelos de webhook com alvo fixo, a menos que você tenha razão para expor mais.
  8. Teste o ciclo completo de resolução -> envio -> extração, não apenas o passo de resolução.
  9. Adicione nós de notificação ou armazenamento após Criar Alerta ou os nós de sucesso/falha de autenticação.

Pronto para começar? Registre-se no CapSolver e use o código de bônus OPENCLAW para obter um bônus adicional de 6% na primeira recarga!


Conclusão

A principal lição é simples: resolver captchas é apenas um passo no fluxo de trabalho. O verdadeiro raspador ainda precisa enviar o token corretamente, enviar a forma de requisição correta e extrair os campos que importam para o seu caso de uso.

Também é por isso que esses modelos devem ser tratados como exemplos. Um site diferente pode usar um tipo de captcha diferente, esperar o token em outro lugar, precisar de cookies ou campos adicionais, retornar uma forma de resposta diferente e exigir lógica de extração ou validação diferente.

Este modelo fornece um ponto de partida para:

  • raspagem ou extração de dados
  • monitoramento de produtos
  • verificação de estoque
  • recuperação de conteúdo protegido

Ele usa o padrão geral:

gatilho -> resolver captchas -> enviar requisição protegida -> extrair ou verificar resultado -> saída

Configure os marcadores de posição, mantenha os fluxos de trabalho inativos até que correspondam ao seu alvo e, em seguida, ative o caminho de agendamento ou webhook que se adequa ao seu caso de uso.


Perguntas Frequentes

Posso usar isso para entrar em minha própria conta?

O modelo de raspagem pode ser adaptado para fluxos de login alterando o nó HTTP Request para enviar credenciais junto com o token resolvido. Consulte os guias dedicados para tipos de captcha (reCAPTCHA, Turnstile, etc.) para modelos prontos de fluxo de login.

O que fazer se o site usar um tipo de desafio diferente?

Nesse caso, você deve modificar o fluxo de trabalho. As configurações de reCAPTCHA e o padrão de requisição do exemplo principal não são universais. O CapSolver suporta Cloudflare Turnstile, Cloudflare Challenge, GeeTest V3/V4, DataDome, AWS WAF, MTCaptcha e outros. Atualize o passo de resolução do CapSolver e a requisição protegida para corresponder ao tipo de desafio e padrão de envio de token reais usados pelo alvo.

Onde devo enviar o token?

Onde o site alvo espera. Isso pode ser:

  • um cabeçalho
  • um corpo de formulário
  • um payload JSON
  • um parâmetro de consulta
  • um cookie
  • um campo oculto

O modelo de monitoramento de preço usa um cabeçalho. Outros sites variam.

Preciso alterar as configurações do CapSolver para cada site?

Normalmente, sim. Mesmo sites que usam a mesma família de captcha podem exigir websiteURL, websiteKey, pageAction, configurações invisíveis ou outras opções de tarefa diferentes.

Posso raspar algo diferente de preço?

Sim. Substitua os seletores e a lógica de saída pelo que precisar, como estoque, título, SKU, descrição, conteúdo protegido, status de login ou sinais de saúde do site.

Como saber se o payload da requisição ou os seletores estão incorretos?

Comece verificando a resposta protegida retornada pelo nó HTTP Request.

  • Se a resposta ainda estiver bloqueada ou incompleta, a forma da requisição provavelmente está incorreta.
  • Se a resposta estiver correta, mas a extração falhar, os seletores ou a lógica de análise provavelmente estão incorretos.

Debugue o fluxo na ordem: resolver -> enviar -> inspecionar resposta -> extrair.

Ver mais

n8nMar 09, 2026

Como Resolver reCAPTCHA v2/v3 Usando CapSolver e n8n

Bangun API solver eCAPTCHA v2/v3 menggunakan CapSolver dan n8n. Pelajari cara mengotomatisasi penyelesaian token, mengirimkannya ke website, dan mengekstrak data yang dilindungi tanpa coding.

Adélia Cruz
Adélia Cruz
Apr 22, 2026

Melhor IA para resolver quebra-cabeças de imagens: Melhores Ferramentas e Estratégias para 2026

Descubra a melhor IA para resolver quebra-cabeças de imagens. Aprenda como os APIs ImageToText e o Vision Engine da CapSolver automatizam desafios visuais complexos com alta precisão.

Índice

Adélia Cruz
Adélia Cruz
web scrapingApr 22, 2026

Arquitetura de Web Scraping em Rust para Extração de Dados Escalável

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.

Adélia Cruz
Adélia Cruz
Apr 22, 2026

API de Busca vs Cadeia de Suprimentos de Conhecimento: Guia da Infraestrutura de Dados de IA

Aprenda como ferramentas de API de busca, cadeias de suprimento de conhecimento, fluxos de trabalho da API SERP e pipelines de dados de IA modelam a infraestrutura de dados da web moderna para IA.

Adélia Cruz
Adélia Cruz
Blog
All