Du öppnar en webbplatsgranskning och drunknar direkt i flikar. Startsida, tjänster, bloggsidor, slumpmässiga landningssidor, sedan en flik till för rubriker, en till för länkar, en till för anteckningar som du intalar dig att du ska strukturera senare.
Det är här site crawl automation hjälper. SEO-analytiker känner oftast smärtan först, men content leads och kundansvariga på byrå hamnar i samma loop: hitta sida, kopiera rubriker, räkna länkar, sammanfatta, upprepa.
Det här arbetsflödet crawlar en webbplats, sparar det nyttiga i Google Sheets och låter dig sedan ställa frågor som i en chattbot med hjälp av den sparade datan. Du får se vad det gör, vad du behöver och var team vanligtvis sparar ett par timmar per granskning.
Så fungerar den här automatiseringen
Se hur detta löser problemet:
n8n Workflow Template: Google Sheets + OpenAI: crawla sajter, auditera snabbare
flowchart LR
subgraph sg0["Chat web Flow"]
direction LR
n0@{ icon: "mdi:robot", form: "rounded", label: "AI Agent", pos: "b", h: 48 }
n1@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n2@{ icon: "mdi:memory", form: "rounded", label: "Simple Memory", pos: "b", h: 48 }
n3@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet in Googl..", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Maping Sitemap"]
n6@{ icon: "mdi:cog", form: "rounded", label: "XML1", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>UA Rotativo1"]
n8@{ icon: "mdi:location-exit", form: "rounded", label: "Req Error", pos: "b", h: 48 }
n9@{ icon: "mdi:location-exit", form: "rounded", label: "Sitemap Error", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Req robots"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>extract sitemap url"]
n12@{ icon: "mdi:swap-vertical", form: "rounded", label: "OPTIONS", pos: "b", h: 48 }
n13@{ icon: "mdi:robot", form: "rounded", label: "AI Agent1", pos: "b", h: 48 }
n14@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model1", pos: "b", h: 48 }
n15@{ icon: "mdi:play-circle", form: "rounded", label: "Chat web", pos: "b", h: 48 }
n16@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n17@{ icon: "mdi:swap-horizontal", form: "rounded", label: "If1", pos: "b", h: 48 }
n18@{ icon: "mdi:robot", form: "rounded", label: "Respond to Chat", pos: "b", h: 48 }
n19@{ icon: "mdi:robot", form: "rounded", label: "Respond to Chat1", pos: "b", h: 48 }
n20@{ icon: "mdi:robot", form: "rounded", label: "Message a model", pos: "b", h: 48 }
n21@{ icon: "mdi:cog", form: "rounded", label: "XML", pos: "b", h: 48 }
n22@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n23@{ icon: "mdi:robot", form: "rounded", label: "Message a model1", pos: "b", h: 48 }
n24@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet in Googl..", pos: "b", h: 48 }
n25@{ icon: "mdi:database", form: "rounded", label: "Complete", pos: "b", h: 48 }
n26@{ icon: "mdi:web", form: "rounded", label: "HTTP Request2", pos: "b", h: 48 }
n27["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Merge"]
n28@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split URLs", pos: "b", h: 48 }
n29["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Req URL"]
n30["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/markdown.dark.svg' width='40' height='40' /></div><br/>HTML to Markdown"]
n31["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Maping Sitemaps"]
n32@{ icon: "mdi:database", form: "rounded", label: "Get data schema", pos: "b", h: 48 }
n4 --> n0
n4 --> n13
n17 --> n12
n17 --> n18
n21 --> n27
n6 --> n20
n27 --> n28
n12 --> n7
n29 --> n30
n0 --> n19
n15 --> n32
n13 --> n17
n10 --> n11
n10 --> n8
n28 --> n22
n7 --> n10
n26 -.-> n0
n2 -.-> n0
n5 --> n6
n5 --> n9
n32 --> n4
n22 --> n25
n22 --> n29
n31 --> n21
n20 --> n31
n30 --> n23
n23 --> n22
n1 -.-> n0
n14 -.-> n13
n11 --> n5
n16 -.-> n13
n24 -.-> n23
n3 -.-> n0
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n15 trigger
class n0,n13,n16,n18,n19,n20,n23 ai
class n1,n14 aiModel
class n2 ai
class n4,n17 decision
class n3,n24,n25,n32 database
class n5,n10,n26,n29,n31 api
class n7,n11,n27 code
classDef customIcon fill:none,stroke:none
class n5,n7,n10,n11,n27,n29,n30,n31 customIcon
Utmaningen: webbplatsgranskningar blir flikkaos
En “snabb” webbplatsgranskning förblir sällan snabb. Du börjar med en fråga (“vad finns på tjänstesidorna?”), och plötsligt granskar du rubriker manuellt, följer navigationsvägar och plockar länkar till ett dokument som ingen någonsin återanvänder. Den mentala belastningen är också lurig. Du växlar hela tiden kontext, vilket gör att du missar uppenbara problem som dubbla H1:or, tunna sidor som gömmer sig i en sitemap eller föråldrade CTA:er. Och om du gör detta för flera kundwebbplatser blir det samma repetitiva slit varje vecka.
Det drar snabbt iväg. Här är var det fallerar i verkligheten.
- Du slutar med att kopiera rubriker och länkar för hand, och i samma sekund som du klistrar in dem i ett dokument blir de inaktuella.
- Sitemaps är inkonsekventa mellan webbplatser, så du slösar tid på att leta efter “rätt” URL:er att granska.
- Granskningar fastnar vid “observationer” eftersom det tar evigheter att sammanfatta varje viktig sida.
- När någon ställer en följdfråga en vecka senare måste du göra om crawlen eftersom dina anteckningar inte är strukturerade.
Lösningen: crawla en gång, lagra i Sheets och ställ sedan frågor
Det här arbetsflödet börjar som en webb-konsultationschattbot, men den stora vinsten är vad den kommer ihåg. Första gången du ger den en webbplats-URL validerar den URL:en med AI, hittar sitemap via robots.txt och väljer den mest relevanta sitemap:en (sidor, inlägg, kategorier, taggar) baserat på dina skanningsalternativ. Sedan crawlar den de valda URL:erna i batcher, laddar ner varje sidas HTML, konverterar till Markdown och använder OpenAI för att extrahera språk, rubrikhierarki, interna länkar, externa länkar och en korrekt formaterad sammanfattning. Varje sida blir en strukturerad rad i Google Sheets, så att du kan filtrera, sortera och återanvända den senare. När indexeringen är klar markeras arket som redo, vilket växlar arbetsflödet till “agentläge” för framtida frågor.
Efter den första crawlen gör du inte om hela granskningen från noll. Du ställer frågor i chatten, och AI-agenten läser din Google Sheets-“minnesbank” för att svara snabbt. Om något behöver färsk information kan den också göra HTTP-förfrågningar i realtid så att du inte behöver lita på gamla ögonblicksbilder.
Vad som förändras: före vs. efter
| Det här tar bort | Effekt du kommer att se |
|---|---|
|
|
Verklig effekt
Säg att du granskar en marknadsföringswebbplats med 50 sidor. Manuellt kan du lägga cirka 5 minuter per sida på att öppna den, notera H1/H2:or, skumma för att förstå innehållet och plocka ut ett par nyckellänkar, vilket blir ungefär 4 timmar ren sysselsättning. Med det här arbetsflödet skickar du in URL:en en gång, låter det crawla i bakgrunden och får ett Google-ark med rubriker, länkar och sammanfattningar för varje sida. Därifrån tar “visa mig alla H1:or på tjänstesidor” minuter, inte ännu en eftermiddag.
Krav
- n8n-instans (testa n8n Cloud gratis)
- Alternativ för self-hosting om du föredrar det (Hostinger fungerar bra)
- Google Sheets för att lagra crawlresultat och “minne”.
- OpenAI för att extrahera rubriker, länkar och sammanfattningar.
- OpenAI API-nyckel (hämta den i din OpenAI-instrumentpanel).
Kunskapsnivå: Medel. Du kopplar konton, klistrar in API-nycklar och justerar skanningsalternativ, men du behöver inte skriva riktig kod om du inte vill.
Behöver du hjälp att implementera detta? Prata med en automatiseringsexpert (gratis 15-minuters konsultation).
Så går arbetsflödet till
Ett chattmeddelande triggar arbetsflödet. Du anger en webbplats-URL i chattgränssnittet och arbetsflödet kontrollerar först Google Sheets för att se om webbplatsen redan har indexerats.
Det validerar URL:en och hittar sitemap:en. Om webbplatsen är ny bekräftar en AI-validerare att URL:en går att använda, sedan hämtar en HTTP-förfrågan robots.txt för att hitta sitemap-URL:er. Ett annat AI-steg väljer den mest relevanta sitemap:en baserat på dina skanningsalternativ (till exempel sidor vs. inlägg).
Crawlern behandlar sidor i batcher. Varje URL hämtas med en HTTP-förfrågan med roterande user-agent, HTML konverteras till Markdown och OpenAI analyserar innehållet för att extrahera språk, rubrikstruktur, interna länkar, externa länkar och en sammanfattning. Resultaten läggs till i Google Sheets rad för rad.
Sedan växlar den till “agentläge” för frågor. När arket har markerats som indexerat läser agenten (i LangChain-stil) dina sparade rader för att svara på frågor som “vad finns på kontaktsidan?” Den kan också göra live-HTTP-kontroller när du behöver uppdaterad information.
Du kan enkelt ändra vilka URL-typer som skannas (sidor, inlägg, kategorier) så att det matchar ditt sätt att granska. Se hela implementationsguiden nedan för anpassningsalternativ.
Steg-för-steg-guide för implementation
Steg 1: Konfigurera Web Chat Trigger
Sätt upp den inkommande chatt-endpointen som startar arbetsflödet och skickar användarens input vidare till AI-valideringen och konversationsflödena.
- Lägg till och öppna Web Chat Trigger.
- Ställ in Public på
trueoch Authentication påbasicAuth. - Credential Required: Anslut era httpBasicAuth-credentials.
- Bekräfta att Web Chat Trigger går vidare till Retrieve Data Schema som första steg i flödet.
Steg 2: Koppla Google Sheets
Dessa noder läser och skriver till webbplatsens innehållsdatabas som används av assistenten och av sammanfattningsprocessen.
- Öppna Retrieve Data Schema och välj kalkylarket i Document ID och Sheet Name (t.ex.
gid=0). - I Retrieve Data Schema säkerställer ni att filtret använder Lookup Column
Data schemamed Lookup Value={{ true }}. - Credential Required: Anslut era googleSheetsOAuth2Api-credentials i Retrieve Data Schema.
- Öppna Schema Flag Update, ställ in Operation på
appendOrUpdate, och mappa Data schema till={{true}}. - Credential Required: Anslut era googleSheetsOAuth2Api-credentials i Schema Flag Update.
- Öppna Append Sheet Row, behåll Operation som
append, och bekräfta att kolumnmappningarna använder AI-uttrycken som={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Summary_Content', ``, 'string') }}. - Credential Required: Anslut era googleSheetsOAuth2Api-credentials i Append Sheet Row.
Steg 3: Sätt upp URL-validering och schemakontroller
Den här delen validerar användarens URL:er, kontrollerar om schemat redan finns och routar vidare antingen till chattsvaret eller till flödet för sitemap-skanning.
- Öppna Schema Check och bekräfta att villkoret använder
={{ $json['Data schema'] }}med en boolean-kontroll för true. - Öppna URL Validator Agent och ställ in Text på
={{ $node["Web Chat Trigger"].json["chatInput"] }}. - Koppla Structured Parser till URL Validator Agent som output-parser och behåll JSON-schemaexemplet:
{ "URL": "example.com", "URL_bool": true }
- Koppla OpenAI Validator Model som språkmodell för URL Validator Agent.
- Credential Required: Anslut era openAiApi-credentials i OpenAI Validator Model (credentials sätts på modellnoden, inte på agenten).
- Öppna URL Valid Check och bekräfta att villkoret använder
={{ $json.output.URL_bool }}med en boolean-kontroll för true. - För ogiltiga URL:er säkerställer ni att Invalid URL Reply skickar meddelandet
Debes introducir una URL válida ejemplo: https://google.es.
URL_bool, kommer URL Valid Check inte att släppa igenom. Behåll structured parser-schemat intakt.Steg 4: Konfigurera Conversational Agent och minne
Den här agenten besvarar chattförfrågningar med webbplatsdata i Google Sheets och en språkmodell, med minne aktiverat för kontext.
- Öppna Conversational Agent och ställ in Text på
={{ $node["Web Chat Trigger"].json["chatInput"] }}. - Koppla OpenAI Chat Engine som språkmodell för Conversational Agent.
- Credential Required: Anslut era openAiApi-credentials i OpenAI Chat Engine.
- Koppla Lightweight Memory till Conversational Agent och behåll Context Window Length på
50. - Koppla Fetch Sheet Rows som ett AI-verktyg till Conversational Agent så att den kan hämta webbplatsinnehåll från arket.
- Credential Required: Anslut era googleSheetsOAuth2Api-credentials i Fetch Sheet Rows (verktyg använder sina egna credentials, men anropas av agenten).
- Bekräfta att Conversational Agent routar till Agent Response och att Agent Response använder
={{ $json.output }}som meddelande.
Steg 5: Konfigurera upptäckt och val av sitemap
Dessa noder bygger en giltig sitemap-URL från robots.txt, hämtar sitemap:en och väljer rätt sitemap-sektion med AI.
- Öppna Scan Options och behåll boolean-flaggorna enligt konfigurationen: scan_pages
true, scan_postsfalse, categoryfalse, tagsfalse. - I Random UA Picker behåller ni den JavaScript-kod som returnerar en slumpmässig
userAgent-sträng. - Öppna Robots.txt Request och ställ in URL på
={{ $node["URL Validator Agent"].json["output"]["URL"] }}/robots.txt. - Bekräfta att Parse Sitemap URL parsar robots.txt-innehållet och returnerar
sitemapUrlenligt koden. - Öppna Sitemap Fetch och ställ in URL på
={{ $json.sitemapUrl }}med headers som inkluderar User-Agent={{ $json.userAgent }}. - Öppna XML Decode A för att parsa sitemap-XML och skicka vidare till Sitemap Selector.
- Öppna Sitemap Selector, behåll JSON Output aktiverat och verifiera att den refererar till scan options och sitemap-indexets loc:er med uttryck som
{{ $json.sitemapindex.sitemap[0].loc }}. - Credential Required: Anslut era openAiApi-credentials i Sitemap Selector.
- Öppna Page Sitemap Fetch och ställ in URL på
={{ $json.message.content.sitemap_page }}, och routa sedan till XML Decode B.
null kommer Sitemap Fetch att misslyckas och trigga Sitemap Failure Halt. Säkerställ att robots.txt innehåller en giltig Sitemap:-rad.Steg 6: Konfigurera URL-splitting, sidförfrågningar och sammanfattning
Det här steget expanderar den valda sitemap:en till individuella URL:er, hämtar varje sida, konverterar HTML till Markdown och sammanfattar innehållet med AI.
- Öppna Combine URL Map och behåll den JavaScript-kod som transformerar
urlset.urltill etturls-objekt. - Öppna Split URL Items och ställ in Field To Split Out på
urls. - Öppna Batch Iterator för att styra batchbearbetning av URL:er innan sidor begärs.
- Öppna Page Request och ställ in URL på
={{ $('Split URL Items').item.json.urls }}med User-Agent-headern={{ $json.userAgent }}. - Öppna HTML Convert to MD och ställ in HTML på
={{ $json.data }}. - Öppna Page Summary Model och säkerställ att meddelandet inkluderar
=URL: {{ $('Split URL Items').item.json.urls }} {{ $json.data }}i prompten. - Credential Required: Anslut era openAiApi-credentials i Page Summary Model.
- Bekräfta att Page Summary Model använder Append Sheet Row som ett AI-verktyg för att skriva resultaten till arket.
Steg 7: Lägg till felhantering
Arbetsflödet innehåller explicita stopp för ogiltiga URL:er och sitemap-fel.
- Verifiera att Request Error Halt är kopplad från felutgången på Robots.txt Request och använder meddelandet
URL mal introducida, debes introducir con el siguiente formato: ejemplo.com. - Verifiera att Sitemap Failure Halt är kopplad från felutgången på Sitemap Fetch och använder meddelandet
Sitemap no encontrado o acceso bloqueadp.
Steg 8: Testa och aktivera ert arbetsflöde
Kör ett kontrollerat test för att validera hela flödet från chattrespons till sitemap-sammanfattning.
- Klicka på Execute Workflow och skicka ett chattmeddelande via Web Chat Trigger med en URL som
https://example.com. - Bekräfta att en giltig URL routas via URL Valid Check till Scan Options, Robots.txt Request och Sitemap Fetch.
- Verifiera att Page Summary Model körs och att Append Sheet Row lägger till en rad med
Lang,Page URLochSummary Content. - Kontrollera att Agent Response returnerar ett chattsvar när Schema Check är true och att Invalid URL Reply triggas för ogiltiga URL:er.
- När allt är validerat, växla arbetsflödet till Active för användning i produktion.
Saker att se upp med
- Google Sheets-inloggningar kan löpa ut eller kräva specifika behörigheter. Om det skapar fel, kontrollera först kopplingen för inloggningsuppgifter i n8n och delningsinställningarna för arket.
- Om du använder Wait-noder eller extern rendering varierar processtiderna. Öka väntetiden om nedströmsnoder fallerar på tomma svar.
- Standardprompter i AI-noder är generiska. Lägg in er tonalitet tidigt, annars kommer du att redigera output för alltid.
Vanliga frågor
Cirka 30 minuter om dina konton och API-nycklar är klara.
Ja, men någon behöver vara bekväm med att koppla Google Sheets och lägga till en OpenAI API-nyckel. Resten handlar mest om att välja skanningsalternativ och testa med en liten webbplats först.
Ja. n8n har ett gratis self-hosted-alternativ och en gratis provperiod på n8n Cloud. Cloud-planer börjar på 20 USD/månad för högre volym. Du behöver också räkna med OpenAI API-kostnader, som kan dra iväg vid stora crawls.
Två alternativ: n8n Cloud (hanterat, enklast att komma igång) eller self-hosting på en VPS. För self-hosting är Hostinger VPS prisvärd och klarar n8n bra. Self-hosting ger dig obegränsade körningar men kräver grundläggande serverhantering.
Du kan ändra vad som crawlas genom att justera Scan Options-inställningen och beteendet för val av sitemap, så att du bara processar sidor, inlägg eller andra URL-typer. Många team anpassar också AI-extraktionsprompten som används under sidanalysen för att fånga saker som metatitlar, CTA:er eller schema-snuttar. Om du vill ha färskare svar senare, låt agentens live-HTTP-verktyg vara aktiverat så att den kan kontrollera om kritiska sidor vid begäran.
Oftast beror det på en utgången token eller att behörigheterna för arket har ändrats. Anslut Google Sheets-inloggningen på nytt i n8n, bekräfta att rätt Google-konto används och säkerställ att målarket är tillgängligt för det kontot. Om det bara fallerar vid “append row”, kontrollera att dina rubrikkolumner fortfarande matchar det arbetsflödet försöker skriva.
Det beror på din n8n-plan och din server. På self-hosted n8n finns inget tak för antal körningar, men crawlstorleken begränsas av körtid, rate limits och OpenAI-tokenkostnader, särskilt under den första indexeringen.
För crawling och analys är n8n vanligtvis det praktiska valet eftersom du behöver batchning, villkorslogik och ett upplägg där du “sparar i Sheets och frågar senare”. Zapier och Make kan lösa delar av detta, men långkörande crawls och flerstegsprocessning blir snabbt klumpigt, och kostnaderna kan öka när du itererar över många URL:er. n8n ger dig också self-hosting, vilket spelar roll när du kör många exekveringar. Ärligt talat handlar det om komplexitet: enkel synk mellan två appar, Zapier fungerar. För det här arbetsflödets crawl + AI-extraktion + agentläge passar n8n bättre. Om du vill ha en second opinion, prata med en automatiseringsexpert.
När en webbplats är indexerad tystnar den irriterande delen av granskningen. Du behåller det strukturerade arket, ställer bättre frågor och rör dig snabbare i arbetet som faktiskt påverkar resultatet.
Kontakta oss
Hör av dig, så diskuterar vi hur just din verksamhet kan dra nytta av alla fantastiska möjligheter som AI skapar.