Розробка парсера контактних даних з відкритих джерел

Контакти постачальників і клієнтів збирають вручну тижнями, і на момент вивантаження частина полів уже застаріла. Ми розробляємо парсер контактних даних під ключ: розбираємо ваші джерела, налаштовуємо збір і віддаємо готовий реєстр — час на підготовку бази скорочується в рази.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка парсера контактних даних з відкритих джерел
Середній
~3-5 днів
Часті запитання

Чому парсер контактних даних ламається на живих джерелах

Живе відкрите джерело — не статична сторінка, а система, яка змінює розмітку без попередження: перейменували блок, додали обгортку, винесли пошту в підвантажуваний фрагмент.

Парсер контактних даних при цьому не падає — він повертає порожні картки, і обхід формально завершується успішно. Помилку помічають пізніше, на обдзвоні: у реєстрі не вистачає половини адрес, а логи виглядають чистими.

Далі починається нормалізація полів. Один і той самий номер приходить як «+7 (900) 000-00-00», «8 900 000 00 00» і «9000000000», пошта — з пробілом або великими літерами, посада злипається з назвою відділу в один рядок.

Без явних правил приведення значень дедуплікація за збігом рядків не працює, і одна людина потрапляє в базу два-три рази.

Блокування та ліміти додають другий шар відмов. Захист від автоматичного обходу ріже часті звернення, віддає замість сторінки заглушку або перевірку і змінює форму відповіді при тій самій адресі.

Парсер, який не розрізняє «контактів справді немає» і «нас відсікли на час», продовжує писати в реєстр порожні записи — на виході виходить обсяг, за яким немає даних.

Ціна таких відмов рахується не у відсотках, а в ручних годинах: оператор перевіряє записи, вичищає дублі та додзвонюється по неробочих каналах.

Стабільний збір контактів з відкритих джерел тримається не на одному вдалому запиті, а на контролі змін розмітки, явних правилах нормалізації та розборі відмов доступу. Далі розбираємо, як це закривається.

Що дає акуратний збір: швидкість, повнота, точність полів

Ручний обхід джерел впирається в арифметику: на картку йде хвилина-дві, за зміну набігає кілька сотень записів, і кожну переносять у таблицю руками. Звідти — одруки в номерах, різні формати запису одного телефону та дублі, які спливають вже на обдзвоні.

Список джерел і правила обходу задаються конфігурацією, а сторінки розбираються за структурою документа, а не за «приблизним» розташуванням блоків.

Якщо на сторінці є розмітка schema.org у структурованому вигляді, контакти беруться з неї напряму — без евристик по верстці, які ламаються при першому редизайні.

Зібране приводиться до єдиної схеми: телефони нормалізуються до одного формату і перевіряються за контрольною сумою, поштові адреси — за синтаксисом, дублі схлопуються за складеним ключем «організація + контакт».

На виході не сирий набір рядків, а реєстр, де запис валідний за побудовою. Повторний прогін оновлює лише змінені картки, тому актуальність підтримується без повного перезбирання.

За нашими вимірами виграш за швидкістю збору — восьми-десятикратний: обсяг, який при ручному обході розтягується на тижні, закривається за зміну.

До реєстру доходить понад дев'яносто відсотків карток, де контакти взагалі опубліковані, а ручних правок після імпорту залишаються одиниці відсотків — помилки введення перестають виникати на вході.

Режими збору: розбір розмітки, програмний інтерфейс, вивантаження

Три режими отримання даних не замінюють один одного: на одному наборі джерел працює один, на іншому — другий.

Вибір залежить від того, чи віддає джерело дані машинно, чи є в нього готове вивантаження і наскільки стабільна розмітка його сторінок — під кожен набір джерел підбирається свій режим.

Нижче — три режими і те, де кожен упирається в стелю.

Режим Коли підходить Обмеження
Розбір розмітки Джерело не віддає дані машинно, але контакти лежать на відкритих сторінках Ламається при зміні верстки; потрібні свої правила обходу та обмеження частоти звернень на кожен шаблон сторінки
Програмний інтерфейс Джерело публікує офіційний канал отримання даних і відкриває до нього доступ Ліміти запитів і добові квоти, частина полів не віддається взагалі, схема відповіді змінюється з боку джерела
Готове вивантаження Джерело саме публікує файл або архів з контактами Періодичність задає джерело, формати та структура різні, вибрати тільки потрібні поля не можна — розбираємо весь обсяг

На практиці набір джерел майже завжди змішаний, тому режими комбінуємо: де є програмний інтерфейс — ідемо через нього, решту закриваємо розбором розмітки, а рідкісні майданчики — готовим вивантаженням.

Ліміти запитів і правила обходу за кожним джерелом тримаємо в окремій конфігурації, а не в коді: правка при зміні верстки або квоти не вимагає перезбирання, а статистика за режимами показує, де просів відсоток зібраних контактів. Коли джерело змінює правила гри, режим за ним перемикається — інші продовжують працювати без змін.

Як ми ведемо впровадження: від аудиту джерел до передачі

Впровадження йде етапами, і кожен закінчується артефактом, який можна перевірити. Проєкт не перетворюється на чорну скриньку: видно, звідки приходять дані, за якими правилами збираються і як контролюється якість.

  1. Аудит джерел. Зводимо майданчики в таблицю: обсяг видачі, умови використання, наявність відкритого програмного інтерфейсу, стабільність верстки. Джерела без прав на збір відсіюємо відразу — інакше обхід доведеться переписувати.
  2. Схема обходу. Черга запитів з обмеженням частоти, обхід пагінації, повторні спроби при збоях. Для сторінок з динамічною відрисовкою — рендер, для каталогів — обхід за списками розділів і карток.
  3. Витяг полів. Контакти дістаємо за контекстом блоку, а не за всім текстом сторінки: значення з шапки картки і з рекламного блоку — різні сутності.
  4. Нормалізація. Телефони — до єдиного формату з кодом країни, пошти — до нижнього регістру, адреси — до структури регіон/місто/вулиця. Дублі склеюємо за складеним ключем.
  5. Перевірка на еталонній вибірці. Контрольний набір розмічаємо вручну і звіряємо: частка правильних значень, частка пропусків, хибні спрацювання. Нижче порогу правимо правила, а не добираємо обсяг.
  6. Передача в роботу. Віддаємо код, конфігурації джерел, розклад запусків і звіт за якістю. Показуємо вашим інженерам, як підключити нове джерело і розібрати збій.

Далі — підтримка: регулярні прогони, оповіщення при падінні частки валідних записів і оновлення правил під зміни верстки.

Що залишається у вас: конфігурації, схеми, регламенти, доступи

Передаємо не «працюючий скрипт», а набір артефактів, за якими парсер контактних даних можна запускати, перевіряти і розвивати без нас. Кожен пункт проходить приймання на вашій стороні: ми показуємо, де він лежить, як ним користуватися і що станеться при зміні розмітки джерела.

  • Робочі конфігурації — правила розбору за кожним джерелом, розклад, затримки між запитами, обмеження паралелізму, повторні спроби при збоях і перелік адрес, з яких іде обхід.
  • Схема джерел — карта, де за кожним джерелом вказано тип, спосіб доступу, частоту оновлення, набір полів, що витягуються, і типові зміни розмітки, які ламають розбір.
  • Права доступу та правовий режим — які джерела відкриті для збору, обмеження за частотою звернень, окремі облікові записи для сервісу, ключі в захищеному сховищі, а не в коді і не в логах.
  • Модель даних і нормалізація — приведення телефонів, пошти та адрес до єдиного вигляду, правило дедуплікації записів, пріоритет полів при розбіжності даних між джерелами.
  • Регламент запуску — робота за розкладом або на вимогу, порядок перегляду звіту про прогін, дії при блокуванні джерела та точки ескалації всередині вашої команди.
  • Документація — опис полів і форматів вивантаження, приклади запитів, інструкція з підключення нового джерела правкою конфігурації, без зміни коду.
  • Перевірки та моніторинг — еталонна вибірка з очікуваним результатом, сигнал при падінні частки успішних розборів, журнал змін конфігурацій з можливістю відкату.

Далі сервіс живе за вашим регламентом: оновлення правил при зміні розмітки, додавання джерел, ротація доступів. Якщо знадобиться допомога — підключимося до вже задокументованої системи, а не до чужого коду без опису.

Кейс: реєстр за каталогом постачальників, метрики до та після

Що було і що змінили

У замовника — каталог постачальників промислового обладнання на кілька тисяч позицій, а контакти відділів закупівель збирали вручну: два співробітники обходили сайти і переносили дані в таблицю.

На сотню карток йшов майже робочий день, при повторному обході до третини записів виявлялися застарілими, а частина компаній у реєстр не потрапляла взагалі. Повноту ніхто не вимірював — втрачені позиції просто не помічали.

Зібрали парсер контактних даних з відкритих джерел: обхід каталогу за розділами та витяг полів з розмітки сторінок через Schema.org там, де вона є, і за контактними блоками — де її немає.

Кожен запис зберігає адресу джерела та дату збору, дублі склеюються за доменом і назвою компанії, спірні збіги йдуть у чергу на ручну перевірку. Обхід іде за розкладом, тому реєстр оновлюється, а не збирається заново щоразу.

Метрики до та після

Повний прогін за каталогом займає близько двох годин проти тижнів ручної вибірки, від співробітників залишається тільки перевірка звіту. Повнота реєстру виросла з 71% до 96% — різницю показав звіряльний прогін за контрольною вибіркою компаній.

Частка дублів впала з 18% до 2%, у 100% записів є підтверджене джерело, а зниження ручної праці видно за кількістю правок після кожного обходу.

Де парсер поступається програмному інтерфейсу і чому?

Програмний інтерфейс виграє там, де він є і покриває потрібні поля. Джерело віддає дані в узгодженому вигляді: структура відповіді описана, поля підписані, ліміти звернень відомі з документації. Поки це так, розбір розмітки — зайвий шар, який додає тільки точки відмови.

Розбір розмітки надійніший у зворотній ситуації: інтерфейсу немає взагалі, він закритий платним тарифом, обмежений за кількістю звернень або віддає урізаний набір полів. Тоді публічні сторінки — єдиний доступний канал, і дані знімаються звідти з приведенням до своєї схеми.

Ціна такого рішення — залежність від верстки джерела. Зміна шаблону або редизайн ламають правила розбору, тому потрібні регулярні перевірки, контроль порожніх вибірок і сигнал про падіння частки знайдених контактів. Інтерфейс ламається передбачувано — кодом помилки у відповіді, а не тихою втратою даних.

Обмеження джерел впливають на вибір не менше. Капча, блокування за адресою та за поведінкою, вимога авторизації змушують вести розбір повільно, з паузами, інакше джерело починає віддавати заглушки. У програмного інтерфейсу ті самі рамки виражені явно — лімітом звернень за одиницю часу.

Тому підхід обираємо від задачі. Спочатку перевіряємо, чи є програмний інтерфейс і чи закриває він потрібні поля; якщо так — будуємо на ньому. Якщо ні або він вузький — розбір розмітки, але з прошарком нормалізації, щоб зміна джерела не руйнувала весь контур. Найчастіше виходить гібрид: інтерфейс дає основний обсяг, розбір добирає те, чого не вистачає.

Технічні сумніви: якість полів, блокування, повтори

Сумніви щодо якості даних виникають раніше, ніж починається розробка, і це нормально: від відповідей залежить і схема зберігання, і обсяг підтримки. Нижче — три питання, які задають найчастіше, і як вони закриваються в коді, а не на словах.

Звідки беруться дублі та застарілі записи?

Порівнюємо не рядок цілком, а нормалізований ключ: телефон приводиться до єдиного вигляду, домен пошти — до нижнього регістру, компанія — до канонічної назви. Збіг за ключем плюс поріг схожості назви відправляє запис на злиття, а не в базу.

Застарілі записи не видаляються: у контакту з'являється позначка останнього підтвердження, і якщо він не зустрічається в джерелах за заданий період, позначається як неактуальний — історія зберігається.

Що буде при зміні розмітки сайту-джерела?

Правила витягу полів винесені в окремі конфігурації, тому правка займає години, а не переписування парсера.

Кожен прогін рахує частку розпізнаних полів — падіння нижче порогу піднімає сигнал, і про зміну ми дізнаємось раніше, ніж замовник відкриє вивантаження з порожніми колонками. Сторінки, які домальовуються скриптами, обробляються через Playwright.

Як обмежити охоплення та підтвердити точність?

Охоплення задається списком джерел, регіонами та тематикою — збір іде не по всьому інтернету. Точність підтверджується контрольною вибіркою: частина записів перевіряється вручну, і у звіт потрапляє частка підтверджених телефонів і адрес, а не загальна кількість рядків.

Обговоримо задачу: зберемо схему збору під ваші джерела

Щоб повернутися з оцінкою обсягу, а не із загальними словами, нам потрібні ввідні по вашій задачі. Нижче — перелік того, що знімає основну невизначеність: з ним ми відразу рахуємо трудовитрати, обираємо спосіб збору і збираємо план робіт під конкретні джерела та склад реєстру.

  • Джерела: каталоги, майданчики оголошень, галузеві довідники, реєстри — і чи є у вас діючі доступи або підписки на них.
  • Склад реєстру: які поля обов'язкові (назва, контактна особа, телефон, пошта, адреса, сфера діяльності), які — за можливості.
  • Правила зведення дублів: за якою ознакою вважаємо два записи однією компанією — збіг телефону, адреси або назви.
  • Обсяг і періодичність: потрібен разовий зріз або регулярне оновлення, скільки записів очікуєте на виході.
  • Що вже напрацьовано: попередні вивантаження, таблиці, бази — щоб не перезбирати те, що працює.
  • Межі допустимого: які джерела і поля ви не берете за своїми внутрішніми правилами.
  • Що далі з даними: формат вивантаження, куди складаємо, хто і за якими полями шукає.

Надішліть те, що є, навіть у чернетковому вигляді, — повернемося з оцінкою обсягу, термінами за етапами та зрозумілим планом робіт. Якщо за частиною пунктів ясності немає, розберемо їх на обговоренні та зафіксуємо домовленості письмово.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060