Сегодня мы разберём парсинг Яндекс Карт через ZennoPoster — программу, которая умеет автоматизировать буквально всё, что происходит в браузере. От обычных кликов по кнопкам до сложных многошаговых цепочек с подстановкой данных из Excel. Я покажу вам реальный кейс, где клиенту потребовалось собрать тысячи организаций по определённому региону, и расскажу, как именно мы решили эту задачу без использования прокси-ферм, без какого-либо ручного труда и за абсолютно вменяемое время.

Сразу к делу. Заказчик обратился с конкретным запросом: выгрузить организации по ключевому слову во всей Москве. Казалось бы — ну что тут сложного, открываешь карты, вбиваешь запрос, получаешь список. Но когда вам нужно не 10 и не 50, а несколько тысяч записей с подробными полями — это уже совсем другая история и совершенно иной уровень сложности. Давайте посмотрим, как мы подошли к задаче.
Исходные данные: что хотел клиент
Клиент — владелец B2B-сервиса, которому нужна была база организаций Москвы с полной контактной информацией. Требовался экспорт в .CSV или .SQL формат. Цели — холодные продажи и наполнение CRM. Никаких полумер: нужны были все возможные поля, какие только можно вытащить из карточки организации на Яндекс Картах.
Список полей для выгрузки
Вот полный перечень данных, которые мы должны были извлечь из каждой карточки:
- Название организации
- Адрес — полный, с индексом
- Ссылка на Яндекс Карты
- Телефон — основной и дополнительные
- Время работы — часы и дни
- Фото — ссылки на изображения
- Соцсети — VK, Instagram, Facebook, сайт
- Метро — ближайшие станции
- Отзывы — текст, рейтинг, количество
- Описание — текст о компании
- Гео-координаты — широта и долгота
- Рубрики — категории деятельности
Почему ZennoPoster, а не готовые сервисы
Рынок предлагает десятки парсеров Яндекс Карт — и десктопных, и облачных. Цены варьируются от 500 до 15000 рублей за одну выгрузку. Но есть нюансы, которые всплывают только при реальной работе:
| Критерий | Готовый сервис | ZennoPoster |
|---|---|---|
| Стоимость одной выгрузки | 500–15000 руб | Бесплатно (свой шаблон) |
| Кастомизация полей | Фиксированный набор | Любые поля под заказ |
| Объём данных | Ограничен тарифом | До 5000 записей через API |
| Зависимость от сервера | Полная (облако) | Нулевая (работа на вашем ПК) |
| Риск утечки данных | Высокий (чужие сервера) | Минимальный (всё локально) |
| Скорость парсинга | Зависит от очереди | Настраиваемая (треды) |
Архитектура решения: API против браузера
У нас было два пути: классический браузерный парсинг (эмуляция действий пользователя) и работа через API Яндекс Карт. Давайте сравним оба подхода в цифрах:
| Параметр | Браузерный парсинг | API Яндекс Карт |
|---|---|---|
| Скорость на 1000 записей | 2–4 часа | 3–7 минут |
| Риск капчи | Высокий (после 200+ запросов) | Низкий (легитимные endpoints) |
| Необходимость прокси | Обязательна | Не требуется |
| Лимит выдачи | Видимые на экране | До 5000 через search API |
| Сложность реализации | Средняя | Высокая (реверс API) |
| Полнота данных | Что показано в карточке | Все поля из JSON-ответа |
Мы выбрали API-метод, потому что клиенту требовался именно объём и скорость. Браузерный метод хорош для штучных сборов, когда нужно 50–100 организаций и можно не спешить. Но когда счёт идёт на тысячи — только API.
\u{201c}Яндекс Карты отдают через внутренний API гораздо больше данных, чем показывают пользователю. В JSON-ответе лежат телефоны, координаты, часы работы, ссылки на соцсети — всё, что нужно для полноценной базы. Главное — правильно распарсить.
Как работает API Яндекс Карт
Яндекс Карты используют несколько внутренних endpoint-ов для работы фронтенда. Один из них — поисковый, который возвращает организации в заданном радиусе. Второй — карточка организации, отдающая детальную информацию. Мы задействовали оба.
Шаг 1: Поисковый запрос
Первый endpoint принимает ключевое слово и координаты центра поиска. В ответ приходит JSON с массивом организаций, где каждая содержит id, название, координаты, адрес и несколько других базовых полей. Лимит — около 5000 результатов, после чего Яндекс обрезает выдачу. На практике по Москве с запросом «ремонт квартир» мы получили порядка 3200 организаций.
Ключевой параметр этого запроса — spn (span), который определяет радиус поиска в градусах. Для Москвы оптимальное значение — 0.3–0.5 градуса, что покрывает примерно 25–40 километров. Если поставить значение больше — Яндекс может обрезать выдачу по внутреннему лимиту ещё до 5000, и вы недополучите организации из центра города. Меньше — придётся делать больше запросов по сетке.
Шаг 2: Детальная карточка
Имея id каждой организации, мы отправляем второй запрос — за подробной информацией. Карточка возвращает:
- Телефоны (основной и дополнительные)
- Сайт и соцсети
- График работы
- Рейтинг и текст отзывов
- Фотографии
- Рубрики и описание
Реализация на C# в ZennoPoster
ZennoPoster поддерживает выполнение C# кода через экшены и глобальные сниппеты. Вот ключевые фрагменты нашего шаблона.
Базовый HTTP-запрос через Zenno
Для отправки запросов мы использовали стандартный HttpClient, но с обязательной подстановкой заголовков, имитирующих браузер:
Парсинг JSON-ответа и запись в таблицу
После получения ответа мы разбираем JSON и раскладываем поля в таблицу ZennoPoster для последующего экспорта:
Защита от бана: троттлинг и случайные паузы
Самое важное в API-парсинге — не спалиться. Мы использовали каскадную систему задержек. На первых ста запусках мы экспериментировали с разными значениями и выяснили золотую середину: базовая задержка 200 миллисекунд плюс случайный довесок от 100 до 500 мс. Это позволяет пройти незамеченным даже при многочасовом сборе данных.
Дедупликация данных
При сборе данных с Яндекс Карт неизбежно возникают дубликаты. Одна и та же организация может быть найдена по разным ключевым словам, иметь несколько филиалов с одинаковым названием, или просто дважды попасть в выдачу. Мы реализовали трёхуровневую систему очистки:
Уровень 1: Проверка по ID
Самый надёжный способ — удаление записей с одинаковым идентификатором организации. Каждая карточка в Яндекс Картах имеет уникальный числовой id. После парсинга мы сортируем таблицу по этому полю и удаляем все строки, где id совпал с предыдущей.
Уровень 2: Сравнение телефонов
Бывает, что одна организация зарегистрирована под разными id (например, основной офис и филиал, у которых указан общий телефон). Мы нормализуем номера (убираем пробелы, скобки, дефисы) и сравниваем их. Повторы — удаляем.
Уровень 3: Координатная сетка
Если два юрлица находятся в радиусе 10 метров друг от друга и имеют одинаковое название — это дубликат. Такой метод хорошо вычищает ситуации, когда одна точка зарегистрирована и как ИП, и как ООО.
Экспорт в CSV и SQL
ZennoPoster умеет сохранять таблицы напрямую в CSV и SQL. Но мы предпочли свой C#-обработчик, потому что стандартный экспорт не чистил спецсимволы и ломал SQL-инсерты.
CSV-экспорт
При сохранении в CSV критически важно экранировать кавычки и переносы строк внутри полей. Мы использовали стандартный подход: каждое поле оборачивается в двойные кавычки, а внутренние кавычки дублируются.
SQL-экспорт
Для SQL мы формировали INSERT-запросы батчами по 100 строк — это оптимальный баланс между скоростью вставки и размером транзакции. При большем размере батча возрастает риск обрыва соединения и потери данных. При меньшем — неоправданно растёт накладной расход на каждую транзакцию, и импорт затягивается на десятки минут.
После экспорта клиент получает два файла: .CSV для быстрого просмотра в Excel и .SQL для импорта напрямую в MySQL или PostgreSQL. Оба файла готовы к использованию без дополнительной обработки.
Типичные ошибки и как их избежать
За время работы над этим кейсом мы наступили на все возможные грабли. Делюсь опытом, чтобы вы не повторяли наших ошибок.
Ошибка 1: Жадность со скоростью
Первая версия шаблона делала запросы с задержкой 50–100 мс. Результат: IP был заблокирован через 3 минуты. Лечение: увеличили базовую задержку до 200–700 мс с рандомизацией. Скорость упала на 40%, но зато сбор идёт стабильно.
Ошибка 2: Неэкранированные спецсимволы
Вторая версия CSV-экспорта ломалась на названиях вроде ООО "Строй-Проект" — кавычки внутри названия рвали CSV-разметку. Добавили экранирование через C# сниппет — проблема ушла.
Ошибка 3: Игнорирование геозоны
Яндекс Карты возвращают организации в радиусе от указанной точки, а не по всему городу. Чтобы охватить всю Москву, пришлось разбить её на сетку 5×5 км и делать запросы из каждого квадрата отдельно.
Ошибка 4: Повторные запросы card API
Если организация уже была обработана в предыдущем запуске — не нужно дёргать card API повторно. Мы добавили кэширование по id в локальный JSON-файл. При повторном запуске проверяем кэш и пропускаем уже собранные карточки.
Ошибка 5: Неправильная обработка null-полей
В JSON-ответах Яндекса поля могут отсутствовать вовсе или приходить как пустая строка. Наш первый вариант кода падал с NullReferenceException при попытке обратиться к несуществующему полю. Решение: обернуть каждый доступ к полю в ?. и подставить значение по умолчанию через ?? "". Это добавило стабильности и убрало десятки аварийных остановок шаблона.
Ошибка 6: Жёсткая привязка к структуре JSON
Яндекс периодически меняет структуру внутреннего API — переименовывает ключи, меняет вложенность, добавляет новые поля. Чтобы не переписывать шаблон при каждом изменении, мы вынесли маппинг полей в отдельный конфигурационный файл. Теперь при изменении API достаточно поправить конфиг, а не перекомпилировать весь шаблон.
Результаты кейса в цифрах
Давайте подведём итоги того, что получилось в результате парсинга Яндекс Карт по Москве с ключевым словом «ремонт квартир»:
- Всего организаций собрано: 3 247
- Время парсинга: 1 час 47 минут
- Объём CSV-файла: 1.8 MB
- Объём SQL-файла: 2.4 MB
- Количество полей: 18 на каждую запись
- Уникальных записей после дедупликации: 2 891
- Записей с телефонами: 2 412 (83.4%)
- Записей с отзывами: 1 987 (68.7%)
FAQ
Часто задаваемые вопросы по парсингу Яндекс Карт
Сколько организаций можно собрать через API Яндекс Карт за один раз?
Лимит поискового API Яндекс Карт составляет примерно 5000 результатов на один запрос. На практике количество зависит от региона и ключевого слова. По Москве с популярным запросом обычно возвращается 2000–4000 организаций. Если нужно больше — разбивайте геозону на мелкие квадраты и делайте запросы по каждому отдельно.
Законно ли парсить Яндекс Карты?
Парсинг общедоступных данных (названия, адреса, телефоны организаций) не противоречит российскому законодательству, если вы не нарушаете работу сервиса и не обходите технические средства защиты. Однако агрессивный парсинг (сотни запросов в секунду) может быть расценён как DDoS-атака. Соблюдайте разумные задержки между запросами.
Чем отличается парсинг через API от браузерного парсинга?
API-парсинг работает с JSON-ответами сервера — это быстрее в 30–50 раз и даёт больше данных. Браузерный парсинг имитирует действия пользователя — медленнее, но не требует реверс-инжиниринга API. API даёт до 5000 записей за 5–7 минут; браузерный метод на тот же объём потратит 2–4 часа и с высокой вероятностью словит капчу.
Нужны ли прокси для парсинга Яндекс Карт через API?
При разумных задержках (200–700 мс между запросами) прокси не требуются — Яндекс не блокирует легитимные запросы к своему внутреннему API, которые фронтенд отправляет в штатном режиме. Но если вам нужно собрать более 10000 записей за раз — лучше использовать ротацию IP через прокси.
Как бороться с капчей при парсинге?
Капча появляется при превышении лимита запросов. Решений три: увеличить задержки между запросами (самый надёжный способ), использовать сервисы распознавания капчи (RuCaptcha, 2Captcha), либо ротировать IP через мобильные прокси. ZennoPoster имеет встроенную интеграцию с сервисами распознавания капчи через экшен Распознать капчу.
Можно ли собрать отзывы с Яндекс Карт вместе с организациями?
Да, через API карточки организации доступен блок с отзывами: текст, рейтинг, имя автора, дата. Однако отзывы подгружаются не все сразу — обычно приходит 10–20 последних. Чтобы собрать все отзывы, нужен отдельный endpoint для их постраничной подгрузки, что заметно увеличивает время парсинга.
Какие форматы экспорта поддерживает ZennoPoster?
Из коробки: .CSV, .TXT, .XLSX, .SQL. Через C# можно экспортировать в любой формат — JSON, XML, Google Sheets через API. В нашем кейсе клиенту нужны были CSV и SQL — оба формата генерируются одним шаблоном.
Как часто нужно обновлять базу организаций с Яндекс Карт?
Оптимально — раз в месяц для высококонкурентных ниш (общепит, салоны красоты) и раз в квартал для B2B. У ZennoPoster есть встроенный планировщик — можно настроить шаблон на автозапуск по расписанию. Шаблон сам проверит кэш по id и обновит только изменившиеся карточки, не тратя время на повторный сбор старых данных.
Выводы
Парсинг Яндекс Карт через ZennoPoster — это рабочий и экономически оправданный подход, когда вам нужна регулярная актуализация базы организаций. Ключевые выводы из нашего кейса:
- API быстрее браузера в 30–50 раз и даёт больше данных
- Разумные задержки (200–700 мс) позволяют работать без прокси
- Дедупликация обязательна на трёх уровнях: id, телефон, координаты
- Кэширование по id экономит часы при повторных запусках
- Геосетка (разбивка города на квадраты) нужна для полного охвата
\u{201c}Парсинг — это не просто «взял и выгрузил». Это продуманная архитектура из API-запросов, обработки ошибок, дедупликации и экспорта. Шаблон на ZennoPoster пишется один раз, а потом работает годами с минимальными доработками при изменении API Яндекса.
Отдельно хочу отметить важность тестового прогона перед полным запуском. Соберите сначала 50 организаций, проверьте корректность заполнения всех полей, убедитесь что CSV и SQL не ломаются спецсимволами, и только после этого запускайте шаблон на полную мощность. Это правило сэкономило нам не один час отладки.
И последнее: следите за обновлениями Яндекс Карт. Раз в 2–3 месяца Яндекс вносит изменения в API, и то, что работало вчера, сегодня может вернуть ошибку 403. Подпишитесь на тематические форумы по ZennoPoster и парсингу — там коллеги обычно оперативно делятся патчами и обходными путями.
Если вам нужна аналогичная выгрузка — пишите через форму обратной связи. Укажите регион, ключевые слова и список полей — я скажу, реально ли это собрать и сколько времени займёт.
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Сколько организаций можно собрать через API Яндекс Карт за один раз?","acceptedAnswer":{"@type":"Answer","text":"Лимит поискового API Яндекс Карт составляет примерно 5000 результатов на один запрос. На практике количество зависит от региона и ключевого слова. По Москве с популярным запросом обычно возвращается 2000–4000 организаций. Если нужно больше — разбивайте геозону на мелкие квадраты и делайте запросы по каждому отдельно."}},{"@type":"Question","name":"Законно ли парсить Яндекс Карты?","acceptedAnswer":{"@type":"Answer","text":"Парсинг общедоступных данных (названия, адреса, телефоны организаций) не противоречит российскому законодательству, если вы не нарушаете работу сервиса и не обходите технические средства защиты. Однако агрессивный парсинг может быть расценён как DDoS-атака. Соблюдайте разумные задержки между запросами."}},{"@type":"Question","name":"Чем отличается парсинг через API от браузерного парсинга?","acceptedAnswer":{"@type":"Answer","text":"API-парсинг работает с JSON-ответами сервера — это быстрее в 30–50 раз и даёт больше данных. Браузерный парсинг имитирует действия пользователя — медленнее, но не требует реверс-инжиниринга API. API даёт до 5000 записей за 5–7 минут; браузерный метод на тот же объём потратит 2–4 часа."}},{"@type":"Question","name":"Нужны ли прокси для парсинга Яндекс Карт через API?","acceptedAnswer":{"@type":"Answer","text":"При разумных задержках (200–700 мс между запросами) прокси не требуются — Яндекс не блокирует легитимные запросы к своему внутреннему API. Но если вам нужно собрать более 10000 записей за раз — лучше использовать ротацию IP через прокси."}},{"@type":"Question","name":"Как бороться с капчей при парсинге?","acceptedAnswer":{"@type":"Answer","text":"Капча появляется при превышении лимита запросов. Решения: увеличить задержки между запросами, использовать сервисы распознавания капчи (RuCaptcha, 2Captcha), либо ротировать IP через мобильные прокси. ZennoPoster имеет встроенную интеграцию с сервисами распознавания капчи."}},{"@type":"Question","name":"Можно ли собрать отзывы с Яндекс Карт вместе с организациями?","acceptedAnswer":{"@type":"Answer","text":"Да, через API карточки организации доступен блок с отзывами: текст, рейтинг, имя автора, дата. Однако отзывы подгружаются не все сразу — обычно приходит 10–20 последних. Чтобы собрать все отзывы, нужен отдельный endpoint для их постраничной подгрузки."}},{"@type":"Question","name":"Какие форматы экспорта поддерживает ZennoPoster?","acceptedAnswer":{"@type":"Answer","text":"Из коробки: .CSV, .TXT, .XLSX, .SQL. Через C# можно экспортировать в любой формат — JSON, XML, Google Sheets через API. В нашем кейсе клиенту нужны были CSV и SQL — оба формата генерируются одним шаблоном."}},{"@type":"Question","name":"Как часто нужно обновлять базу организаций с Яндекс Карт?","acceptedAnswer":{"@type":"Answer","text":"Оптимально — раз в месяц для высококонкурентных ниш (общепит, салоны красоты) и раз в квартал для B2B. У ZennoPoster есть встроенный планировщик — можно настроить шаблон на автозапуск по расписанию."}}]}Нажмите для реакции


