n8n web scraping e ricerche Google: workflow senza codice

Importa un workflow n8n per estrarre dati da un sito web: scorre le keyword, chiama una API di ricerca Google, converte le prime pagine in markdown e scrive le righe su Google Sheets o in un CSV.

Fare web scraping e ricerche Google con n8n richiede due nodi HTTP Request e nessun codice a parte l’elenco di keyword: il primo chiama https://api.fastaf.co/v1/serp per ogni keyword, il secondo (opzionale) chiama /v1/scrape sui primi risultati e restituisce markdown. Il 19 ottobre 2026 il workflow qui sotto ha trasformato 3 keyword in 30 righe di risultati ordinati in 10,9 secondi e, con lo scraping attivo, in 8 pagine di markdown, per 23 crediti in tutto (circa un centesimo alla tariffa del pacchetto Starter, $10 per 20.000 crediti).

Incolla il JSON di questo articolo in n8n, collega una credenziale, premi Execute. I nodi sono elencati nella tabella, il file completo viene subito dopo.

Cosa fa il workflow n8n per la SERP?

Nodo Tipo Compito
Keywords Code Restituisce un item per keyword (sostituiscilo con una lettura da Sheets o Airtable)
Limit Limit Tetto fisso di 20 keyword per esecuzione, quindi al massimo 100 crediti di ricerche
Loop over keywords Loop Over Items, batch size 1 Invia una keyword alla volta e raccoglie tutte le righe sull’uscita done
FastAF SERP HTTP Request GET /v1/serp?query=...&country=..., header Bearer, nuovo tentativo in caso di errore
Split results Split Out Trasforma organic_results (10 per ricerca) in un item ciascuno
Build rows Edit Fields Tiene keyword, posizione, titolo, link, snippet, data
Append to Google Sheet Google Sheets Disattivato finché non aggiungi le credenziali Google
Convert to CSV, Write CSV Convert to File, Read/Write Files L’alternativa se non hai credenziali Google
Top 3 only, FastAF scrape, Page + markdown Filter, HTTP Request, Edit Fields Opzionali, disattivati di default: markdown delle prime 3 pagine per keyword, YouTube escluso

Ho eseguito questo file in n8n 2.43.8 da riga di comando (n8n execute), quindi i nodi HTTP, loop, split, filter e CSV sono stati davvero eseguiti. Il nodo Google Sheets no: richiede credenziali OAuth di Google che non ho, per questo è consegnato disattivato. È la normale operazione append di n8n con mappatura automatica delle colonne.

Qual è il JSON completo del workflow?

In n8n crea un workflow e premi Ctrl/Cmd+V sulla canvas con questo testo negli appunti (oppure usa il 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"}
}

Poi crea una credenziale di tipo Header Auth, di nome FastAF API key, con nome dell’header Authorization e valore Bearer <la tua chiave> (una chiave arriva con i 500 crediti gratuiti). Apri i due nodi HTTP Request e seleziona quella credenziale. Per attivare il ramo di scraping, seleziona Top 3 only, FastAF scrape e Page + markdown e premi D.

Perché un loop sulle keyword invece della paginazione?

Il nodo HTTP Request ha un’opzione Pagination, ma è pensata per le API che restituiscono l’URL della pagina successiva o accettano un contatore di pagina (documentazione n8n). Un lavoro di controllo del ranking o di ricerca è diverso: hai un elenco di keyword e ognuna richiede una richiesta. Una ricerca restituisce i primi 10 risultati organici, che è quello che serve per verificare una posizione.

Il workflow usa quindi Loop Over Items (documentazione) con batch size 1. Fa due cose che altrimenti sbaglieresti. Tiene le richieste sequenziali, cosa che conta sul pacchetto Free, dove la concorrenza è 1. E ti permette di richiamare la keyword più avanti con $('Loop over keywords').item.json.keyword, così ogni riga porta con sé la keyword da cui nasce.

L’uscita done del loop scatta una sola volta, dopo l’ultima keyword, con tutte le righe di Build rows. Per questo Sheets, CSV e ramo di scraping sono tutti collegati a done: girano una volta su 30 item, non 3 volte su 10. Per risultati più profondi aggiungi un parametro di query page e un secondo loop; la pagina della Google SERP API elenca i parametri, e la versione in Python mostra lo stesso lavoro in codice.

Come gestisco gli errori 429 e limito la spesa?

Un 429 significa che hai raggiunto un limite di frequenza o di concorrenza e porta un header Retry-After (documentazione). In n8n apri il nodo HTTP Request, Settings, e attiva Retry On Fail. Il file imposta Max Tries a 5 e Wait Between Tries a 3000 ms. Il sorgente di n8n limita i tentativi a 2-5 e l’attesa a 0-5000 ms, quindi siamo vicini al massimo, e l’attesa è fissa: n8n non legge Retry-After.

L’ho verificato facendo rispondere 429 alle prime due richieste di un’esecuzione. n8n ha aspettato 3 secondi tra un tentativo e l’altro, il terzo è andato a buon fine e il nodo ha finito in 6,1 secondi. Le richieste fallite non vengono mai addebitate, quindi riprovare non costa nulla.

La spesa ha tre limiti, dal più stretto al più largo:

  1. Il nodo Limit: 20 keyword a 5 crediti sono 100 crediti di ricerche per esecuzione. Lo scraping delle prime 3 pagine ne aggiunge fino a 60, a 1 credito ciascuna.
  2. Il saldo crediti: quando è esaurito l’API restituisce 402 insufficient_credits. Il saldo appartiene all’account e tutte le chiavi attingono da lì, quindi è un tetto rigido per l’intero account.
  3. Per un 402, imposta On Error su “Continue (using error output)” (documentazione) così l’esecuzione termina in modo pulito invece di fallire a metà.

E se non ho credenziali Google?

Usa il ramo CSV. Convert to CSV costruisce il file dalle 30 righe e Write CSV lo salva. Un intoppo in cui mi sono imbattuto: n8n si rifiuta di scrivere fuori dalla sua cartella dei file e fallisce con “Access to the file is not allowed” (~/.n8n-files, che nell’immagine Docker è /home/node/.n8n-files; la restrizione è controllata da N8N_RESTRICT_FILE_ACCESS_TO, vedi la documentazione n8n). Il percorso nel file punta già lì. Il risultato del 19 ottobre 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

Per Google Sheets, inserisci l’ID del tuo foglio nel nodo, controlla che la riga 1 contenga i sei nomi di colonna, attiva il nodo ed elimina il ramo CSV se non ti serve.

Quali numeri ha prodotto un’esecuzione reale?

Esecuzione del 19 ottobre 2026, 3 keyword (n8n web scraping, google search api, serp api for ai agents), paese us, ramo di scraping attivo:

Misura Risultato
Stato dell’esecuzione success, 10,9 s da start a stop
Chiamate di ricerca 3, circa 3 s ciascuna (8,9 s nel nodo)
Risultati organici restituiti 10 per keyword, 30 righe
Pagine estratte 8 (prime 3 per keyword, YouTube escluso), 1,5 s per l’intero gruppo
Dimensione del markdown da 37 a 26.313 caratteri per pagina
Crediti 3 x 5 + 8 x 1 = 23

Una singola chiamata di conferma all’API di produzione ha restituito 200 in 4,4 secondi con X-FastAF-Credits-Used: 5. La latenza della ricerca live varia, quindi considera 3-4 secondi per keyword come numero di pianificazione: 100 keyword sono circa 5 minuti in un loop sequenziale.

Due pagine estratte, entrambe thread di Reddit, sono tornate come un’unica riga di 37 caratteri (un link “Skip to main content”). Le pagine pubbliche non sempre producono contenuto utile, quindi controlla la lunghezza di markdown prima di passarlo a un LLM. Le opzioni di rendering sono nell’articolo sul rendering JavaScript.

In cosa è diverso da uno script Python?

La logica è la stessa del monitoraggio del ranking delle keyword con Python; n8n aggiunge un editor visuale, uno scheduler (sostituisci Run manually con uno Schedule Trigger) e connettori già pronti. Se ti servono lo storico dei ranking e i confronti tra un controllo e l’altro, un database e uno script sono ancora più facili da testare. Se l’output è un foglio di calcolo o un messaggio Slack, n8n è più breve.

In breve

  • Due nodi HTTP Request verso https://api.fastaf.co/v1 fanno entrambi i lavori: /serp a 5 crediti, /scrape a 1 credito.
  • Loop Over Items con batch size 1 batte la paginazione per gli elenchi di keyword; leggi i risultati dall’uscita done.
  • Retry On Fail (5 tentativi, 3 s) assorbe i 429; il nodo Limit e il saldo dell’account limitano la spesa.
  • Verificato il 19 ottobre 2026: 3 keyword, 30 righe, 8 pagine, 23 crediti, 10,9 s. Non testato: il nodo Google Sheets.

Prendi una chiave gratuita (500 crediti, senza carta), importa il workflow e guarda le righe comparire nel tuo foglio. I parametri sono nella documentazione.