n8n-workflows/workflows/2063_workflow_2063.json
2025-05-14 11:58:29 +03:00

934 lines
26 KiB
JSON

{
"meta": {
"instanceId": "f0a68da631efd4ed052a324b63ff90f7a844426af0398a68338f44245d1dd9e5"
},
"nodes": [
{
"id": "edef59f6-0197-408e-a819-141c1ca8dedd",
"name": "When clicking \"Execute Workflow\"",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-1820,
780
],
"parameters": {},
"typeVersion": 1
},
{
"id": "d56deaf5-1ad8-45a2-bbf0-3b71560f8036",
"name": "Extract next start value",
"type": "n8n-nodes-base.code",
"position": [
-640,
480
],
"parameters": {
"mode": "runOnceForEachItem",
"jsCode": "let nextUrl\n\nif ($json && $json[\"serpapi_pagination\"] && $json[\"serpapi_pagination\"][\"next\"]) {\n nextUrl = $json[\"serpapi_pagination\"][\"next\"];\n\n$input.item.json.start = nextUrl.split('&').find(param => param.startsWith('start=')).split('=')[1];\n}\n\n\nreturn $input.item;"
},
"typeVersion": 2
},
{
"id": "6562c236-c957-437b-91a9-15e98af09858",
"name": "Merge all values from SERPAPI",
"type": "n8n-nodes-base.code",
"position": [
-140,
680
],
"parameters": {
"jsCode": "const allData = []\n\nlet counter = 0;\ndo {\n try {\n const items = $items(\"SERPAPI - Scrape Google Maps URL\", 0, counter).map(item => item.json.local_results);\n allData.push.apply(allData, items);\n } catch (error) {\n return [{json: {allData}}]; \n }\n\n counter++;\n} while(true);\nreturn $input.all();"
},
"typeVersion": 2
},
{
"id": "357e8a57-dbb5-4241-b9c2-863b3ae3fd96",
"name": "Transform data in the right format",
"type": "n8n-nodes-base.code",
"position": [
380,
680
],
"parameters": {
"jsCode": "console.log($input.all())\n\n\nconst data = $input.all()\n\nconsole.log(\"error\",data)\n\nfunction mergeData(data) {\n let merged = [];\n data.forEach(entry => {\n for (const key in entry.json) {\n merged.push(entry.json[key]);\n }\n });\n return merged;\n}\n\nconst mergedData = mergeData(data);\nconsole.log(mergedData);\n\n\nreturn mergedData.filter(item => item !== null);"
},
"typeVersion": 2
},
{
"id": "4e8e9ae9-f5e3-4bfd-b0d4-9403a1c38d39",
"name": "Add rows in Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
760,
680
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "position",
"type": "string",
"display": true,
"required": false,
"displayName": "position",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "title",
"type": "string",
"display": true,
"required": false,
"displayName": "title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "phone",
"type": "string",
"display": true,
"required": false,
"displayName": "phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "website",
"type": "string",
"display": true,
"required": false,
"displayName": "website",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "rating",
"type": "string",
"display": true,
"required": false,
"displayName": "rating",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "reviews",
"type": "string",
"display": true,
"required": false,
"displayName": "reviews",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "place_id",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "place_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "data_id",
"type": "string",
"display": true,
"required": false,
"displayName": "data_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "data_cid",
"type": "string",
"display": true,
"required": false,
"displayName": "data_cid",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "reviews_link",
"type": "string",
"display": true,
"required": false,
"displayName": "reviews_link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "photos_link",
"type": "string",
"display": true,
"required": false,
"displayName": "photos_link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "gps_coordinates",
"type": "string",
"display": true,
"required": false,
"displayName": "gps_coordinates",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "place_id_search",
"type": "string",
"display": true,
"required": false,
"displayName": "place_id_search",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "provider_id",
"type": "string",
"display": true,
"required": false,
"displayName": "provider_id",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "price",
"type": "string",
"display": true,
"required": false,
"displayName": "price",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "type",
"type": "string",
"display": true,
"required": false,
"displayName": "type",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "types",
"type": "string",
"display": true,
"required": false,
"displayName": "types",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "address",
"type": "string",
"display": true,
"required": false,
"displayName": "address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "open_state",
"type": "string",
"display": true,
"required": false,
"displayName": "open_state",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "hours",
"type": "string",
"display": true,
"required": false,
"displayName": "hours",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "operating_hours",
"type": "string",
"display": true,
"required": false,
"displayName": "operating_hours",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "description",
"type": "string",
"display": true,
"required": false,
"displayName": "description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "service_options",
"type": "string",
"display": true,
"required": false,
"displayName": "service_options",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "order_online",
"type": "string",
"display": true,
"required": false,
"displayName": "order_online",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "thumbnail",
"type": "string",
"display": true,
"required": false,
"displayName": "thumbnail",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "editorial_reviews",
"type": "string",
"display": true,
"required": false,
"displayName": "editorial_reviews",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "unclaimed_listing",
"type": "string",
"display": true,
"required": false,
"displayName": "unclaimed_listing",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"place_id"
]
},
"options": {
"cellFormat": "RAW"
},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 2023033319,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=2023033319",
"cachedResultName": "Results"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=2023033319"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "2",
"name": "Google Sheets account lucas"
}
},
"typeVersion": 4.2
},
{
"id": "90194aa3-5960-47bd-9e0e-efee827004c4",
"name": "SERPAPI - Scrape Google Maps URL",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueErrorOutput",
"position": [
-920,
500
],
"parameters": {
"url": "https://serpapi.com/search.json",
"options": {},
"sendQuery": true,
"authentication": "predefinedCredentialType",
"queryParameters": {
"parameters": [
{
"name": "engine",
"value": "google_maps"
},
{
"name": "q",
"value": "={{$json?.search_parameters?.q || $json.keyword }} "
},
{
"name": "ll",
"value": "={{ $json?.search_parameters?.ll|| $json.geo }}"
},
{
"name": "type",
"value": "search"
},
{
"name": "start",
"value": "={{ $json.start|| 0 }}"
}
]
},
"nodeCredentialType": "serpApi"
},
"credentials": {
"serpApi": {
"id": "MP9W6wBcEfhc6ofn",
"name": "SerpAPI account"
}
},
"typeVersion": 4.1
},
{
"id": "9cfd1e76-2d7c-4618-86d6-e1f3c7729044",
"name": "Remove duplicate items",
"type": "n8n-nodes-base.itemLists",
"position": [
580,
680
],
"parameters": {
"compare": "selectedFields",
"options": {},
"operation": "removeDuplicates",
"fieldsToCompare": "place_id"
},
"typeVersion": 3.1
},
{
"id": "e47dfa17-fc84-4694-950d-165302a9075f",
"name": "Split out items",
"type": "n8n-nodes-base.itemLists",
"position": [
40,
680
],
"parameters": {
"options": {},
"fieldToSplitOut": "allData"
},
"typeVersion": 3.1
},
{
"id": "decc89ee-f836-4ec2-9a1a-0371a8889ef5",
"name": "Remove empty values",
"type": "n8n-nodes-base.filter",
"position": [
200,
680
],
"parameters": {
"conditions": {
"string": [
{
"value1": "={{ $json[0] }}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1
},
{
"id": "bd7ca3a5-2697-4653-abf6-372088d925e6",
"name": "Google Sheets - Get searches to scrap",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1380,
500
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupColumn": "Status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=0",
"cachedResultName": "Add your search here"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=0"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "2",
"name": "Google Sheets account lucas"
}
},
"typeVersion": 4.2
},
{
"id": "6d0be482-b1ad-4fa0-8d2e-bef9a4414924",
"name": "Extract keyword and location from URL",
"type": "n8n-nodes-base.set",
"position": [
-1160,
500
],
"parameters": {
"fields": {
"values": [
{
"name": "keyword",
"stringValue": "={{ $json.URL.match(/\\/search\\/(.*?)\\//)[1] }}"
},
{
"name": "geo",
"stringValue": "={{ $json.URL.match(/(@[^\\/?]+)/)[1]}}"
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "f6fb8db2-8444-4605-af9d-22ca71c7937d",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1920,
200
],
"parameters": {
"width": 312.2965981499806,
"height": 266.8807730722022,
"content": "## Adjust frequency to your own needs"
},
"typeVersion": 1
},
{
"id": "234b5d18-75d7-495b-960f-06192d9e7c61",
"name": "Run workflow every hours",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-1800,
300
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours"
}
]
}
},
"typeVersion": 1.1
},
{
"id": "ea2e9b89-e52c-4e25-803a-ce33c41c20fc",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1460,
200
],
"parameters": {
"height": 511.2196121145973,
"content": "## Copy my template and connect it to n8n\n\nTemplate link: \n https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit?usp=sharing"
},
"typeVersion": 1
},
{
"id": "de515d8d-641d-4b91-9472-608ad3878e32",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-980,
169.3107006491615
],
"parameters": {
"height": 535.9388810024284,
"content": "## Add your SERPAPI API Key\n\nStart a free trial at serpapi.com and get your API key in \"Your account\" section"
},
"typeVersion": 1
},
{
"id": "a5a63861-7ff3-4072-a669-acce938939d8",
"name": "Update Status to Success",
"type": "n8n-nodes-base.googleSheets",
"position": [
940,
680
],
"parameters": {
"columns": {
"value": {
"URL": "={{ $('Google Sheets - Get searches to scrap').first().json.URL }}",
"Status": "✅"
},
"schema": [
{
"id": "URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"URL"
]
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=0",
"cachedResultName": "Add your search url here"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=0"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "2",
"name": "Google Sheets account lucas"
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "2bdc5b63-e3bb-453e-a236-9c83cd12cc03",
"name": "Update Status to Error",
"type": "n8n-nodes-base.googleSheets",
"position": [
-640,
620
],
"parameters": {
"columns": {
"value": {
"URL": "={{ $('Google Sheets - Get searches to scrap').first().json.URL }}",
"Status": "❌"
},
"schema": [
{
"id": "URL",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "string",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"URL"
]
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=0",
"cachedResultName": "Add your search url here"
},
"documentId": {
"__rl": true,
"mode": "url",
"value": "https://docs.google.com/spreadsheets/d/170osqaLBql9M-4RAH3_lBKR7ZMaQqyLUkAD-88xGuEQ/edit#gid=0"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "2",
"name": "Google Sheets account lucas"
}
},
"executeOnce": true,
"typeVersion": 4.2
},
{
"id": "f413f4ef-fd6d-4967-8df7-a4fee4361246",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1920,
640
],
"parameters": {
"width": 312.2965981499806,
"height": 310.4703136043695,
"content": "## Click on Execute Workflow to run the workflow manually"
},
"typeVersion": 1
},
{
"id": "cbc53e43-f141-434c-a655-feb1f7d3c65b",
"name": "Continue IF Loop is complete",
"type": "n8n-nodes-base.if",
"position": [
-380,
620
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{ $json.search_parameters.start }}",
"operation": "isNotEmpty"
}
],
"string": [
{
"value1": "={{ $json.serpapi_pagination.next }}",
"operation": "isNotEmpty"
}
]
}
},
"typeVersion": 1
},
{
"id": "229f9652-b703-490e-aa3c-c28b0fe1f2e8",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2340,
200
],
"parameters": {
"width": 357.33341618921213,
"height": 532.3420004517685,
"content": "## Read Me\n\nThis workflow allows to scrape Google Maps data in an efficient way using SerpAPI. \n\nYou'll get all data from Gmaps at a cheaper cost than Google Maps API.\n\nAdd as input, your Google Maps search URL and you'll get a list of places with many data points such as:\n- phone number\n- website\n- rating\n- reviews\n- address\n\nAnd much more.\n\n\n**Full guide to implement the workflow is here**: \n\nhttps://lempire.notion.site/Scrape-Google-Maps-places-with-n8n-b7f1785c3d474e858b7ee61ad4c21136?pvs=4"
},
"typeVersion": 1
}
],
"pinData": {},
"connections": {
"Split out items": {
"main": [
[
{
"node": "Remove empty values",
"type": "main",
"index": 0
}
]
]
},
"Remove empty values": {
"main": [
[
{
"node": "Transform data in the right format",
"type": "main",
"index": 0
}
]
]
},
"Remove duplicate items": {
"main": [
[
{
"node": "Add rows in Google Sheets",
"type": "main",
"index": 0
}
]
]
},
"Extract next start value": {
"main": [
[
{
"node": "Continue IF Loop is complete",
"type": "main",
"index": 0
}
]
]
},
"Run workflow every hours": {
"main": [
[
{
"node": "Google Sheets - Get searches to scrap",
"type": "main",
"index": 0
}
]
]
},
"Add rows in Google Sheets": {
"main": [
[
{
"node": "Update Status to Success",
"type": "main",
"index": 0
}
]
]
},
"Continue IF Loop is complete": {
"main": [
[
{
"node": "SERPAPI - Scrape Google Maps URL",
"type": "main",
"index": 0
}
],
[
{
"node": "Merge all values from SERPAPI",
"type": "main",
"index": 0
}
]
]
},
"Merge all values from SERPAPI": {
"main": [
[
{
"node": "Split out items",
"type": "main",
"index": 0
}
]
]
},
"SERPAPI - Scrape Google Maps URL": {
"main": [
[
{
"node": "Extract next start value",
"type": "main",
"index": 0
}
],
[
{
"node": "Update Status to Error",
"type": "main",
"index": 0
}
]
]
},
"When clicking \"Execute Workflow\"": {
"main": [
[
{
"node": "Google Sheets - Get searches to scrap",
"type": "main",
"index": 0
}
]
]
},
"Transform data in the right format": {
"main": [
[
{
"node": "Remove duplicate items",
"type": "main",
"index": 0
}
]
]
},
"Extract keyword and location from URL": {
"main": [
[
{
"node": "SERPAPI - Scrape Google Maps URL",
"type": "main",
"index": 0
}
]
]
},
"Google Sheets - Get searches to scrap": {
"main": [
[
{
"node": "Extract keyword and location from URL",
"type": "main",
"index": 0
}
]
]
}
}
}