n8n Web Scraping: Google-Suchergebnisse auslesen, ohne Code
Importiere einen n8n-Workflow, der Keywords durchläuft, eine Google-Such-API aufruft, die Top-Seiten als Markdown scrapt und Zeilen in Google Sheets oder eine CSV schreibt.

Web Scraping und Google-Suche in n8n gehen mit zwei HTTP-Request-Nodes und ohne Code, abgesehen von einer Keyword-Liste: Der eine ruft pro Keyword https://api.fastaf.co/v1/serp auf, der andere (optional) /v1/scrape für die Top-Ergebnisse und liefert Markdown zurück. Am 19. Oktober 2026 hat der Workflow unten aus 3 Keywords 30 Ranking-Zeilen in 10,9 Sekunden gemacht und, mit eingeschaltetem Scraping, zusätzlich 8 Seiten Markdown, insgesamt für 23 Credits (etwa ein Cent beim Preis des Starter-Pakets von 10 $ für 20.000 Credits).
Füg das JSON aus diesem Beitrag in n8n ein, hänge eine Credential an, drück auf Execute. Die Nodes stehen in der Tabelle, die vollständige Datei folgt darunter.
Was macht der n8n-SERP-Workflow?
| Node | Typ | Aufgabe |
|---|---|---|
| Keywords | Code | Liefert pro Keyword ein Item (ersetz ihn durch einen Sheets- oder Airtable-Read) |
| Limit | Limit | Harte Obergrenze von 20 Keywords pro Lauf, also höchstens 100 Credits für Suchen |
| Loop over keywords | Loop Over Items, Batch-Größe 1 | Schickt ein Keyword nach dem anderen und sammelt alle Zeilen am done-Ausgang |
| FastAF SERP | HTTP Request | GET /v1/serp?query=...&country=..., Bearer-Header, Retry bei Fehler |
| Split results | Split Out | Macht aus organic_results (10 pro Suche) je ein eigenes Item |
| Build rows | Edit Fields | Behält Keyword, Position, Titel, Link, Snippet, Datum |
| Append to Google Sheet | Google Sheets | Deaktiviert, bis du Google-Credentials hinterlegst |
| Convert to CSV, Write CSV | Convert to File, Read/Write Files | Die Alternative, wenn du keine Google-Credentials hast |
| Top 3 only, FastAF scrape, Page + markdown | Filter, HTTP Request, Edit Fields | Optional, standardmäßig deaktiviert: Markdown der Top-3-Seiten pro Keyword, YouTube wird übersprungen |
Ich habe diese Datei in n8n 2.43.8 über die CLI (n8n execute) ausgeführt, die HTTP-, Loop-, Split-, Filter- und CSV-Nodes sind also wirklich gelaufen. Den Google-Sheets-Node habe ich nicht ausgeführt: Er braucht Google-OAuth-Credentials, die ich nicht habe, deshalb ist er deaktiviert. Es ist die Standard-Append-Operation von n8n mit automatischem Spalten-Mapping.
Wie sieht das komplette Workflow-JSON aus?
Leg in n8n einen Workflow an und drück Strg/Cmd+V auf der Arbeitsfläche, während das hier in der Zwischenablage liegt (oder nutze im 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"}
}
Leg dann eine Credential vom Typ Header Auth an, Name FastAF API key, Header-Name Authorization, Wert Bearer <dein Key> (einen Key bekommst du mit den 500 kostenlosen Credits). Öffne die beiden HTTP-Request-Nodes und wähl diese Credential aus. Um den Scraping-Zweig einzuschalten, markier Top 3 only, FastAF scrape und Page + markdown und drück D.
Warum über Keywords loopen statt Pagination zu nutzen?
Der HTTP-Request-Node hat eine Pagination-Option, die aber für APIs gedacht ist, die eine Folgeseiten-URL zurückgeben oder einen Seitenzähler annehmen (n8n-Docs). Ein Rank- oder Recherche-Job ist etwas anderes: Du hast eine Liste von Keywords, und jedes braucht genau einen Request. Eine Suche liefert die ersten 10 organischen Ergebnisse, und die willst du für eine Positionsprüfung.
Der Workflow nutzt deshalb Loop Over Items (Docs) mit Batch-Größe 1. Das erledigt zwei Dinge, die man sonst leicht falsch macht. Die Requests laufen nacheinander, was beim Free-Paket zählt, wo die Nebenläufigkeit 1 beträgt. Und du kannst das Keyword später mit $('Loop over keywords').item.json.keyword referenzieren, sodass jede Zeile das Keyword trägt, aus dem sie stammt.
Der done-Ausgang des Loops feuert genau einmal, nach dem letzten Keyword, mit allen Zeilen aus Build rows. Deshalb hängen Sheets, CSV und der Scrape-Zweig alle an done: Sie laufen einmal mit 30 Items, nicht dreimal mit 10. Für tiefere Ergebnisse füg einen page-Query-Parameter und einen zweiten Loop hinzu; die Seite zur Google-SERP-API listet die Parameter, und die Python-Version zeigt dieselbe Aufgabe als Code.
Wie gehe ich mit 429-Fehlern um und deckle die Ausgaben?
Ein 429 bedeutet, dass ein Raten- oder Nebenläufigkeitslimit erreicht wurde, und kommt mit einem Retry-After-Header (Docs). Öffne in n8n den HTTP-Request-Node, Settings, und schalte Retry On Fail ein. Die Datei setzt Max Tries auf 5 und Wait Between Tries auf 3000 ms. Der n8n-Quellcode begrenzt die Versuche selbst auf 2-5 und die Wartezeit auf 0-5000 ms, das ist also nahe am Maximum, und die Wartezeit ist fest: n8n liest Retry-After nicht aus.
Ich habe das geprüft, indem die ersten beiden Requests eines Laufs mit 429 antworteten. n8n wartete zwischen den Versuchen 3 Sekunden, der dritte Versuch klappte, und der Node war nach 6,1 Sekunden fertig. Fehlgeschlagene Requests werden nie berechnet, ein Retry kostet also nichts.
Für die Ausgaben gibt es drei Limits, vom engsten zum weitesten:
- Der
Limit-Node: 20 Keywords zu je 5 Credits sind 100 Credits Suchen pro Lauf. Das Scrapen der Top 3 kommt mit bis zu 60 hinzu, je 1 Credit. - Das Credit-Guthaben: Ist es leer, antwortet die API mit
402 insufficient_credits. Das Guthaben gehört zum Konto, und jeder Key zehrt davon, es ist also eine harte Obergrenze für das ganze Konto. - Stell bei einem 402 On Error auf „Continue (using error output)” (Docs), damit der Lauf sauber endet, statt mittendrin abzubrechen.
Was, wenn ich keine Google-Credentials habe?
Nimm den CSV-Zweig. Convert to CSV baut die Datei aus den 30 Zeilen, Write CSV speichert sie. Eine Falle, in die ich gelaufen bin: n8n weigert sich, außerhalb seines Dateiordners zu schreiben, und bricht mit „Access to the file is not allowed” ab (~/.n8n-files, im Docker-Image /home/node/.n8n-files; die Einschränkung steuert N8N_RESTRICT_FILE_ACCESS_TO, siehe die n8n-Docs). Der Pfad in der Datei zeigt schon dorthin. Das Ergebnis vom 19. Oktober 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
Für Google Sheets trägst du deine Spreadsheet-ID in den Node ein, stellst sicher, dass in Zeile 1 die sechs Spaltennamen stehen, aktivierst den Node und löschst den CSV-Zweig, falls du ihn nicht brauchst.
Welche Zahlen hat ein echter Lauf geliefert?
Lauf vom 19. Oktober 2026, 3 Keywords (n8n web scraping, google search api, serp api for ai agents), Land us, Scraping-Zweig aktiviert:
| Messgröße | Ergebnis |
|---|---|
| Status der Ausführung | success, 10,9 s von Start bis Ende |
| Such-Calls | 3, je etwa 3 s (8,9 s im Node) |
| Organische Ergebnisse | 10 pro Keyword, 30 Zeilen |
| Gescrapte Seiten | 8 (Top 3 pro Keyword, YouTube herausgefiltert), 1,5 s für den Batch |
| Größe des Markdowns | 37 bis 26.313 Zeichen pro Seite |
| Credits | 3 x 5 + 8 x 1 = 23 |
Ein einzelner Bestätigungs-Call gegen die Produktions-API lieferte 200 in 4,4 Sekunden mit X-FastAF-Credits-Used: 5. Die Latenz der Live-Suche schwankt, plane also mit 3 bis 4 Sekunden pro Keyword: 100 Keywords dauern in einem sequenziellen Loop etwa 5 Minuten.
Zwei gescrapte Seiten, beides Reddit-Threads, kamen als einzelne Zeile mit 37 Zeichen zurück (ein „Skip to main content”-Link). Öffentliche Seiten rendern nicht immer brauchbare Inhalte, prüf also die Länge von markdown, bevor du es an ein LLM weitergibst. Die Rendering-Optionen stehen im Beitrag zu JavaScript-Rendering.
Was unterscheidet das von einem Python-Skript?
Die Logik ist dieselbe wie beim Überwachen von Keyword-Rankings mit Python; n8n bringt einen visuellen Editor, einen Scheduler (ersetz Run manually durch einen Schedule Trigger) und fertige Konnektoren mit. Brauchst du Ranking-Verlauf und Diffs, sind eine Datenbank und ein Skript weiterhin leichter zu testen. Ist das Ergebnis eine Tabelle oder eine Slack-Nachricht, ist n8n kürzer.
Kurzversion
- Zwei HTTP-Request-Nodes gegen
https://api.fastaf.co/v1erledigen beide Aufgaben:/serpfür 5 Credits,/scrapefür 1 Credit. - Loop Over Items mit Batch-Größe 1 schlägt Pagination bei Keyword-Listen; lies die Ergebnisse am
done-Ausgang. - Retry On Fail (5 Versuche, 3 s) fängt 429er ab; der Limit-Node und das Kontoguthaben deckeln die Ausgaben.
- Geprüft am 19. Oktober 2026: 3 Keywords, 30 Zeilen, 8 Seiten, 23 Credits, 10,9 s. Nicht getestet: der Google-Sheets-Node.
Hol dir einen kostenlosen Key (500 Credits, keine Karte), importier den Workflow und sieh die Zeilen in deiner eigenen Tabelle. Die Parameter stehen in den Docs.