This workflow follows the Executecommand → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"name": "On clicking 'execute'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-140,
820
],
"parameters": {},
"typeVersion": 1
},
{
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
320,
820
],
"parameters": {
"url": "https://www.theswiftcodes.com/browse-by-country/",
"options": {},
"responseFormat": "string"
},
"typeVersion": 1
},
{
"name": "HTML Extract",
"type": "n8n-nodes-base.htmlExtract",
"position": [
510,
820
],
"parameters": {
"options": {},
"extractionValues": {
"values": [
{
"key": "countries",
"attribute": "href",
"cssSelector": "ol > li > a",
"returnArray": true,
"returnValue": "attribute"
}
]
}
},
"typeVersion": 1
},
{
"name": "SplitInBatches",
"type": "n8n-nodes-base.splitInBatches",
"position": [
910,
820
],
"parameters": {
"options": {
"reset": false
},
"batchSize": 1
},
"typeVersion": 1
},
{
"name": "HTTP Request1",
"type": "n8n-nodes-base.httpRequest",
"position": [
2250,
740
],
"parameters": {
"url": "={{$node[\"Set\"].json[\"url\"]}}",
"options": {},
"responseFormat": "file"
},
"typeVersion": 1
},
{
"name": "HTML Extract1",
"type": "n8n-nodes-base.htmlExtract",
"position": [
2750,
590
],
"parameters": {
"options": {},
"sourceData": "binary",
"extractionValues": {
"values": [
{
"key": "next_button",
"attribute": "href",
"cssSelector": "span.next > a",
"returnValue": "attribute"
},
{
"key": "names",
"cssSelector": "td.table-name",
"returnArray": true
},
{
"key": "swifts",
"cssSelector": "td.table-swift",
"returnArray": true
},
{
"key": "cities",
"cssSelector": "td.table-city",
"returnArray": true
},
{
"key": "branches",
"cssSelector": "td.table-branch",
"returnArray": true
}
]
}
},
"typeVersion": 1
},
{
"name": "MongoDB1",
"type": "n8n-nodes-base.mongoDb",
"position": [
3280,
590
],
"parameters": {
"fields": "iso_code,country,page,name,branch,city,swift_code,createdAt,updatedAt",
"options": {
"dateFields": "createdAt,updatedAt"
},
"operation": "insert",
"collection": "swifts.meetup"
},
"credentials": {
"mongoDb": "<your credential>"
},
"typeVersion": 1
},
{
"name": "uProc",
"type": "n8n-nodes-base.uproc",
"position": [
1100,
820
],
"parameters": {
"tool": "getCountryNormalized",
"group": "geographic",
"country": "={{$node[\"SplitInBatches\"].json[\"country\"].replace(/[\\/0-9]/g, \"\")}}",
"additionalOptions": {}
},
"credentials": {
"uprocApi": "<your credential>"
},
"typeVersion": 1
},
{
"name": "Prepare Documents",
"type": "n8n-nodes-base.function",
"position": [
2930,
590
],
"parameters": {
"functionCode": "var newItems = [];\n\nfor (i = 0; i < items[0].json.swifts.length; i++) {\n var item = {\n iso_code: $node['uProc'].json.message.code,\n country: $node['SplitInBatches'].json.country.replace(/[-\\/0-9]/g, \"\"),\n page: $node['Set Page to Scrape'].json.page,\n name: items[0].json.names[i],\n city: items[0].json.cities[i],\n branch: items[0].json.branches[i],\n swift_code: items[0].json.swifts[i],\n createdAt: new Date(),\n updatedAt: new Date()\n }\n newItems.push({json: item});\n}\n\nreturn newItems;\n\n"
},
"typeVersion": 1
},
{
"name": "More Countries",
"type": "n8n-nodes-base.if",
"position": [
2810,
1100
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$node[\"SplitInBatches\"].context[\"noItemsLeft\"] + \"\"}}",
"value2": "true"
}
]
}
},
"typeVersion": 1
},
{
"name": "Set Page to Scrape",
"type": "n8n-nodes-base.functionItem",
"position": [
1290,
680
],
"parameters": {
"functionCode": "const staticData = getWorkflowStaticData('global');\n\nitem.page = \"\";\nif (staticData.page && staticData.page.length) {\n item.page = staticData.page;\n} else {\n item.page = $node['SplitInBatches'].json.country;\n}\nreturn item;\n"
},
"typeVersion": 1
},
{
"name": "More Pages",
"type": "n8n-nodes-base.if",
"position": [
3070,
1020
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$json[\"more_pages\"] + \"\"}}",
"value2": "true"
}
]
}
},
"typeVersion": 1
},
{
"name": "Set More Pages",
"type": "n8n-nodes-base.function",
"position": [
3470,
590
],
"parameters": {
"functionCode": "var next_page = $node['HTML Extract1'].json.next_button && $node['HTML Extract1'].json.next_button.length ? $node['HTML Extract1'].json.next_button : \"\";\nvar more_pages = next_page.length > 0;\nconst staticData = getWorkflowStaticData('global');\n\n//all current items are after date: needs pagination\nif (more_pages) {\n staticData.page = next_page;\n} else {\n //don't check more items in previous pages;\n delete staticData.page;\n}\n\nreturn [\n {\n json: {\n more_pages: more_pages\n }\n }\n];\n"
},
"typeVersion": 1
},
{
"name": "Set",
"type": "n8n-nodes-base.set",
"position": [
1440,
680
],
"parameters": {
"values": {
"string": [
{
"name": "url",
"value": "=https://www.theswiftcodes.com{{$node[\"Set Page to Scrape\"].json[\"page\"]}}"
}
]
},
"options": {}
},
"typeVersion": 1
},
{
"name": "Generate filename",
"type": "n8n-nodes-base.functionItem",
"position": [
1600,
610
],
"parameters": {
"functionCode": "var generateNameFromUrl = function(url){\n return url.replace(/[^a-z0-9]/gi, \"_\");\n}\n\nitem.file = generateNameFromUrl(item.url) + \".html\"\nreturn item;"
},
"typeVersion": 1
},
{
"name": "Read Binary File",
"type": "n8n-nodes-base.readBinaryFile",
"position": [
1770,
610
],
"parameters": {
"filePath": "=/home/node/.cache/scrapper/{{$json[\"file\"]}}"
},
"typeVersion": 1,
"continueOnFail": true,
"alwaysOutputData": true
},
{
"name": "File exists?",
"type": "n8n-nodes-base.if",
"position": [
1950,
610
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{$node[\"Read Binary File\"].binary.data.mimeType}}",
"value2": "text/html"
}
]
}
},
"typeVersion": 1
},
{
"name": "Write Binary File",
"type": "n8n-nodes-base.writeBinaryFile",
"position": [
2400,
740
],
"parameters": {
"fileName": "=/home/node/.cache/scrapper/{{$node[\"Generate filename\"].json[\"file\"]}}",
"dataPropertyName": "=data"
},
"typeVersion": 1
},
{
"name": "Read Binary File1",
"type": "n8n-nodes-base.readBinaryFile",
"position": [
2570,
590
],
"parameters": {
"filePath": "=/home/node/.cache/scrapper/{{$json[\"file\"]}}"
},
"typeVersion": 1,
"continueOnFail": true,
"alwaysOutputData": true
},
{
"name": "Wait",
"type": "n8n-nodes-base.function",
"position": [
2090,
740
],
"parameters": {
"functionCode": "const waitTimeSeconds = 1;\n\nreturn new Promise((resolve) => {\n setTimeout(() => {\n resolve([]);\n }, waitTimeSeconds * 1000);\n});\n"
},
"typeVersion": 1,
"continueOnFail": true,
"alwaysOutputData": true
},
{
"name": "Prepare countries",
"type": "n8n-nodes-base.function",
"position": [
700,
820
],
"parameters": {
"functionCode": "return items[0].json.countries.map(function(country) {\n return {\n json: {country: country}\n }\n});"
},
"typeVersion": 1
},
{
"name": "Create Directory",
"type": "n8n-nodes-base.executeCommand",
"position": [
70,
820
],
"parameters": {
"command": "mkdir -p /home/node/.cache/scrapper/"
},
"typeVersion": 1,
"continueOnFail": true
},
{
"name": "MongoDB",
"type": "n8n-nodes-base.mongoDb",
"disabled": true,
"position": [
3100,
520
],
"parameters": {
"query": "={\"swift_code\": \"{{$json[\"swift_code\"]}}\"}",
"options": {},
"collection": "swifts.meetup"
},
"credentials": {
"mongoDb": "<your credential>"
},
"executeOnce": false,
"typeVersion": 1,
"alwaysOutputData": true
}
],
"connections": {
"Set": {
"main": [
[
{
"node": "Generate filename",
"type": "main",
"index": 0
}
]
]
},
"Wait": {
"main": [
[
{
"node": "HTTP Request1",
"type": "main",
"index": 0
}
]
]
},
"uProc": {
"main": [
[
{
"node": "Set Page to Scrape",
"type": "main",
"index": 0
}
]
]
},
"MongoDB": {
"main": [
[]
]
},
"MongoDB1": {
"main": [
[
{
"node": "Set More Pages",
"type": "main",
"index": 0
}
]
]
},
"More Pages": {
"main": [
[
{
"node": "Set Page to Scrape",
"type": "main",
"index": 0
}
],
[
{
"node": "More Countries",
"type": "main",
"index": 0
}
]
]
},
"File exists?": {
"main": [
[
{
"node": "Read Binary File1",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"HTML Extract": {
"main": [
[
{
"node": "Prepare countries",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request": {
"main": [
[
{
"node": "HTML Extract",
"type": "main",
"index": 0
}
]
]
},
"HTML Extract1": {
"main": [
[
{
"node": "Prepare Documents",
"type": "main",
"index": 0
}
]
]
},
"HTTP Request1": {
"main": [
[
{
"node": "Write Binary File",
"type": "main",
"index": 0
}
]
]
},
"More Countries": {
"main": [
[],
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
},
"Set More Pages": {
"main": [
[
{
"node": "More Pages",
"type": "main",
"index": 0
}
]
]
},
"SplitInBatches": {
"main": [
[
{
"node": "uProc",
"type": "main",
"index": 0
}
]
]
},
"Create Directory": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Read Binary File": {
"main": [
[
{
"node": "File exists?",
"type": "main",
"index": 0
}
]
]
},
"Generate filename": {
"main": [
[
{
"node": "Read Binary File",
"type": "main",
"index": 0
}
]
]
},
"Prepare Documents": {
"main": [
[
{
"node": "MongoDB1",
"type": "main",
"index": 0
}
]
]
},
"Prepare countries": {
"main": [
[
{
"node": "SplitInBatches",
"type": "main",
"index": 0
}
]
]
},
"Read Binary File1": {
"main": [
[
{
"node": "HTML Extract1",
"type": "main",
"index": 0
}
]
]
},
"Write Binary File": {
"main": [
[
{
"node": "Read Binary File1",
"type": "main",
"index": 0
}
]
]
},
"Set Page to Scrape": {
"main": [
[
{
"node": "Set",
"type": "main",
"index": 0
}
]
]
},
"On clicking 'execute'": {
"main": [
[
{
"node": "Create Directory",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
mongoDbuprocApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Easily extract and organise valuable data from various website pages without coding expertise, saving hours of manual copying and ensuring your information stays current in a central database. This workflow suits marketers, researchers, or analysts needing to gather structured details like product prices or article summaries from multiple sources. It begins by fetching page content via HTTP requests, then uses HTML Extract to pull out specific elements before storing them in MongoDB for seamless access and updates.
Use this when monitoring dynamic web data across sites, such as competitor pricing or news feeds, where batch processing handles volume efficiently. Avoid it for sites with strong anti-scraping measures or real-time needs, opting instead for APIs like those from official providers. Common variations include swapping MongoDB for Google Sheets storage or adding uProc for data cleaning before insertion.
About this workflow
Scrape And Store Data From Multiple Website Pages. Uses manualTrigger, httpRequest, htmlExtract, splitInBatches. Event-driven trigger; 23 nodes.
Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
extract_swifts. Uses manualTrigger, httpRequest, htmlExtract, splitInBatches. Event-driven trigger; 23 nodes.
Track Changes Of Product Prices. Uses htmlExtract, functionItem, httpRequest, writeBinaryFile. Scheduled trigger; 25 nodes.
This workflow automatically tracks changes on specific websites, typically in e-commerce where you want to get information about price changes. Basic knowledge of HTML and JavaScript Execute Command n
This n8n template automates website analysis and ecommerce URL classification using AI. It scrapes a website, extracts business intelligence, maps all internal pages, and categorises them into product
This workflow uses the Zyte API to automatically detect and extract structured data from E-commerce sites, Articles, Job Boards, and Search Engine Results (SERP) - no custom CSS selectors required.