Introduction
Bulk website contact extraction pulling emails, phone numbers, and social media links from a list of company domains is one of the most common B2B data tasks. The naive implementation using HTML parsing (Cheerio, BeautifulSoup) is fast but has a fundamental blind spot: it cannot see contact data that loads via JavaScript. The Website Contact Scraper by Techforce Global addresses this with Playwright (headless Chromium), which renders every page fully before extraction and returns a single consolidated, deduplicated record per domain with emails, phones, social links, and a transparent summary count. This guide covers the technical approach, input/output structure, and a complete n8n pipeline for automated CRM enrichment.
Why HTML Parsing Fails on Modern Websites
When a browser loads a modern website, two events happen: the server delivers the initial HTML, then JavaScript executes and renders additional content. HTML parsers like Cheerio process only the first event. Contact sections built with React, Vue, or Angular components render in the second event and are completely invisible to them.
Playwright runs a real Chromium browser, completes both events, and extracts from the final rendered DOM. This is the same approach used by enterprise contact discovery tools — applied here to bulk URL processing on Apify.
How the Website Contact Scraper Works
Step 1 : Playwright Crawler with Full JS Rendering
Each URL gets a headless Chromium browser instance. The actor waits for full page load including JavaScript execution before extraction begins. No timeout shortcuts. Full render, then extract.
Step 2 : Contact Page Auto-Discovery
From the root page, the actor scans all href links for contact-related URL patterns: /contact, /about, /team, /impressum, /kontakt. These pages are always crawled first regardless of depth position they are the highest-value pages for contact data.
Step 3 : Multi-Source Extraction
Emails: two extraction passes raw HTML attributes (mailto: links) and visible rendered text. Phone numbers: visible text only, which is more accurate for formatted international numbers. Social links: matched against platform URL patterns, grouped by platform name in the output object.
Step 4 : Consolidation Per Domain
All data from all pages crawled for a domain is merged, deduplicated, and returned as one record. Summary counts computed. scannedPages list assembled. Status set to success or no_data_found.
Input Configuration
{ "urls": [{ "url": "https://stripe.com" }, { "url": "https://notion.so" }], "maxPagesPerDomain": 10, "maxConcurrency": 5 }
Output Schema Complete Reference
n8n CRM Enrichment Pipeline 7 Steps
- Google Sheets Trigger : fires when new domain URLs added to column A of your prospect sheet
- HTTP Request : POST to Apify API to start Website Contact Scraper with new URLs
- Wait/Poll : every 60 seconds until run = SUCCEEDED
- HTTP Request : GET results from Apify dataset API
- Filter : status = 'success' AND summary.emailCount >= 1
- HubSpot : create or update contacts with extracted emails and social profiles
- Google Sheets : write enriched data back to master sheet
The consistent one-record-per-domain output means the HubSpot node requires no conditional field mapping same schema regardless of how many pages were crawled per domain.
Getting Started
- Go to the Website Contact Scraper on Apify
- Click 'Try for Free'
- Paste your URL list maxPagesPerDomain: 10 recommended
- Enable Apify Proxy for bot-protected sites
- Click Run results in 1–5 minutes depending on URL count
Actor: https://apify.com/techforce.global/website-contact-scraper-emails-phone-numbers-social-links
Consultation: https://calendly.com/techforce-infotech-pvt-ltd/intro-meeting
Website: https://techforceglobal.com






Top comments (0)