Напомним, парсинг (веб-скрапинг) – это сбор и преобразование данных, размещённых на страницах сайтов, в данные, нужные для анализа и дальнейшей работы. Парсинг email с сайтов – достаточно частая задача. Адреса электронной почты могут потребоваться для рассылок, для актуализации базы контактов, для пополнения чёрных списков (ящиков-ловушек), а также для многих других целей.
Отдельный материал по теме – что такое парсинг.
Ниже расскажем о технических нюансах процесса скрейпинга: как и что нужно делать, есть ли смысл писать свой email-парсер, существуют ли готовые онлайн-инструменты, какие библиотеки и сервисы вам могут пригодиться.
Поехали.
Наиболее востребованный пример практического применения email-грабберов – это создание баз для проведения рекламных (маркетинговых) рассылок.
Однако, именно здесь кроется больше всего проблем. Рассылки без согласия пользователей запрещены. Если компания будет уличена в таком нарушении, то ей может грозить серьёзный штраф. Такая практика применяется во всех развитых странах.
Тем не менее, предприниматели пытаются сэкономить на создании полноценных маркетинговых кампаний и сознательно идут на преступление. Популярные почтовые сервисы давно научились выявлять такие рассылки и быстро блокируют их или помечают как спам.
Есть и более адекватные кейсы применения email-парсеров:
Парсинг не всегда связан со злобными хакерами и спамом.
Email – это адрес электронной почты. Несмотря на повсеместное использование мессенджеров и социальных сетей, email остаётся одним из самых востребованных каналов связи. Плюс, email-адреса заменяют собой идентификаторы клиентов в популярных поисковиках, на сайтах и в онлайн-сервисах.
Но изначально, email – это контактная информация. Естественно, бизнесу очень интересно собирать в сети новые контакты.
Email-адреса имеют определённую структуру. В составе email имеется сразу три компонента:
Иногда можно встретить кликабельные ссылки с email, они организуются за счёт специальных атрибутов на уровне HTML-кода – <a href="mailto:ЗДЕСЬ-EMAIL">Тут текст ссылки</a>.
Для email-адресов даже есть сборник специальных стандартов, которые описывают все технические детали и ограничения – это серия RFC-стандартов, касающихся DNS, POP3, SMTP и IMAP-протоколов.
Соответственно, чтобы найти на странице все email-адреса, нужно проанализировать текст (или исходный HTML-код) страницы и вычленить подходящие участки по специальному паттерну.
Как можно заметить, самый яркий атрибут email – это символ @. Не менее интересна привязка домена. Например, все слова, включающие знак @ можно анализировать на включение известных доменных зон, например, .com, .ru, .net и пр. Найденные строки и будет email-адресами. Но это уже высший пилотаж. Чаще всего достаточно просто проверки регулярным выражением.
Но легко сказать, гораздо сложнее всё сделать на практике. Ведь, чтобы начать анализировать содержимое страниц, нужно ещё получить к ним доступ. А большинство современных сайтов использует продвинутые Ajax-технологии (с подгрузкой в ответ на действия пользователя) или вообще всё содержимое рисует с помощью JavaScript, то есть формирует итоговый HTML непосредственно в браузере (из разных кусков и скриптов).
В результате: нужно использовать полноценный браузер, чтобы загрузить страницу и только потом парсить контент. Специальные браузеры, которые можно автоматизировать и подключать к своим парсерам, называются headless-браузеры. Если нужно работать параллельно с большим числом аккаунтов, например, в пределах одного сайта или веб-сервиса, то нужны уже антидетект-браузеры.
Ну и ещё камень вдогонку – некоторые сайты и web-приложения могут запрещать отладку, а также блокировать отображение исходного кода. Тут может потребоваться создание скриншотов и полноценное компьютерное зрение (про скрапинг экранов).
Крупные проекты не любят паразитной нагрузки и оперативно выявляют автоматически обращения к страницам. Это целая наука. Кто-то проверяет поддержку JavaScript, кто-то анализирует время между запросами, кто-то прогоняет IP по спам-базам и чёрным спискам, и т.п.
Отдельно: как избежать наиболее частых ошибок при парсинге и делать всё как профи.
Получается, что простейшая задача по поиску текстовых паттернов уже не выглядит такой уж и простой.
Неудивительно, что разработчики создают специальные web-сервисы для вычленения email (онлайн-парсеры email), плагины для браузеров, самостоятельные десктопные программы, серверный софт, библиотеки, фреймворки, предоставляют отдельные API и прочее.
Ниже поговорим о типовых способах парсинга email.
К готовым нишевым решениям можно отнести следующий специализированный софт:
И т.п. Список софта может быть очень большим. Мы привели продукты, которые упоминаются чаще других и регулярно получают обновления.
Основная проблема любого софта для парсинга – потеря совместимости с поисковой выдачей, чтобы подбирать ресурсы, подлежащие сканированию. Не менее насущный минус – отсутствие поддержки динамических сайтов. Почти всегда под капотом нет встроенного headless-браузера, что приводит к массе ошибок при попытке загрузки сайтов, использующих JavaScript.
Из очевидных плюсов: это быстрое и готовое решение, которое умеет искать email и выгружать их в удобном формате.
Но чем больше потоков сканирования вы хотите запустить, тем выше потребность в способах для обхода блокировок. Соответственно, без интеграции прокси такой софт обычно не работает. Почти всегда имеется интерфейс для загрузки больших списков прокси или встроенный прокси-менеджер (для ротации неработоспособных адресов и для проверки их валидности).
Тут можно выделить две дополнительные подкатегории: сервисы, которые уже собрали свою базу email-адресов и готовые поделиться ею с вами за дополнительную плату, а также сервисы, которые могут спарсить нужную вам информацию, чтобы потом отдать вам только обработанный результат.
К первому типу онлайн-сервисов можно отнести: hunter (это огромная база email-адресов корпоративной почты), zoominfo (аналог), skrapp, Findymail (позволяет проверять адреса по базе контактов LinkedIn), AeroLeads и т.п.
Почти всегда такие сервисы имеют кучу звёздочек и примечаний в условиях использования. Они работают по модели посредника и снимают с себя все потенциальные риски, связанные с незаконными рассылками. Их основная задача – проверить email на существование, то есть повысить шансы успешности вашего контакта. Какими бы большими ни были их базы, они не могут объять необъятное. Почти всегда это небольшой срез в определённом сегменте или по конкретному сайту/площадке.
Второй тип онлайн-парсеров email – это реальные парсеры, какими они и должны быть. Их преимущества очевидны: вам не нужно самому ничего устанавливать, настраивать, интегрировать, следить за ошибками, обходить системы защиты и т.п. Здесь даже прокси уже встроенные.
Наиболее доступный нам пример – набор парсеров Froxy. У нас в ассортименте есть решения для скрапинга популярных eCommerce-площадок, социальных сетей и поисковиков. Никаких блокировок по IP, любые локации и регионы. Можно создавать задания по расписанию и получать оперативные уведомления о завершении процесса по web-хукам.
Этот подход идеален, если у вас есть силы и ресурсы для поддержания своего скрипта. Основные плюсы: всегда работоспособный код, который оперативно можно доработать и улучшить, поэтому вы никогда не останетесь в ожидании доработок со стороны нерасторопных разработчиков софта. Вы можете парсить любые сайты и сервисы, оптимизировать парсер и добавлять ему поддержку любых технологий, в том числе ротацию прокси, работу с JavaScript и т.п.
Из минусов только то, что потребуются профильные знания и навыки. Естественно, без прокси тут тоже никак не обойтись.
Ниже рассмотрим пример того, как парсить email с помощью своего собственного парсера, написанного на Python.
Как и упоминалось выше, email-адрес имеет определённую структуру. Она выглядит вот так: логин@домен.зона.
В ру-сегменте допускается использование кириллических символов. Но в примере ниже мы разберём использование только латиницы (для упрощения и для наглядности, чтобы не усложнять код).
Выявление текстовых паттернов лучше всего реализуется за счёт regex-выражений.
Для email на латинице регулярное выражение будет выглядеть следующим образом:
pattern_email = re.compile(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})')
Кстати, web-разработчики часто используют его для предварительной проверки форм, чтобы пользователи не вводили туда непонятно что.
За подробностями по функции re.compile() можно обратиться к официальной документации Python.
Чтобы задействовать парсинг HTML-документа в Python, нам нужно добавить библиотеки BeautifulSoup4 и HTTPX.
Для этого используем установщик pip:
pip install httpx bs4
Как будет выглядеть код для поиска всех ссылок mailto:
matches_email = soup.findAll("a", attrs={"href": re.compile("^mailto:")})
А так будет выглядеть поиск по всему коду, без ссылок mailto:
pattern_email = re.compile(r'([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})')
matches_email = re.findall(email_pattern, page_html)
Обратите внимание: операция прямого поиска без привязки к ссылкам будет выполняться дольше и будет потреблять больше ресурсов.
Фактически, строки выше – это ядро всех последующих операций парсинга.
Вот так может выглядеть пример итогового скрипта на Python:
import httpx
from bs4 import BeautifulSoup
import re
import json
def parse_site(main_url: str):
links = []
response = httpx.get(url=main_url)
bssoup = BeautifulSoup(response.text, "html.parser")
# Собираем список всех страниц сайта
for link_box in bssoup.select("div.info-section.info-primary"):
# Извлекаем ссылки, найденные на каждой странице, и добавляем к главному URL сайта
link = "https://www.your-site.com" + link_box.select_one("a").attrs["href"]
links.append(link)
return links
def parse_emails(links: list):
emails = {}
for link in links:
# Отправляем GET запрос к каждой новой ссылке в списке
page_response = httpx.get(url=link)
bssoup = BeautifulSoup(page_response.text, "html.parser")
# Достаём название компании (имя контакта)
company_name = bssoup.select_one("h1.dockable.business-name").text
# Находим все ссылки mailto и копируем из них текст с мылом
for link in bssoup.findAll("a", attrs={"href": re.compile("^mailto:")}):
# Достаём email-адреса из тегов с mailto
email = link.get("href").replace("mailto:", "")
# проверяем наличие компании в списке адресов и если записи ещё нет, то создаём новую
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")
# Собираем все имейлы на странице
emails = parse_emails(links)
# выводим результат в JSON формате
print(json.dumps(emails, indent=4))
В данном случае собираются все адреса, имеющие ссылку с атрибутом mailto. В списке будет выводиться email с названием компании, которой принадлежит электронная почта. Это будет своего рода готовая база контактов.
Имя компании берётся из контейнера с описанием. В нашем случае обращение к контейнеру определяется серией специальных тегов. Поэтому, если структура вашей целевой страницы не совпадает, а это так и будет на новом сайте, нужно найти и актуализировать текущие теги, чтобы скрипт заработал.
В нашем скрипте анализом структуры тегов занимается библиотека BeautifulSoup (официальная документация к ней).
Вам могут понадобиться и другие библиотеки для парсинга на Python.
Команды разработчиков, которые знают о том, что их страницы будут парситься на предмет поиска email-адресов, могут предпринимать дополнительные попытки защиты. К ним относятся:
И это, не считая стандартных схем защиты от парсинга: динамический код (подгрузка при помощи Ajax), блокировка автоматических запросов с одного IP, использование ссылок-ловушек и прочего.
Но мало просто спарсить email, важно проверить качество и работоспособность почтовых ящиков. Какие ещё практики есть в email-парсинге?
Как можно было заметить, все программы (профильный софт), а также самописные скрипты парсинга требуют интеграции с прокси-серверами. Если не пускать запросы через IP посредников, очень быстро можно схватить бан и попасть в чёрный список. Соответственно, парсинг целевого сайта становится невозможным.
Найти качественные резидентные и мобильные прокси можно в сервисе Froxy. Оплачиваются не конкретные IP-адреса, а только потребляемый трафик. Соответственно, ротировать IP можно бесконечно, хоть при каждом новом запросе.
Пул адресов Froxy – свыше 8,5 млн. IP. Точность подбора – до нужного города и оператора связи.
Плюс, у нас его готовые онлайн-парсеры, где оплачиваются только успешные запросы к целевым сайтам. Не нужно ничего устанавливать и подключать. Останется только скачать результаты скрапинга и заняться их дальнейшей обработкой.