AutomationFlowsWeb Scraping › Google Maps Lead Generation with Apify & Email Extraction for Airtable

Google Maps Lead Generation with Apify & Email Extraction for Airtable

ByEzema Kingsley Chibuzo @kingsley on n8n.io

This n8n workflow collects leads from Google Maps, scrapes their websites via direct HTTP requests, and extracts valid email addresses — all while mimicking real user behavior to improve scraping reliability. It rotates User-Agent headers, introduces randomized delays, and…

Event trigger★★★★☆ complexity26 nodesForm Trigger@Apify/N8N Nodes ApifyHTTP RequestAirtable
Web Scraping Trigger: Event Nodes: 26 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #6307 — we link there as the canonical source.

This workflow follows the Airtable → Form Trigger 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 →

Download .json
{
  "id": "Rp64ykElPQZ1J9L8",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Light Web Scraper",
  "tags": [],
  "nodes": [
    {
      "id": "1ed880cf-9d9d-4e2d-bc1d-76ab49a44164",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "position": [
        520,
        180
      ],
      "parameters": {
        "maxItems": 30
      },
      "typeVersion": 1
    },
    {
      "id": "b106fc00-65fa-4300-adda-99822ac96d44",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -360,
        180
      ],
      "parameters": {
        "options": {},
        "formTitle": "Web Scraper",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Keyword",
              "requiredField": true
            },
            {
              "fieldLabel": "Location",
              "requiredField": true
            },
            {
              "fieldLabel": "No. Of Leads",
              "placeholder": "10"
            }
          ]
        },
        "formDescription": "This scrapes website urls from Google Maps to get company information."
      },
      "typeVersion": 2.2
    },
    {
      "id": "1a61eada-9883-437b-9b85-7553ad972639",
      "name": "Run an Actor",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        -140,
        180
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "list",
          "value": "nwua9Gu5YrADL7ZDj",
          "cachedResultUrl": "https://console.apify.com/actors/nwua9Gu5YrADL7ZDj/input",
          "cachedResultName": "Google Maps Scraper"
        },
        "timeout": 120,
        "operation": "Run actor",
        "customBody": "={\n    \"language\": \"en\",\n    \"locationQuery\": \"{{ $json.Location }}\",\n    \"maxCrawledPlacesPerSearch\": {{ $json['No. Of Leads'] ? Number($json['No. Of Leads']) : 10 }},\n    \"searchStringsArray\": [\n        \"{{ $json.Keyword }}\"\n    ],\n    \"skipClosedPlaces\": false,\n    \"website\": \"withWebsite\"\n}",
        "waitForFinish": 20
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1eab0a81-e729-49f0-add9-7a3d9de9844f",
      "name": "Get dataset items",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        80,
        180
      ],
      "parameters": {
        "offset": {},
        "resource": "Datasets",
        "datasetId": "={{ $json.defaultDatasetId }}",
        "operation": "Get items"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "043184f1-353d-460c-9104-bd68158e8530",
      "name": "Grab Desired Fields",
      "type": "n8n-nodes-base.set",
      "position": [
        300,
        180
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f19ca41a-9da1-4a8d-ae29-1c3dc133f588",
              "name": "Company Name",
              "type": "string",
              "value": "={{ $json.title }}"
            },
            {
              "id": "adbbe03b-f320-4566-bee2-ca69d7a6b2fe",
              "name": "Company Category",
              "type": "string",
              "value": "={{ $json.categoryName }}"
            },
            {
              "id": "624abbcd-9882-4594-ae6c-7cb8b5b00578",
              "name": "Address",
              "type": "string",
              "value": "={{ $json.address }}"
            },
            {
              "id": "1b05c9b0-b473-4b49-95fd-bfb52f3195ee",
              "name": "Website",
              "type": "string",
              "value": "={{ $json.website }}"
            },
            {
              "id": "3c4d7142-6545-42eb-99e6-ef1a32ce5157",
              "name": "Phone Number",
              "type": "string",
              "value": "={{ $json.phoneUnformatted }}"
            },
            {
              "id": "c4a5b4de-6591-4b36-a791-f180e744649c",
              "name": "Rating",
              "type": "string",
              "value": "={{ $json.totalScore }}"
            },
            {
              "id": "be70e33b-13aa-4aa2-ad34-cbd58f515dea",
              "name": "Other Categories",
              "type": "array",
              "value": "={{ $json.categories }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "26e3f96c-79e5-4135-96ec-a89441618ed0",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        740,
        180
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "20d15211-f36d-4ce1-ab7f-f3606e40f198",
      "name": "Markdown",
      "type": "n8n-nodes-base.markdown",
      "onError": "continueRegularOutput",
      "position": [
        1840,
        105
      ],
      "parameters": {
        "html": "={{ $json.data }}",
        "options": {}
      },
      "typeVersion": 1,
      "alwaysOutputData": true
    },
    {
      "id": "58b07df7-6d08-40db-b489-dd1e8f7544a6",
      "name": "Loop Over Items1",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        960,
        -245
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "1476a2bb-7943-457c-bf74-4ae07ea4005a",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        1400,
        -320
      ],
      "parameters": {
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "2f112d83-278b-42d9-ac8b-ba88588abdf4",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        2280,
        255
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "5489d865-ac36-4be8-a822-a673d5f85ab9",
      "name": "Grab Desired Fields1",
      "type": "n8n-nodes-base.set",
      "position": [
        1400,
        -520
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f19ca41a-9da1-4a8d-ae29-1c3dc133f588",
              "name": "Company Name",
              "type": "string",
              "value": "={{ $json['Company Name'] }}"
            },
            {
              "id": "adbbe03b-f320-4566-bee2-ca69d7a6b2fe",
              "name": "Company Category",
              "type": "string",
              "value": "={{ $json['Company Category'] }}"
            },
            {
              "id": "624abbcd-9882-4594-ae6c-7cb8b5b00578",
              "name": "Address",
              "type": "string",
              "value": "={{ $json.Address }}"
            },
            {
              "id": "1b05c9b0-b473-4b49-95fd-bfb52f3195ee",
              "name": "Website",
              "type": "string",
              "value": "={{ $json.Website }}"
            },
            {
              "id": "3c4d7142-6545-42eb-99e6-ef1a32ce5157",
              "name": "Phone Number",
              "type": "string",
              "value": "={{ $json['Phone Number'] }}"
            },
            {
              "id": "c4a5b4de-6591-4b36-a791-f180e744649c",
              "name": "Rating",
              "type": "string",
              "value": "={{ $json.Rating }}"
            },
            {
              "id": "cbc0a9fd-95ce-47da-882c-92894333452f",
              "name": "Email",
              "type": "string",
              "value": "={{ $json.email }}"
            },
            {
              "id": "be70e33b-13aa-4aa2-ad34-cbd58f515dea",
              "name": "Other Categories",
              "type": "array",
              "value": "={{ $json['Other Categories'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "8e194e31-0a42-41b9-ba8e-1ab513fe619d",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "position": [
        1620,
        -170
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "87be44e2-d4e4-4e58-9aee-36aca8025e6a",
      "name": "Parse url/website",
      "type": "n8n-nodes-base.set",
      "position": [
        960,
        105
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cd0bee55-966e-4ea8-8ba4-fcccd19fccd5",
              "name": "website",
              "type": "string",
              "value": "={{ $json.Website }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "532b375f-a0b2-42c3-8344-89a9f401a97d",
      "name": "Remove Query Parameters & Fragments",
      "type": "n8n-nodes-base.code",
      "position": [
        1180,
        105
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  const rawUrl = item.json.website?.trim() || '';\n\n    // If no scheme (http/https), prepend https://\n  if (!/^https?:\\/\\//i.test(rawUrl)) {\n    rawUrl = 'https://' + rawUrl;\n  }\n\n  try {\n    const parsed = new URL(rawUrl);\n\n    // Remove query parameters and fragments\n    parsed.search = '';\n    parsed.hash = '';\n\n    item.json.cleanedWebsite = parsed.toString();\n    item.json.websiteType = 'cleaned';  // optional tag\n  } catch (err) {\n    item.json.cleanedWebsite = null;\n    item.json.websiteType = 'invalid';\n    item.json.error = 'Invalid or missing URL';\n  }\n\n  return item;\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "8c1b4f28-cb4e-4e8d-9783-b68175ee26fc",
      "name": "User-Agents",
      "type": "n8n-nodes-base.set",
      "position": [
        1400,
        105
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "38d260fd-92b5-4d92-803a-6ff41a9b3e42",
              "name": "website",
              "type": "string",
              "value": "={{ $json.website }}"
            },
            {
              "id": "ca022cbe-43bf-4f8a-bb9a-701e6ceb1933",
              "name": "User-Agent",
              "type": "string",
              "value": "={{ [\n  \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36\",\n  \"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Safari/605.1.15\",\n  \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36\",\n  \"Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1\",\n  \"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:118.0) Gecko/20100101 Firefox/118.0\"\n][Math.floor(Math.random() * 5)] }}"
            },
            {
              "id": "cc63a3da-904a-4d54-adb4-40064ed2378a",
              "name": "Accept",
              "type": "string",
              "value": "=text/html,*/*;q=0.8"
            },
            {
              "id": "5cfc4087-5aff-4f73-8aad-1394268fd358",
              "name": "Accept-Language",
              "type": "string",
              "value": "en-US,en;q=0.9"
            },
            {
              "id": "1882eb17-c18f-4de2-b3bd-40b87dce55a6",
              "name": "Referer",
              "type": "string",
              "value": "https://google.com/"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "79882f8b-ad9d-481d-ab8a-38191f78868b",
      "name": "Website Scraping",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        1620,
        105
      ],
      "parameters": {
        "url": "={{ $json.website }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "User-Agent",
              "value": "={{ $json['User-Agent'] }}"
            },
            {
              "name": "Accept-Language",
              "value": "={{ $json['Accept-Language'] }}"
            },
            {
              "name": "Referer",
              "value": "={{ $json.Referer }}"
            },
            {
              "name": "Accept",
              "value": "={{ $json.Accept }}"
            }
          ]
        }
      },
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "id": "00890b55-73a1-4995-a0aa-d55c76b4dcc3",
      "name": "Random Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        2060,
        105
      ],
      "parameters": {
        "amount": "={{ Math.floor(Math.random() * 6 + 2) }}"
      },
      "typeVersion": 1.1
    },
    {
      "id": "a3f3f96e-1187-4e30-8b6f-b8d008244a0c",
      "name": "Extract Email Address",
      "type": "n8n-nodes-base.code",
      "onError": "continueRegularOutput",
      "position": [
        1180,
        -320
      ],
      "parameters": {
        "jsCode": "// Regex to match emails (basic form)\nconst emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-z]{2,}/gi;\n\n// Step 1: Collect all matches from all markdowns\nlet allEmails = [];\n\nfor (const item of items) {\n  const markdown = item.json.data || '';\n  const matches = markdown.match(emailRegex);\n\n  if (matches && matches.length) {\n    allEmails.push(...matches);\n  }\n}\n\n// \u2705 Step 2: Filter out fake emails that end with file extensions\nconst filteredEmails = allEmails.filter(email => \n  !email.toLowerCase().match(/\\.(png|jpg|jpeg|gif|css|js)$/)\n);\n\n// Step 3: Remove duplicates\nconst uniqueEmails = [...new Set(filteredEmails)];\n\n// Step 4: Return first email or \"N/A\"\nreturn [\n  {\n    json: {\n      email: uniqueEmails[0] || \"N/A\",\n      allEmails: uniqueEmails.length ? uniqueEmails : [\"N/A\"]\n    }\n  }\n];\n"
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "4e16b580-50c8-4a99-8027-21f43913817d",
      "name": "Filter Leads with Email only",
      "type": "n8n-nodes-base.filter",
      "position": [
        1180,
        -520
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "df37d096-dcae-4a0b-9cce-a6c48f482eac",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.email }}",
              "rightValue": "N/A"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "7f10d476-4787-4632-90cb-3b006e8675c3",
      "name": "Database",
      "type": "n8n-nodes-base.airtable",
      "position": [
        1620,
        -520
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appBnug5XIRAWl5sK",
          "cachedResultUrl": "https://airtable.com/appBnug5XIRAWl5sK",
          "cachedResultName": "N8n"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblP5rgq3s76pYsCf",
          "cachedResultUrl": "https://airtable.com/appBnug5XIRAWl5sK/tblP5rgq3s76pYsCf",
          "cachedResultName": "Web Scraper"
        },
        "columns": {
          "value": {
            "Email": "={{ $json.Email }}",
            "Rating": "={{ $json.Rating }}",
            "Website": "={{ $json.Website }}",
            "Category": "={{ $json['Company Category'] }}",
            "Location": "={{ $json.Address }}",
            "Phone Number": "={{ $json['Phone Number'] }}",
            "Business Name": "={{ $json['Company Name'] }}",
            "Other Categories": "={{ $json['Other Categories'].join() }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "Website",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Website",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Business Name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Business Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Category",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Category",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Location",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Phone Number",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Phone Number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Rating",
              "type": "number",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Rating",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Other Categories",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Other Categories",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "upsert"
      },
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "ed41e59c-c9c0-4673-af40-fc2d3f08a2ef",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -460,
        80
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "height": 260,
        "content": "  ## Form Submission\n  **(Lead Input)**"
      },
      "typeVersion": 1
    },
    {
      "id": "4737b43b-d22e-4b7d-ae58-4e279a6167ca",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        80
      ],
      "parameters": {
        "color": 3,
        "width": 800,
        "height": 260,
        "content": "   ## Scrape Business Info (via Apify) and Grab desired fields"
      },
      "typeVersion": 1
    },
    {
      "id": "fde95017-afe6-494e-8752-6498c56fa73f",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        680,
        40
      ],
      "parameters": {
        "color": 3,
        "width": 1780,
        "height": 400,
        "content": "\n   ## Scrape Websites and return markdown"
      },
      "typeVersion": 1
    },
    {
      "id": "e36373c3-0e42-49c6-9981-afe723576463",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        680,
        -340
      ],
      "parameters": {
        "color": 4,
        "width": 1140,
        "height": 360,
        "content": "\n## Extract Emails"
      },
      "typeVersion": 1
    },
    {
      "id": "57abe783-4152-4342-983c-f97ea53cef2a",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1080,
        -620
      ],
      "parameters": {
        "color": 4,
        "width": 660,
        "height": 260,
        "content": "## Filter, Clean, and Store"
      },
      "typeVersion": 1
    },
    {
      "id": "4408295c-b2ac-4207-9e86-079f50e6f051",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -500,
        -520
      ],
      "parameters": {
        "width": 580,
        "height": 420,
        "content": "## \ud83d\udee0 How to Set It Up\n1. **Open n8n** (Cloud or Self-Hosted).\n2. **Import the provided .json** file into your n8n editor.\n3. **Set up the required credentials:**\n   - **\ud83d\udd11 Apify API Key** used for Google Maps scraping)\n   - **\ud83d\udd11 Airtable API Key** (or connect **Google Sheets** instead)\n\n4. ### Recommended:\n   - Prepare your **Airtable** base or **Google Sheets** with fields like: Email, Website, Phone, Company Name.\n   - Review the **Grab Desired Fields** node if you'd like to collect more fields from Apify (e.g., Ratings, Categories, etc.). "
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "6eac21e5-60c7-401b-a761-88a8778b3c59",
  "connections": {
    "Limit": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Database": {
      "main": [
        []
      ]
    },
    "Markdown": {
      "main": [
        [
          {
            "node": "Random Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Random Wait": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "User-Agents": {
      "main": [
        [
          {
            "node": "Website Scraping",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run an Actor": {
      "main": [
        [
          {
            "node": "Get dataset items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "Loop Over Items1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Parse url/website",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Loop Over Items1": {
      "main": [
        [
          {
            "node": "Filter Leads with Email only",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Extract Email Address",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Website Scraping": {
      "main": [
        [
          {
            "node": "Markdown",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get dataset items": {
      "main": [
        [
          {
            "node": "Grab Desired Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse url/website": {
      "main": [
        [
          {
            "node": "Remove Query Parameters & Fragments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "On form submission": {
      "main": [
        [
          {
            "node": "Run an Actor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grab Desired Fields": {
      "main": [
        [
          {
            "node": "Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Grab Desired Fields1": {
      "main": [
        [
          {
            "node": "Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Email Address": {
      "main": [
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Leads with Email only": {
      "main": [
        [
          {
            "node": "Grab Desired Fields1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Query Parameters & Fragments": {
      "main": [
        [
          {
            "node": "User-Agents",
            "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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This n8n workflow collects leads from Google Maps, scrapes their websites via direct HTTP requests, and extracts valid email addresses — all while mimicking real user behavior to improve scraping reliability. It rotates User-Agent headers, introduces randomized delays, and…

Source: https://n8n.io/workflows/6307/ — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Web Scraping

This n8n template demonstrates how to automatically clone and adapt competitor Facebook ads for your own product using AI. Simply provide a Facebook Ad Library URL and your product image, and the work

Form Trigger, HTTP Request, Google Drive +1
Web Scraping

🚀 Instagram Leads Scraper (Perfect for Cold Outreach)

HTTP Request, Form Trigger, Airtable
Web Scraping

Travel agencies, freelance travel planners, or anyone who wants to automate personalized trip planning by combining real-time hotel and flight data with AI-generated recommendations. Collects travel d

Form Trigger, @Apify/N8N Nodes Apify, HTTP Request +4
Web Scraping

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.

Form Trigger, HTTP Request, Form
Web Scraping

Automate LinkedIn lead generation by scraping comments from targeted posts and enriching profiles with detailed data

Form Trigger, HTTP Request, Google Sheets