В этом руководстве мы разберем все доступные способы сбора email-адресов с сайтов: готовые десктопные программы, облачные сервисы и написание собственного скрипта на Python. Это три разных подхода к масштабному сбору почтовых адресов в интернете.
Парсинг (или веб-скрапинг) – это автоматический сбор данных со страниц сайтов в удобный для анализа формат. Поиск email-адресов – один из самых частых сценариев. Их собирают для рассылок, обновления баз контактов, пополнения черных списков (добавления адресов-ловушек) и других задач.
Подробнее об этом можно прочитать в нашей статье о том, что такое парсинг.
А ниже мы подробно разберем техническую сторону вопроса: что именно нужно делать, стоит ли писать свой парсер, какие существуют онлайн-инструменты и какие библиотеки стоит использовать.
Главная цель парсинга email – сбор баз для рекламных и маркетинговых рассылок.
Но здесь есть и риски, так как законы зависят от страны. Например, в ЕС (по правилам GDPR) и Канаде (CASL) на получение маркетинговых писем нужно предварительное согласие пользователя (opt-in). В США правила мягче: закон CAN-SPAM разрешает коммерческие рассылки без предварительного согласия (opt-out), если в письме есть кнопка отписки, реальный физический адрес и честная тема. Единого международного закона нет, а штрафы за нарушения огромные. Здесь мы не даем юридических консультаций, поэтому всегда проверяйте законы тех стран, куда планируете отправлять письма.
Некоторые компании пытаются обойти правила и сознательно нарушают закон. Однако почтовые сервисы отлично распознают такой спам и блокируют подобные рассылки за считанные часы.
Но есть и абсолютно легальные поводы собирать адреса:
Как видите, парсинг – это инструмент не только для спамеров.
Несмотря на популярность мессенджеров, электронная почта остается важнейшим каналом связи. Кроме того, email часто служит логином для большинства сайтов, сервисов и поисковиков. По сути, это ценная контактная информация, и бизнесу выгодно собирать ее в сети.
У email-адреса строгая структура из трех частей:
На сайтах также часто встречаются кликабельные ссылки на почту в виде HTML-тегов: <a href="mailto:EMAIL-HERE">Текст ссылки</a>.
За всем этим стоит целый набор стандартов. Формат адреса строго описан RFC 5321 и RFC 5322. За отправку писем отвечает протокол SMTP, за получение – POP3 и IMAP, а за распознавание домена – DNS.
Чтобы собрать адреса со страницы, нужно проанализировать ее текст или HTML-код и найти совпадения по шаблону. Главный признак email – это символ «@». Можно собрать все слова с «@» и проверить, заканчиваются ли они на известные доменные зоны вроде .com или .net. Но на практике чаще всего используют регулярные выражения (regex).
Это самый популярный способ, так как все адреса строятся по схеме имя@домен.зона. Модуль re в Python может просканировать сырой HTML-код и за мгновение выдать все совпадения.
В реальности все складывается сложнее. Чтобы проанализировать страницу, ее нужно сначала загрузить. Сегодня сайты часто используют Ajax (подгрузка контента на лету) или полностью рендерятся через JavaScript. То есть финальный HTML-код собирается прямо в браузере.
Поэтому для парсинга часто нужен полноценный браузер, который сначала отрисует страницу. Браузеры, которыми можно управлять через код, называются headless-браузерами (без графического интерфейса). А если нужно парсить данные из-под разных аккаунтов, используют антидетект-браузеры.
Еще одна сложность: некоторые сайты прячут исходный код и блокируют средства отладки. Тогда приходится делать скриншоты и распознавать текст с помощью компьютерного зрения.
Крупные ресурсы борются с ботами. Они проверяют поддержку JavaScript, анализируют паузы между запросами и сверяют IP-адреса со списками спамеров. К слову, вот статья о том, как избежать частых ошибок при парсинге.
Неудивительно, что разработчики создали множество готовых сервисов, программ и библиотек для сбора email-адресов. Разберем основные методы.
На рынке есть множество специализированных программ, устанавливаемых на компьютер:
Мы перечислили только самые популярные решения, которые регулярно обновляются.
Главный минус таких программ – отставание от алгоритмов поисковиков, что мешает при поиске свежих сайтов для сканирования. Вторая проблема – они плохо справляются с динамическими сайтами, так как внутри нет встроенного браузера, и страницы на JavaScript выдают ошибки.
Зато плюсы налицо: это готовые решения, которые быстро ищут контакты и сохраняют их в удобном формате. Но при масштабном парсинге вам придется обходить блокировки, поэтому такие программы бесполезны без прокси-серверов. Как правило, в них можно загружать списки прокси, а встроенные менеджеры сами отсеивают нерабочие IP.
Есть и готовые онлайн-сервисы. Одни продают доступ к уже собранной базе адресов (Hunter, ZoomInfo, Skrapp, Findymail, AeroLeads), другие – это полноценные онлайн-парсеры, которые собирают свежие данные под ваш запрос. Удобно тем, что ничего не нужно ставить и настраивать, а прокси уже встроены.
Но есть важная оговорка. У стороннего сервиса вы не видите, как именно он собирает данные и насколько это законно в вашем случае. Когда вы пишете собственный скрипт (см. ниже), вы контролируете источники, объем и темп – и можете выстроить весь процесс так, чтобы он оставался в рамках закона.
Если же нужен готовый вариант, мы рекомендуем скраперы Froxy: данные с маркетплейсов и поисковиков, без блокировок по IP, в любых регионах, с расписанием и уведомлениями по вебхукам.
Готовые скраперы для маркетплейсов и поисковиков. Без блокировок по IP, в любых регионах, с расписанием и уведомлениями по вебхукам.
Свой скрипт стоит писать, если у вас есть время и навыки для его поддержки. Плюс в том, что вы ни от кого не зависите, можете добавлять любые функции (обработку JavaScript, ротацию прокси) и собирать данные откуда угодно. Но прокси покупать все равно придется.
Свой скрипт отдает в в вашу ответственность и юридическую сторону. Вы сами решаете, какие сайты обходить и что собирать: можно уважать robots.txt и правила сайта, не трогать персональные данные, на обработку которых нет законного основания, ставить паузы между запросами и хранить только публичные рабочие контакты. Сторонний сервис прячет эти решения от вас, а собственный код делает их явными. Это по-прежнему не юридическая консультация: что и как можно собирать и использовать, зависит от вашей юрисдикции и законов о персональных данных вроде GDPR.
Шаги для создания парсера на Python:
У email стандартный формат, который легко поймать:
pattern_email = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}')
Окончание {2,} крайне важно. Если поставить {2,4} (как делали раньше), скрипт пропустит длинные доменные зоны вроде .online, .agency или .international. Подобные шаблоны поиска часто используют для проверки форм регистрации на сайтах. Подробности можно найти в официальной документации Python по модулю re.
Установим нужные библиотеки:
pip install httpx beautifulsoup4
Поиск всех ссылок формата mailto выглядит так:
matches_email = soup.find_all("a", attrs={"href": re.compile("^mailto:")})
А вот так можно искать совпадения по всему тексту страницы:
pattern_email = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}')
matches_email = re.findall(pattern_email, page_html)
Имейте в виду: поиск по всему тексту страницы работает медленнее и потребляет больше ресурсов.
Вот как выглядит полноценный скрипт на Python:
import httpx
from bs4 import BeautifulSoup
import re
import json
# Запускаем запросы через ротируемые прокси Froxy, задаем User-Agent и таймаут.
# Без User-Agent многие сайты вернут ошибку 403.
client = httpx.Client(
proxy="http://user:pass@proxy.froxy.com:8080", # 8080 – порт прокси
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"},
timeout=30,
)
def parse_site(main_url: str):
links = []
response = client.get(main_url)
response.raise_for_status() # Выбросить ошибку при 403/404, чтобы не парсить страницу с ошибкой
bssoup = BeautifulSoup(response.text, "html.parser")
# Ищем ссылки на все страницы сайта
for link_box in bssoup.select("div.info-section.info-primary"):
a = link_box.select_one("a")
if a is None: # Пропускаем блоки, не подходящие по структуре
continue
# Формируем полные ссылки
link = "https://www.your-site.com" + a.attrs["href"]
links.append(link)
return links
def parse_emails(links: list):
emails = {}
for link in links:
# Отправляем GET-запрос по каждой ссылке
page_response = client.get(link)
page_response.raise_for_status()
bssoup = BeautifulSoup(page_response.text, "html.parser")
# Ищем название компании, если его нет – ставим заглушку unknown
name_node = bssoup.select_one("h1.dockable.business-name")
company_name = name_node.text if name_node else "unknown"
# Находим все mailto-ссылки и вытаскиваем из них адреса
for mailto_link in bssoup.find_all("a", attrs={"href": re.compile("^mailto:")}):
email = mailto_link.get("href").replace("mailto:", "")
# Записываем email к соответствующей компании
if company_name not in emails:
emails[company_name] = []
emails[company_name].append(email)
return emails
# Собираем ссылки на страницы
links = parse_site("https://www.your-site.com/target-page.html")
# Собираем email-адреса
emails = parse_emails(links)
# Выводим результат в JSON
print(json.dumps(emails, indent=4))
client.close()
Скрипт собирает адреса из атрибутов mailto и привязывает их к названиям компаний – получается готовая база контактов. Вставьте свои данные от прокси Froxy, и IP-адреса будут меняться при каждом запросе.
В этом примере название компании берется из конкретного HTML-класса. Если у сайта другая структура, теги в коде придется заменить. Мы используем метод select_one, чтобы скрипт не падал с ошибкой при отсутствии тега, а просто пропускал его. Функция raise_for_status() нужна, чтобы вовремя заметить блокировку (код 403 или 404). За разбор структуры тегов отвечает библиотека BeautifulSoup.
Помимо HTTPX и BeautifulSoup, можно использовать:
В связке Scrapy и Playwright решают любые задачи: от огромных статических сайтов до тяжелых JavaScript-приложений.
Владельцы сайтов знают о парсерах и активно защищают контакты. Среди методов защиты:
Это дополнение к классическим мерам: блокировке подозрительных IP и скрытым ссылкам-ловушкам.
Сбор данных – это только половина дела, адреса еще нужно проверить на актуальность:
Резидентные прокси с ротацией для сбора данных по всему миру.
Независимо от того, используете вы готовые программы или пишете код сами, вам понадобятся прокси-серверы. Без промежуточных IP-адресов целевой сайт быстро заблокирует вам доступ.
Самая надежная связка для масштабного парсинга: резидентные прокси с ротацией + headless-браузер + сервис для валидации адресов.
Арендовать качественные резидентные и мобильные прокси можно у Froxy. Вы платите только за потраченный трафик, а менять IP-адреса можно бесконечно (даже при каждом запросе). В нашем пуле более 120 миллионов адресов с возможностью таргетинга до города и провайдера.