Chi fa marketing ha bisogno di dati freschi: titoli di articoli, prezzi, URL di schede prodotto, immagini, meta‑descrizioni. La buona notizia? Con n8n puoi automatizzare lo scraping pagina web n8n senza codice complesso, sfruttando il nodo HTML per “leggere” il DOM con selettori CSS e trasformare le pagine in dataset pronti per fogli di calcolo o CRM. In questo articolo impari a costruire un workflow minimal ma robusto: HTTP Request per scaricare l’HTML, HTML per il parsing DOM in automazione, funzioni snelle per validazione e pulizia testo, deduplica basica e salvataggio in Google Sheets/Notion. Ti mostrerò come gestire user‑agent e header, cosa fare con pagine multiple (paginazione siti web), come introdurre rate limiting e retry, e quando considerare un browser headless alternativa. Se vuoi un sistema affidabile per estrarre attributi href e src, programmare il workflow con Cron e inviare un report via email o archiviarlo in un Data Store n8n per salvataggio esterno (es. Sheets/Notion), sei nel posto giusto. Alla fine avrai una ricetta pronta da personalizzare per i tuoi casi d’uso, da “monitoraggio contenuti competitor” a “raccolta URL per campagne”.
Perché il nodo HTML di n8n è perfetto per marketer e content ops
Il nodo HTML è la via più semplice per passare da pagina a dati strutturati con selettori CSS per estrazione dati: niente librerie da installare, niente server aggiuntivi, tutto dentro n8n. Per attività quotidiane di content e market intelligence, lo scraping pagina web n8n con HTML copre il 70‑80% dei casi: landing, blog, liste di link, schede prodotto statiche. Soprattutto, si integra nativamente con nodi come HTTP Request (per la richiesta HTTP n8n), Set/Function per normalizzare, IF per ramificare, e connettori per esportazione verso Google Sheets/Notion. Con un paio di accorgimenti su gestione user‑agent e header, puoi ridurre i blocchi lato server e bilanciare il carico con rate limiting e retry. Inoltre, grazie al Cron puoi impostare una programmazione workflow con cadenza giornaliera o oraria, trasformando il tuo scraping in una routine affidabile.
Un vantaggio spesso sottovalutato: con l’HTML node definisci in modo esplicito cosa estrarre (testo o attributi come href e src), rendendo il parsing DOM in automazione più stabile e facile da mantenere rispetto a regex o soluzioni ad hoc. E se hai bisogno di consolidare e “ripulire” i dati prima di spedirli a un foglio, una breve funzione JavaScript in un Code node basta per validazione e pulizia testo (trim, spazi, tag HTML residui).
Pagine statiche vs contenuti generati via JavaScript (quando serve un browser headless)
- Pagine statiche: il contenuto è nel sorgente HTML. Qui l’accoppiata HTTP Request + HTML è perfetta.
- Contenuti generati via JS (SPA, infinite scroll): se l’HTML iniziale è “vuoto” e i dati arrivano da chiamate XHR, prova a replicare la chiamata API con HTTP Request. Se il contenuto è davvero “solo runtime” (es. rendering client‑side), valuta un browser headless alternativa per eseguire JavaScript e ottenere il DOM finale.
[IMG: Diagramma decisionale statico vs JS e scelta del nodo/strumento]
Preparare il workflow: HTTP Request + HTML
Il pattern base è: scarica → estrai → pulisci → salva. Per scaricare la pagina usa HTTP Request. Puoi configurare:
- Method: GET
- URL: pagina da estrarre (con variabili o lista)
- Headers: imposta un User‑Agent realistico e accetta gzip/deflate
- Options:
- Include Response Headers and Status: ON (per leggere $response.statusCode)
- Never Error: ON (così puoi gestire manualmente errori/redirect)
- Response Format: Text (HTML grezzo)
Esempio di configurazione UI (sintesi):
- Request Method: GET
- URL: https://esempio.com/lista
- Header Parameters:
- User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) …
- Accept: text/html,application/xhtml+xml
- Options:
- Include Response Headers and Status: true
- Never Error: true
- Response Format: String/Text
Questa impostazione ti consente di leggere $response.statusCode nell’output del nodo (quando “Include Response Headers and Status” è attivo) e decidere come proseguire con un IF in caso di 403/404/5xx.
[IMG: Screenshot configurazione HTTP Request con header e opzioni]
HTTP Request: user‑agent, header e gestione degli status code
- User‑Agent e header: molti siti servono contenuti diversi o bloccano client “vuoti”. Imposta un user‑agent credibile e, se serve, Accept‑Language, Referer e Cache‑Control. Questo migliora il successo dello scraping pagina web n8n.
- Status code:
- Con “Include Response Headers and Status” ottieni $response.statusCode e $response.headers per ramificare.
- “Never Error” evita che il workflow si fermi su 4xx/5xx: usa un IF per gestire retry o skip in modo controllato.
- Proxy per scraping leggero: quando necessario, valuta proxy moderati e rotazione user‑agent per ridurre blocchi (rispetta sempre i ToS e robots.txt del sito target).
[IMG: Esempio IF che controlla $response.statusCode e instrada retry/skip]
Configurazione del nodo HTML per l’estrazione
Dopo il download, collega un nodo HTML. Impostazione tipica (da documentazione n8n):
- Operation: Extract HTML Content
- Source Data: JSON
- JSON Property: data (contiene l’HTML di risposta dall’HTTP Request)
- Extraction Values:
- Key: title
- CSS Selector: .post .item-title a
- Return Value: HTML (o Text, a seconda delle necessità)
Puoi aggiungere più Extraction Values, ognuno con:
- Key: il nome del campo in output (es. price, link, image)
- CSS Selector: selettore CSS (es. a[href], img[src], h1)
- Return Value: Text, HTML, o Attribute
- Attribute (se Return Value = Attribute): es. href o src
Esempio pratico:
- Key: link
- CSS Selector: .post .item-title a
- Return Value: Attribute
- Attribute: href
- Key: image
- CSS Selector: .post-cover img
- Return Value: Attribute
- Attribute: src
[IMG: Screenshot configurazione “Extraction Values” con title/link/image]
Configurazione del nodo HTML: selettori CSS, testo vs attributi, output a lista
- Selettori CSS per estrazione dati: usa classi e combinatori precisi per ridurre “rumore” (es. article.post h2 a).
- Testo vs attributi:
- Text per leggere il contenuto visibile (innerText).
- HTML quando vuoi conservare markup (es. contenuti formattati).
- Attribute per href, src, content (meta), alt, ecc.
- Output a lista: quando un selettore ritorna più elementi, il nodo HTML può generare array. In tal caso, gestisci l’array con nodi come Item Lists o loop per trattare ogni elemento singolarmente.
Selettori tipici (h1, meta, article, a[href], img[src]) e normalizzazione del testo
- h1: titolo pagina
- meta[name=”description”] (Attribute: content): meta description
- article .price: prezzi
- a[href]: link a schede interne
- img[src]: immagini di copertina
- Normalizzazione: usa un Code node per trim e sostituzione spazi multipli. Esempio:
Codice (Code node — Run Once for All Items):
for (const item of items) {
const raw = item.json.text ?? ”;
const cleaned = raw.trim().replace(/\s+/g, ‘ ‘);
item.json.text = cleaned;
}
return items;
[IMG: Esempio prima/dopo della pulizia testo]
Gestire liste, pagine multiple e deduplica
Quando estrai liste (es. post, prodotti), spesso devi:
1) spacchettare array di elementi,
2) scorrere più pagine (paginazione siti web),
3) deduplicare i record.
Per scorrere items in blocchi e simulare “ritmo controllato” usa Split In Batches:
Configurazione JSON (Split In Batches):
{
“name”: “Batch Loop”,
“type”: “n8n-nodes-base.splitInBatches”,
“typeVersion”: 1,
“parameters”: {
“batchSize”: 10
}
}
- Collega l’uscita “Execute Next Batch” per processare i blocchi successivi.
- Usa batchSize piccoli per introdurre rate limiting e retry ragionati.
Per la paginazione:
- Genera l’elenco URL (es. /page/1 … /page/N) con un Set o Code node.
- Fai passare gli URL nel loop di Split In Batches.
- Per ogni URL: HTTP Request → HTML → estrazione.
Deduplica di record nello scraping:
- Crea un identificatore univoco (es. slug o URL prodotto) con Set node (keepOnlySet: false per non perdere campi).
- Se hai una “base” di record esistenti, porta in parallelo il flusso “esistenti” e usa Merge con “Merge By Key” (propertyName: id/slug). Gli elementi con chiave già presente verranno allineati, permettendoti di filtrare i duplicati (via IF) prima di esportare.
- In alternativa, conserva un elenco di ID visti e filtra nuovi item con IF “contains” prima dell’append.
[IMG: Schema con generazione URL, loop a blocchi, merge dedup e append finale]
Retry, rate limit, rotazione user‑agent/proxy moderati
- Retry: con “Never Error” attivo su HTTP Request, controlla $response.statusCode in un IF:
- Se 429/5xx: instrada a una piccola attesa (Wait) e ripeti la richiesta; in assenza del nodo Wait, puoi aggiungere un ritardo applicativo tra i batch.
- Rate limit: usa batchSize ridotti e inserisci pause tra i batch o tra richieste (con un sottoworkflow).
- Rotazione user‑agent/proxy per scraping leggero: alterna header User‑Agent su un set di stringhe credibili; usa proxy in modo moderato e conforme ai ToS. Mantieni frequenza di polling ragionevole.
Validazione, pulizia e salvataggio dei dati
Prima del salvataggio:
- Validazione e pulizia testo: oltre al trim, rimuovi caratteri non stampabili, sostituisci HTML entities, normalizza spazi.
- Set node per mappare i campi necessari (keepOnlySet: true se vuoi un output minimale e coerente).
Esempio Set node (concettuale):
- Fields to Set:
- title: {{$json.title}}
- url: {{$json.link}}
- image: {{$json.image}}
- price: {{$json.price}}
- keepOnlySet: true
Esportazione verso Google Sheets:
- Node: Google Sheets
- Operation: Append
- spreadsheetId: ID del tuo documento
- sheetName: Sheet1
- dataMode: autoMap (mappa per header corrispondenti)
- valueInputMode: USER_ENTERED
Esempio JSON (Append to Sheet):
{
“name”: “Append To Sheet”,
“type”: “n8n-nodes-base.googleSheets”,
“typeVersion”: 4,
“parameters”: {
“operation”: “append”,
“spreadsheetId”: “1A2b3C4D5E6FgHiJkLMnoPQrstu”,
“sheetName”: “Sheet1”,
“dataMode”: “autoMap”,
“options”: {
“valueInputMode”: “USER_ENTERED”
}
},
“credentials”: {
“googleSheetsOAuth2Api”: {
“name”: “Google Sheets OAuth2”
}
}
}
Esportazione verso Notion:
- Operation: Create (Page in Database)
- databaseId: ID del database Notion
- Mappa proprietà (Name come title, Status come select, ecc.) in base alla struttura del tuo database.
[IMG: Schermata di mappatura campi verso Google Sheets e Notion]
Scheduling con Cron e invio/salvataggio risultati (Email, Google Sheets, DB)
Automatizza con il Cron:
- Esempio schedulazione giornaliera due volte al giorno (09:00 e 17:00).
- Il Cron avvia il workflow senza input, poi scorre tutti gli URL, estrae e salva.
Esempio (concettuale):
- Node: Cron (Schedule Trigger)
- Times:
- 09:00
- 17:00
Puoi poi inviare un riepilogo via Email, aggiornare Google Sheets, o scrivere su DB. Il vantaggio: lo scraping pagina web n8n diventa un rituale affidabile, con log e storicizzazione centralizzati.
[IMG: Screenshot Cron con due orari configurati]
Esempio completo: da URL a Google Sheets/Notion in 10 minuti
Obiettivo: estrarre titolo, link e immagine dai post di un blog e appendere i risultati a Google Sheets.
Passi:
1) Cron (opzionale): esecuzione 2 volte al giorno.
2) Set (lista URL): genera un array di URL paginati (es. /page/1…/page/5).
3) Split In Batches: batchSize=10 per gestire ritmo e retry.
4) HTTP Request:
- Method: GET
- Include Response Headers and Status: ON
- Never Error: ON
- Headers: User‑Agent, Accept
5) IF (status code): - true se $response.statusCode in [200]
- false se 429/5xx → sub‑loop di retry (attesa breve e ripeti HTTP Request)
6) HTML: - Operation: Extract HTML Content
- Source Data: JSON
- JSON Property: data
- Extraction Values:
- title: .post .item-title a → Return: Text
- link: .post .item-title a → Return: Attribute (href)
- image: .post-cover img → Return: Attribute (src)
7) Code (pulizia testo): normalizza whitespace, rimuovi tag errati residui.
8) Set (mappa campi): title, url, image (keepOnlySet: true).
9) Merge (Merge By Key, opzionale per dedup): propertyName=url con stream “già in sheet” (se lo recuperi) per filtrare i duplicati via IF.
10) Google Sheets (Append): autoMap su Sheet1.
[IMG: Panoramica del workflow con nodi collegati]
[IMG: Esecuzione riuscita con anteprima dati puliti]
Insight pratico: se il sito cambia markup, isola i selettori nel nodo HTML in un’unica “sezione” del workflow. Quando si rompe qualcosa, modifichi solo lì e tutto riprende a funzionare.
Quick Takeaways
- HTTP Request + HTML è il percorso più rapido per scraping pagina web n8n su pagine statiche.
- Imposta User‑Agent e “Include Response Headers and Status” per controllo fine su errori e retry.
- Nel nodo HTML usa Return Value adeguato: Text, HTML o Attribute (href, src).
- Split In Batches = gestione carico, rate limiting e retry semplici.
- Deduplica leggera con Merge By Key + IF su chiave univoca (es. URL).
- Pulisci e normalizza con un breve Code node.
- Cron trasforma lo scraping in routine scalabile e tracciabile; esporta verso Google Sheets/Notion.
Conclusione
Portare dati web nel tuo stack marketing non richiede più script su misura o strumenti fragili. Con n8n costruisci pipeline affidabili: HTTP Request per scaricare, HTML per estrarre con selettori CSS per estrazione dati, un pizzico di Set/Code per validazione e pulizia testo, Merge/IF per deduplica, e un connettore come Google Sheets o Notion per distribuire i risultati dove servono. Se gestisci paginazione siti web, usa Split In Batches per ritmo e robustezza; per resilienza, verifica $response.statusCode e applica retry mirati. E quando le pagine diventano “dinamiche” lato client, valuta la chiamata API sottostante o un browser headless alternativa. Il bello di n8n: ogni blocco è riutilizzabile e monitorabile, così lo scraping pagina web n8n diventa un acceleratore di produttività per marketer. Inizia con un caso semplice (es. ultime 50 schede da un blog), monitora i risultati, poi estendi a più sorgenti. Imposta un Cron giornaliero e trasforma lo scraping in un asset continuo che alimenta analisi, editorial plan e campagne.
Pronto a fare il passo successivo? Clona il pattern proposto, adatta i selettori e pubblica i dati su Google Sheets o Notion. In poche iterazioni avrai un flusso pulito, documentato e facile da far crescere insieme alla tua strategia.
FAQ
1) Posso usare n8n nodo HTML per estrarre attributi come href e src?
- Sì. Nella definizione di Extraction Values imposta Return Value su “Attribute” e specifica l’attributo (es. href, src). È ideale per link e immagini.
2) Come gestisco rate limiting e retry con la richiesta HTTP n8n?
- Abilita “Include Response Headers and Status” e “Never Error”. Usa un IF sullo $response.statusCode per distinguere 200 da 429/5xx, inserisci una breve attesa tra i batch (Split In Batches) e ripeti la richiesta. Per scraping pagina web n8n più intenso, bilancia batchSize e ritardi.
3) Devo sempre usare un browser headless alternativa?
- No. Per pagine statiche, HTML node basta. Valuta headless solo se il contenuto è generato via JavaScript e non c’è API replicabile con HTTP Request.
4) Come faccio la deduplica di record nello scraping?
- Crea una chiave unica (es. URL) con Set. Se hai uno stream di dati “esistenti”, usa Merge (Merge By Key) per allineare e IF per scartare i doppioni. In alternativa, mantieni un elenco di ID visti e filtra prima di Append in Sheets/Notion.
5) Posso automatizzare e salvare su Google Sheets/Notion?
- Sì. Con programmazione workflow con Cron scheduli lo scraping. Poi appendi su Google Sheets (autoMap) o crei pagine in Notion mappando le proprietà necessarie. Aggiungi una fase di validazione e pulizia testo per dati più affidabili.
Ti è stato utile?
Hai già creato un workflow di scraping pagina web n8n per il tuo team marketing? Raccontaci quale dato estrai più spesso e dove lo invii (Google Sheets, Notion o altro). Se questa guida ti è piaciuta, condividila con un collega che vuole automatizzare la raccolta dati!
Scopri la consulenza →

