Contact emails from a list of company websites

A list of companies goes in, a CSV with ranked contact addresses comes out, with a status on every row so a failed site is visible rather than silently missing.

Problem
A prospect list (for example an export from Google Maps) has company names and websites but no email addresses. Finding them by hand takes minutes per company.
What runs
A batch over a CSV of companies and URLs, with parallel workers.
How it is watched
Every row carries a status and an error column, so the output says which sites failed and why.
Stack
Python, built on the open-source WebExtractor, extended with batch input, ranking and filtering.
Code
Private fork of an MIT-licensed tool. A walkthrough is available on request.

The problem

Outreach starts with a list, and lists rarely come with contact details. Opening each website, looking for a contact page and copying an address is slow, and the copy-paste errors only show up as bounces.

What it does

  • Reads a CSV with company and url columns and visits each site with a configurable number of workers.
  • Normalises the text before matching, so addresses written with unusual characters are still found.
  • Drops false positives that look like email addresses but are not, such as retina image filenames like logo@2x.png.
  • Ranks what it finds and writes company, url, status, email_1, email_2, email_3, error, one row per company.

It started from WebExtractor, an MIT-licensed single-page tool. The batch mode, ranking and filtering are my additions.

How it stays under control

A batch tool fails quietly unless it is made not to. Here every input row produces an output row, with status and error filled in, so "no email found", "site down" and "blocked" are three different answers you can act on.

It collects only addresses a business has published on its own website, and it should only be pointed at sites whose terms allow it. Using the results for outreach is subject to the same data protection rules as any other prospect list.

What a business could reuse from this

Enriching lead lists, building supplier or partner directories, checking that a list of locations still has working websites. The shape is always the same: list in, verified columns out, failures named.

Want something like this, built around your process?

Tell me what happens today and how often. A few sentences are enough.

Describe a process