n8n web scraping: raspagem de dados e busca no Google sem código

Importe um workflow do n8n que percorre uma lista de palavras-chave, chama uma API de busca do Google, raspa as páginas do topo em markdown e grava linhas no Google Sheets ou em um CSV.

Dá para fazer web scraping e busca no Google no n8n com dois nós HTTP Request e nenhum código além de uma lista de palavras-chave: um chama https://api.fastaf.co/v1/serp para cada palavra-chave, o outro (opcional) chama /v1/scrape para os primeiros resultados e devolve markdown. Em 19 de outubro de 2026, o workflow abaixo transformou 3 palavras-chave em 30 linhas ranqueadas em 10,9 segundos e, com a raspagem ligada, em 8 páginas de markdown, tudo por 23 créditos (cerca de um centavo de dólar na taxa do pacote Starter, US$ 10 por 20.000 créditos).

Cole o JSON deste post no n8n, anexe uma credencial e clique em Execute. Os nós estão listados na tabela, e o arquivo completo vem logo depois.

O que o workflow de SERP no n8n faz?

Nó Tipo Função
Keywords Code Devolve um item por palavra-chave (troque por uma leitura do Sheets ou do Airtable)
Limit Limit Teto fixo de 20 palavras-chave por execução, ou seja, no máximo 100 créditos em buscas
Loop over keywords Loop Over Items, lote de tamanho 1 Envia uma palavra-chave por vez e junta todas as linhas na saída done
FastAF SERP HTTP Request GET /v1/serp?query=...&country=..., header Bearer, nova tentativa em caso de falha
Split results Split Out Transforma organic_results (10 por busca) em um item cada
Build rows Edit Fields Mantém palavra-chave, posição, título, link, snippet e data
Append to Google Sheet Google Sheets Desativado até você adicionar credenciais do Google
Convert to CSV, Write CSV Convert to File, Read/Write Files A alternativa se você não tem credenciais do Google
Top 3 only, FastAF scrape, Page + markdown Filter, HTTP Request, Edit Fields Opcional, desativado por padrão: markdown das 3 primeiras páginas de cada palavra-chave, pulando o YouTube

Rodei este arquivo no n8n 2.43.8 pela CLI (n8n execute), então os nós de HTTP, loop, split, filtro e CSV foram realmente executados. Não rodei o nó do Google Sheets: ele exige credenciais OAuth do Google que eu não tenho, por isso vai desativado. É a operação padrão de append do n8n, com mapeamento automático de colunas.

Qual é o JSON completo do workflow?

No n8n, crie um workflow e pressione Ctrl/Cmd+V no canvas com isto na área de transferência (ou use o menu, Import from File).

{
"name": "FastAF Google results to sheet",
"nodes": [
{"parameters":{},"id":"run-manually","name":"Run manually","type":"n8n-nodes-base.manualTrigger","typeVersion":1,"position":[0,200]},
{"parameters":{"jsCode":"const keywords = [\n  'n8n web scraping',\n  'google search api',\n  'serp api for ai agents',\n];\nreturn keywords.map((keyword) => ({ json: { keyword, country: 'us' } }));"},"id":"keywords","name":"Keywords","type":"n8n-nodes-base.code","typeVersion":2,"position":[220,200]},
{"parameters":{"maxItems":20},"id":"limit","name":"Limit","type":"n8n-nodes-base.limit","typeVersion":1,"position":[440,200]},
{"parameters":{"batchSize":1,"options":{}},"id":"loop-over-keywords","name":"Loop over keywords","type":"n8n-nodes-base.splitInBatches","typeVersion":3,"position":[660,200]},
{"parameters":{"url":"https://api.fastaf.co/v1/serp","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","sendQuery":true,"queryParameters":{"parameters":[{"name":"q","value":"={{ $json.keyword }}"},{"name":"country","value":"={{ $json.country }}"}]},"options":{"timeout":60000}},"id":"fastaf-serp","name":"FastAF SERP","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[880,320],"credentials":{"httpHeaderAuth":{"id":"fastaf-header-auth","name":"FastAF API key"}},"retryOnFail":true,"maxTries":5,"waitBetweenTries":3000},
{"parameters":{"fieldToSplitOut":"organic_results","include":"noOtherFields","options":{}},"id":"split-results","name":"Split results","type":"n8n-nodes-base.splitOut","typeVersion":1,"position":[1100,320]},
{"parameters":{"assignments":{"assignments":[{"id":"a1","name":"keyword","type":"string","value":"={{ $('Loop over keywords').item.json.keyword }}"},{"id":"a2","name":"position","type":"number","value":"={{ $json.rank }}"},{"id":"a3","name":"title","type":"string","value":"={{ $json.title }}"},{"id":"a4","name":"link","type":"string","value":"={{ $json.link }}"},{"id":"a5","name":"snippet","type":"string","value":"={{ $json.snippet || '' }}"},{"id":"a6","name":"checked_at","type":"string","value":"={{ $now.toISODate() }}"}]},"options":{}},"id":"build-rows","name":"Build rows","type":"n8n-nodes-base.set","typeVersion":3.4,"position":[1320,320]},
{"parameters":{"operation":"csv","options":{"fileName":"serp-results.csv"}},"id":"convert-to-csv","name":"Convert to CSV","type":"n8n-nodes-base.convertToFile","typeVersion":1.1,"position":[900,100]},
{"parameters":{"operation":"write","fileName":"/home/node/.n8n-files/serp-results.csv","options":{}},"id":"write-csv","name":"Write CSV","type":"n8n-nodes-base.readWriteFile","typeVersion":1,"position":[1120,100]},
{"parameters":{"operation":"append","documentId":{"__rl":true,"value":"YOUR_SPREADSHEET_ID","mode":"id"},"sheetName":{"__rl":true,"value":"Sheet1","mode":"name"},"columns":{"mappingMode":"autoMapInputData","value":{},"matchingColumns":[],"schema":[]},"options":{}},"id":"append-to-google-sheet","name":"Append to Google Sheet","type":"n8n-nodes-base.googleSheets","typeVersion":4.7,"position":[900,200],"disabled":true},
{"parameters":{"conditions":{"options":{"caseSensitive":true,"leftValue":"","typeValidation":"strict","version":2},"conditions":[{"id":"c1","leftValue":"={{ $json.position }}","rightValue":3,"operator":{"type":"number","operation":"lte"}},{"id":"c2","leftValue":"={{ $json.link }}","rightValue":"youtube.com","operator":{"type":"string","operation":"notContains"}}],"combinator":"and"},"options":{}},"id":"top-3-only","name":"Top 3 only","type":"n8n-nodes-base.filter","typeVersion":2.2,"position":[900,520]},
{"parameters":{"url":"https://api.fastaf.co/v1/scrape","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","sendQuery":true,"queryParameters":{"parameters":[{"name":"url","value":"={{ $json.link }}"},{"name":"formats","value":"markdown"}]},"options":{"timeout":60000,"response":{"response":{"responseFormat":"text","outputPropertyName":"markdown"}}}},"id":"fastaf-scrape","name":"FastAF scrape","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1120,520],"credentials":{"httpHeaderAuth":{"id":"fastaf-header-auth","name":"FastAF API key"}},"retryOnFail":true,"maxTries":5,"waitBetweenTries":3000,"disabled":true},
{"parameters":{"assignments":{"assignments":[{"id":"b1","name":"keyword","type":"string","value":"={{ $('Top 3 only').item.json.keyword }}"},{"id":"b2","name":"link","type":"string","value":"={{ $('Top 3 only').item.json.link }}"},{"id":"b3","name":"markdown","type":"string","value":"={{ $json.markdown }}"}]},"options":{}},"id":"page-+-markdown","name":"Page + markdown","type":"n8n-nodes-base.set","typeVersion":3.4,"position":[1340,520],"disabled":true}
],
"connections": {
"Run manually": {"main":[[{"node":"Keywords","type":"main","index":0}]]},
"Keywords": {"main":[[{"node":"Limit","type":"main","index":0}]]},
"Limit": {"main":[[{"node":"Loop over keywords","type":"main","index":0}]]},
"Loop over keywords": {"main":[[{"node":"Convert to CSV","type":"main","index":0},{"node":"Append to Google Sheet","type":"main","index":0},{"node":"Top 3 only","type":"main","index":0}],[{"node":"FastAF SERP","type":"main","index":0}]]},
"FastAF SERP": {"main":[[{"node":"Split results","type":"main","index":0}]]},
"Split results": {"main":[[{"node":"Build rows","type":"main","index":0}]]},
"Build rows": {"main":[[{"node":"Loop over keywords","type":"main","index":0}]]},
"Convert to CSV": {"main":[[{"node":"Write CSV","type":"main","index":0}]]},
"Top 3 only": {"main":[[{"node":"FastAF scrape","type":"main","index":0}]]},
"FastAF scrape": {"main":[[{"node":"Page + markdown","type":"main","index":0}]]}
},
"settings": {"executionOrder":"v1"}
}

Depois crie uma credencial do tipo Header Auth com o nome FastAF API key, o nome do header Authorization e o valor Bearer <sua chave> (a chave vem com os 500 créditos grátis). Abra os dois nós HTTP Request e selecione essa credencial. Para ligar a raspagem, selecione Top 3 only, FastAF scrape e Page + markdown e pressione D.

Por que usar um loop em vez de paginação?

O nó HTTP Request tem uma opção de Pagination, mas ela foi pensada para APIs que devolvem a URL da próxima página ou aceitam um contador de páginas (documentação do n8n). Um trabalho de ranking ou de pesquisa é diferente: você tem uma lista de palavras-chave e cada uma precisa de uma requisição. Uma busca devolve os 10 primeiros resultados orgânicos, que é o que você quer para checar posições.

Por isso o workflow usa o Loop Over Items (documentação) com lote de tamanho 1. Ele resolve duas coisas que você provavelmente faria errado. Mantém as requisições em sequência, o que importa no pacote Free, onde a concorrência é 1. E permite referenciar a palavra-chave mais adiante com $('Loop over keywords').item.json.keyword, de modo que cada linha carregue a palavra-chave de onde veio.

A saída done do loop dispara uma única vez, depois da última palavra-chave, com todas as linhas vindas de Build rows. É por isso que o Sheets, o CSV e o ramo de raspagem saem todos de done: rodam uma vez com 30 itens, e não 3 vezes com 10. Para resultados mais profundos, adicione um parâmetro de query page e um segundo loop; a página da API de busca do Google lista os parâmetros, e a versão em Python mostra o mesmo trabalho em código.

Como lidar com erros 429 e limitar o gasto?

Um 429 significa que um limite de taxa ou de concorrência foi atingido e vem com um header Retry-After (documentação). No n8n, abra o nó HTTP Request, Settings, e ligue Retry On Fail. O arquivo define Max Tries 5 e Wait Between Tries 3000 ms. O código-fonte do próprio n8n limita as tentativas a 2-5 e a espera a 0-5000 ms, então esses valores estão perto do teto, e a espera é fixa: o n8n não lê o Retry-After.

Conferi forçando as duas primeiras requisições de uma execução a responder 429. O n8n esperou 3 segundos entre as tentativas, a terceira funcionou e o nó terminou em 6,1 segundos. Requisições que falham nunca são cobradas, então tentar de novo não custa nada.

O gasto tem três limites, do mais apertado ao mais folgado:

  1. O nó Limit: 20 palavras-chave a 5 créditos dão 100 créditos de buscas por execução. Raspar as 3 primeiras páginas soma até 60, a 1 crédito cada.
  2. O saldo de créditos: quando ele acaba, a API devolve 402 insufficient_credits. O saldo pertence à conta e todas as chaves tiram dele, então é um teto rígido para a conta inteira.
  3. Para o 402, defina On Error como “Continue (using error output)” (documentação) para que a execução termine limpa em vez de falhar no meio.

E se eu não tenho credenciais do Google?

Use o ramo do CSV. Convert to CSV monta o arquivo com as 30 linhas e Write CSV o salva. Um detalhe em que esbarrei: o n8n se recusa a gravar fora da sua pasta de arquivos e falha com “Access to the file is not allowed” (~/.n8n-files, que é /home/node/.n8n-files na imagem Docker; a restrição é controlada por N8N_RESTRICT_FILE_ACCESS_TO, veja a documentação do n8n). O caminho do arquivo já aponta para lá. O resultado em 19 de outubro de 2026:

keyword,position,title,link,snippet,checked_at
n8n web scraping,1,Scrape and store data from multiple website pages - n8n,https://n8n.io/workflows/1073-scrape-and-store-data-from-multiple-website-pages/,This workflow allows extracting data from multiple pages website...,2026-10-19

Para o Google Sheets, coloque o ID da sua planilha no nó, confirme que a linha 1 tem os nomes das seis colunas, ative o nó e apague o ramo do CSV se não precisar dele.

Que números uma execução real produziu?

Execução de 19 de outubro de 2026, 3 palavras-chave (n8n web scraping, google search api, serp api for ai agents), país us, ramo de raspagem ligado:

Medida Resultado
Status da execução success, 10,9 s do início ao fim
Chamadas de busca 3, cerca de 3 s cada (8,9 s no nó)
Resultados orgânicos devolvidos 10 por palavra-chave, 30 linhas
Páginas raspadas 8 (as 3 primeiras por palavra-chave, YouTube filtrado), 1,5 s o lote
Tamanho do markdown de 37 a 26.313 caracteres por página
Créditos 3 x 5 + 8 x 1 = 23

Uma única chamada de confirmação à API de produção devolveu 200 em 4,4 segundos com X-FastAF-Credits-Used: 5. A latência da busca ao vivo varia, então use 3 a 4 segundos por palavra-chave como número de planejamento: 100 palavras-chave levam cerca de 5 minutos em um loop sequencial.

Duas páginas raspadas, ambas threads do Reddit, voltaram como uma única linha de 37 caracteres (um link “Skip to main content”). Páginas públicas nem sempre renderizam conteúdo útil, então confira o tamanho de markdown antes de passá-lo a um LLM. As opções de renderização estão no post sobre renderização de JavaScript.

Em que isso difere de um script em Python?

A lógica é a mesma de monitorar o ranking de palavras-chave com Python; o n8n acrescenta um editor visual, um agendador (troque Run manually por um Schedule Trigger) e conectores prontos. Se você precisa de histórico de posições e de diffs, um banco de dados e um script ainda são mais fáceis de testar. Se a saída é uma planilha ou uma mensagem no Slack, o n8n é mais curto.

Resumindo

  • Dois nós HTTP Request contra https://api.fastaf.co/v1 fazem os dois trabalhos: /serp a 5 créditos, /scrape a 1 crédito.
  • Loop Over Items com lote de tamanho 1 vence a paginação para listas de palavras-chave; leia os resultados na saída done.
  • Retry On Fail (5 tentativas, 3 s) absorve os 429; o nó Limit e o saldo da conta limitam o gasto.
  • Verificado em 19 de outubro de 2026: 3 palavras-chave, 30 linhas, 8 páginas, 23 créditos, 10,9 s. Não testado: o nó do Google Sheets.

Pegue uma chave grátis (500 créditos, sem cartão), importe o workflow e veja as linhas na sua própria planilha. Os parâmetros estão na documentação.