n8n web scraping y búsqueda en Google: un workflow sin código

Importa un workflow de n8n que recorre una lista de palabras clave, llama a una API de búsqueda de Google, extrae las páginas top a markdown y guarda filas en Google Sheets o CSV.

Puedes hacer n8n web scraping y búsqueda en Google con dos nodos HTTP Request y nada de código salvo una lista de palabras clave: uno llama a https://api.fastaf.co/v1/serp por cada keyword, y el otro (opcional) llama a /v1/scrape para los primeros resultados y devuelve markdown. El 19 de octubre de 2026, el workflow de abajo convirtió 3 palabras clave en 30 filas posicionadas en 10,9 segundos y, con el scraping activado, en 8 páginas de markdown, por 23 créditos en total (aproximadamente un céntimo al precio del pack Starter, 10 $ por 20.000 créditos).

Pega el JSON de este artículo en n8n, asocia una credencial y pulsa Execute. Los nodos están en la tabla y el archivo completo viene después.

¿Qué hace el workflow de SERP en n8n?

Nodo Tipo Función
Keywords Code Devuelve un item por palabra clave (cámbialo por una lectura de Sheets o Airtable)
Limit Limit Tope duro de 20 palabras clave por ejecución, es decir, 100 créditos de búsquedas como máximo
Loop over keywords Loop Over Items, batch size 1 Envía una palabra clave cada vez y recoge todas las filas en la salida done
FastAF SERP HTTP Request GET /v1/serp?query=...&country=..., cabecera Bearer, reintento si falla
Split results Split Out Convierte organic_results (10 por búsqueda) en un item cada uno
Build rows Edit Fields Conserva keyword, position, title, link, snippet, date
Append to Google Sheet Google Sheets Desactivado hasta que añadas credenciales de Google
Convert to CSV, Write CSV Convert to File, Read/Write Files La alternativa si no tienes credenciales de Google
Top 3 only, FastAF scrape, Page + markdown Filter, HTTP Request, Edit Fields Opcional, desactivado por defecto: markdown de las 3 primeras páginas por palabra clave, sin YouTube

Ejecuté este archivo en n8n 2.43.8 con la CLI (n8n execute), así que los nodos HTTP, de bucle, de división, de filtro y de CSV se ejecutaron de verdad. No ejecuté el nodo de Google Sheets: necesita credenciales OAuth de Google que no tengo, por eso va desactivado. Es la operación append estándar de n8n con mapeo automático de columnas.

¿Cuál es el JSON completo del workflow?

En n8n, crea un workflow y pulsa Ctrl/Cmd+V en el lienzo con esto en el portapapeles (o usa el menú, 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"}
}

Después crea una credencial de tipo Header Auth con el nombre FastAF API key, nombre de cabecera Authorization y valor Bearer <tu clave> (la clave viene con los 500 créditos gratis). Abre los dos nodos HTTP Request y selecciona esa credencial. Para activar la rama de scraping, selecciona Top 3 only, FastAF scrape y Page + markdown y pulsa D.

¿Por qué recorrer las palabras clave en un bucle en vez de usar paginación?

El nodo HTTP Request tiene una opción Pagination, pero está pensada para APIs que devuelven la URL de la página siguiente o aceptan un contador de página (documentación de n8n). Un trabajo de rank tracking o de investigación es distinto: tienes una lista de palabras clave y cada una necesita una solicitud. Una búsqueda devuelve los 10 primeros resultados orgánicos, que es lo que quieres para comprobar posiciones.

Por eso el workflow usa Loop Over Items (documentación) con batch size 1. Hace dos cosas que de otro modo te saldrían mal. Mantiene las solicitudes en secuencia, lo que importa en el pack Free, donde la concurrencia es 1. Y te permite referenciar la palabra clave más adelante con $('Loop over keywords').item.json.keyword, de modo que cada fila lleve la keyword de la que viene.

La salida done del bucle se activa una sola vez, tras la última palabra clave, con todas las filas de Build rows. Por eso Sheets, el CSV y la rama de scraping cuelgan de done: se ejecutan una vez con 30 items, no 3 veces con 10. Para resultados más profundos, añade un parámetro page y un segundo bucle; la página de la API SERP de Google lista los parámetros, y la versión en Python muestra el mismo trabajo en código.

¿Cómo gestiono los errores 429 y limito el gasto?

Un 429 indica que se alcanzó un límite de tasa o de concurrencia y trae una cabecera Retry-After (documentación). En n8n, abre el nodo HTTP Request, Settings, y activa Retry On Fail. El archivo fija Max Tries en 5 y Wait Between Tries en 3000 ms. El código fuente de n8n limita los intentos a 2-5 y la espera a 0-5000 ms, así que estos valores están cerca del techo, y la espera es fija: n8n no lee Retry-After.

Lo comprobé haciendo que las dos primeras solicitudes de una ejecución respondieran 429. n8n esperó 3 segundos entre intentos, el tercero funcionó y el nodo terminó en 6,1 segundos. Las solicitudes fallidas nunca se cobran, así que reintentar no cuesta nada.

El gasto tiene tres límites, del más estricto al más laxo:

  1. El nodo Limit: 20 palabras clave a 5 créditos son 100 créditos de búsquedas por ejecución. Extraer las 3 primeras páginas añade hasta 60 a 1 crédito cada una.
  2. El saldo de créditos: cuando se agota, la API devuelve 402 insufficient_credits. El saldo pertenece a la cuenta y todas las claves tiran de él, así que es un tope duro para toda la cuenta.
  3. Para un 402, configura On Error en “Continue (using error output)” (documentación) para que la ejecución termine limpiamente en vez de fallar a medias.

¿Y si no tengo credenciales de Google?

Usa la rama de CSV. Convert to CSV construye el archivo con las 30 filas y Write CSV lo guarda. Un detalle con el que tropecé: n8n se niega a escribir fuera de su carpeta de archivos y falla con “Access to the file is not allowed” (~/.n8n-files, que en la imagen de Docker es /home/node/.n8n-files; la restricción se controla con N8N_RESTRICT_FILE_ACCESS_TO, consulta la documentación de n8n). La ruta del archivo ya apunta ahí. El resultado del 19 de octubre 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 Google Sheets, pon el ID de tu hoja de cálculo en el nodo, asegúrate de que la fila 1 contiene los seis nombres de columna, activa el nodo y borra la rama de CSV si no la necesitas.

¿Qué números dio una ejecución real?

Ejecución del 19 de octubre de 2026, 3 palabras clave (n8n web scraping, google search api, serp api for ai agents), país us, rama de scraping activada:

Métrica Resultado
Estado de la ejecución success, 10,9 s de principio a fin
Llamadas de búsqueda 3, unos 3 s cada una (8,9 s en el nodo)
Resultados orgánicos devueltos 10 por palabra clave, 30 filas
Páginas extraídas 8 (top 3 por palabra clave, sin YouTube), 1,5 s el lote
Tamaño del markdown de 37 a 26.313 caracteres por página
Créditos 3 x 5 + 8 x 1 = 23

Una sola llamada de confirmación a la API de producción devolvió 200 en 4,4 segundos con X-FastAF-Credits-Used: 5. La latencia de la búsqueda en vivo varía, así que toma de 3 a 4 segundos por palabra clave como cifra de planificación: 100 palabras clave son unos 5 minutos en un bucle secuencial.

Dos de las páginas extraídas, ambas hilos de Reddit, volvieron como una sola línea de 37 caracteres (un enlace “Skip to main content”). Las páginas públicas no siempre se renderizan con contenido útil, así que comprueba la longitud de markdown antes de pasárselo a un LLM. Las opciones de renderizado están en el artículo sobre renderizado de JavaScript.

¿En qué se diferencia de un script de Python?

La lógica es la misma que al monitorizar el ranking de palabras clave con Python; n8n añade un editor visual, un planificador (cambia Run manually por un Schedule Trigger) y conectores listos para usar. Si necesitas historial de posiciones y diffs, una base de datos y un script siguen siendo más fáciles de probar. Si el resultado es una hoja de cálculo o un mensaje de Slack, n8n es más corto.

En resumen

  • Dos nodos HTTP Request contra https://api.fastaf.co/v1 hacen ambos trabajos: /serp a 5 créditos, /scrape a 1 crédito.
  • Loop Over Items con batch size 1 gana a la paginación para listas de palabras clave; lee los resultados desde la salida done.
  • Retry On Fail (5 intentos, 3 s) absorbe los 429; el nodo Limit y el saldo de la cuenta acotan el gasto.
  • Verificado el 19 de octubre de 2026: 3 palabras clave, 30 filas, 8 páginas, 23 créditos, 10,9 s. Sin probar: el nodo de Google Sheets.

Consigue una clave gratis (500 créditos, sin tarjeta), importa el workflow y mira las filas en tu propia hoja. Los parámetros están en la documentación.