A static web tool with a minimal serverless-style API that:
- Searches a local JSON index for URLs by keyword
- Fetches each page and extracts emails and names
- Exports results to an Excel (.xlsx) file using SheetJS
No third-party search engines or external APIs are used.
client/ # Static site (index.html, app.js, style.css, index.json)
api/ # Node/Express API for scraping (axios + cheerio)
render.yaml # Render blueprint (static + web service)
- Install API deps:
cd api && npm install- Run API locally (default :3001):
npm start- Serve the static client (any static server). For quick testing:
# from project root
python3 -m http.server 3000 --directory client- Open the app: http://localhost:3000
- Leave API base URL empty if you reverse-proxy; otherwise set it to
http://localhost:3001in the UI. - Edit
client/index.jsonto provide your own keywords and URLs.
client/index.json can be either an array or an object with entries:
[
{ "keyword": "plumber", "urls": ["https://site1/contact", "https://site2/"] },
{ "keyword": "electrician", "urls": ["https://..."] }
]Each urls item should be a fully qualified URL. The UI will cap per-keyword URLs based on the "Max results" field.
- Columns:
Keyword,Name,Email - Downloaded as
extracted_emails.xlsx
This repo includes render.yaml defining two services:
- Web service: Node API in
api/ - Static site:
client/
- Push to GitHub.
- In Render, "New +" → "Blueprint" → connect your repo.
- Review and create resources. Once deployed:
- API URL will look like
https://<api-service>.onrender.com - Static site will be available at its own URL
- API URL will look like
- In the UI, set API base URL to the API service URL.
- The scraper performs simple name inference using nearby text and metadata; results vary by site.
- The API does not return source URLs by design; only
emailandnameare returned. - Respect target website robots and terms; use responsibly.