Заказчику нужен не парсер
Формулировка задачи почти всегда звучит как «нужен парсер остатков поставщика». Настоящая потребность другая: чтобы каждое утро в таблице лежали актуальные остатки, а если не лежат — чтобы об этом стало известно раньше, чем по ним примут решение.
Разница практическая. Скрипт — это разовый артефакт: написали, запустили, получили файл. Данные с чужого сайта — это поток, который зависит от того, кто вам ничего не обещал. Источник меняет вёрстку, добавляет защиту, переносит каталог, уходит на профилактику. Никто не предупредит.
Почему парсеры ломаются
| Причина | Как проявляется | Сложность починки |
|---|---|---|
| Изменилась вёрстка | Данные пустые или сдвинулись по колонкам | Низкая: 1–4 часа, поправить селекторы |
| Появилась защита от ботов | Вместо страницы приходит проверка или капча | Средняя или высокая, иногда нерешаемо без договорённости с источником |
| Данные отдаются через JavaScript | Страница загружается, но нужных значений в ней нет | Средняя: либо браузерный режим, либо внутренний запрос к API страницы |
| Сменилась пагинация | Собирается только первая страница, объём тихо упал | Низкая, но опасная: без контроля количества строк незаметна |
| Блокировка по IP | Работало, потом резко перестало отвечать | Средняя: снижение частоты, распределение запросов |
| Источник недоступен | Ошибки соединения, таймауты | Не чинится, но должно корректно переживаться и повторяться |
Самая коварная строка здесь — пагинация. Остальные ломают процесс громко, а эта тихо: данные приходят, отчёт собирается, просто вместо 4 000 позиций в нём 200. Заметить можно только контролем объёма.
Что отличает скрипт от сервиса
Пять признаков. Без них у вас код, а не работающий процесс.
1. Расписание и автозапуск
Запуск по времени, без участия человека, с перезапуском при падении. Скрипт, который надо запускать руками, через две недели никто не запускает.
2. Мониторинг «данные не пришли — сообщи»
Самая недооценённая часть. Молчащий парсер опаснее упавшего: упавший заметен, а молчащий оставляет в таблице вчерашние цифры, которые выглядят нормально. Вы продолжаете принимать решения — резервировать товар, выставлять цену, обещать сроки — по данным недельной давности и об этом не знаете.
Поэтому проверяется не только факт запуска, но и характеристики результата: пришло ли количество строк в ожидаемом диапазоне, не обнулились ли цены массово, свежая ли дата у источника. Отклонение — уведомление ответственному.
3. История изменений, а не только текущий срез
Перезапись таблицы «последними данными» стирает самое ценное. По истории видно, что позиция уходила в ноль трижды за месяц, что поставщик поднял цену на 8% двумя шагами, что конкурент снижает цену по пятницам. Текущий срез не отвечает ни на один из этих вопросов, а хранение истории стоит примерно ничего.
4. Понятная выгрузка
Результат должен попадать туда, где с ним работают: Google Таблица, Excel, база, загрузка в 1С или МойСклад. Файл в формате, который надо чистить руками перед каждым использованием, экономию не даёт.
5. Обработка частичных сбоев
Из 500 карточек 12 не открылись. Правильное поведение: собрать 488, повторить 12, отметить их отдельно и сообщить. Неправильное — упасть целиком или молча выдать 488 как полный результат.
Уведомления по условию: где на самом деле деньги
Сбор данных сам по себе ценности не создаёт. Её создаёт скорость реакции — то, насколько быстро вы узнали и успели что-то сделать.
- Цена упала ниже порога — сигнал закупить, пока действует.
- Товар появился в наличии — у дефицитных позиций окно составляет часы, а иногда минуты.
- Конкурент изменил цену — можно отреагировать в тот же день, а не узнать из отчёта в конце месяца.
- Появилось объявление по фильтру — на площадках объявлений первый ответивший получает почти всё.
Правовая и этическая рамка
Коротко и без обещаний. Сбор открытых данных, доступных без авторизации, сам по себе обычно допустим. Но есть рамки, которые стоит держать:
- читать пользовательское соглашение источника — прямой запрет автоматического сбора там встречается;
- не создавать чрезмерную нагрузку: частота запросов должна быть сопоставима с поведением обычного посетителя;
- не обходить авторизацию и технические ограничения доступа;
- не собирать персональные данные — имена, телефоны, контакты частных лиц;
- не переиспользовать чужой контент как свой там, где он охраняется.
Это ориентиры, а не юридическая гарантия. Если проект значимый и рассчитан надолго, конкретный случай стоит показать юристу до запуска, а не после претензии. Мы отказываемся от задач, где требуется обходить защиту или собирать персональные данные.
Когда парсинг не нужен
Самый недооценённый совет в теме: сначала спросите источник.
У многих поставщиков есть выгрузка, о которой нигде не написано — YML-фид, ссылка на CSV, доступ к API для партнёров, обновляемый прайс по почте. У маркетплейсов и крупных площадок официальный API есть почти всегда. Любой из этих вариантов надёжнее парсинга по всем параметрам: формат стабилен, изменения анонсируются, нагрузка легальна, данные полнее.
Стоит это одного письма менеджеру. По нашему опыту, примерно в трети случаев после такого письма парсер уже не нужен — остаётся задача попроще: разобрать полученный файл и разложить по вашей структуре. Мы задаём этот вопрос до старта работ, даже когда он лишает нас части проекта.
Сколько это стоит
| Задача | Цена | Срок |
|---|---|---|
| Разовая выгрузка одного источника | от 8 000 ₽ | 1–2 дня |
| Парсер по расписанию + уведомления по условию | 25 000 – 60 000 ₽ | 3–10 дней |
| Мониторинг нескольких источников со сведением в один отчёт | от 60 000 ₽ | 2–4 недели |
| Сопровождение: мониторинг, починка при смене вёрстки | от 7 000 ₽/мес | — |
Разброс в средней строке объясняется источником, а не объёмом работы с вашей стороны. Статичный каталог с обычной вёрсткой — ближе к нижней границе. Каталог, который подгружает данные скриптами, требует прохода по карточкам и ограничивает частоту обращений, — ближе к верхней.
Про сопровождение отдельно. В большинстве наших задач поддержка — опция: код, который не зависит от внешнего мира, работает годами без вмешательства. В парсинге иначе. Здесь работоспособность целиком зависит от чужого сайта, который меняется без предупреждения и без обязательств перед вами. Парсер без сопровождения — это не экономия, а отложенный отказ с неизвестной датой. Поэтому мы либо берём проект вместе с сопровождением, либо передаём исходники и честно проговариваем, что чинить придётся своими силами.
Вопросы, которые задают чаще всего
Сколько стоит парсер сайта на заказ?
Разовая выгрузка одного источника — от 8 000 ₽. Парсер по расписанию с уведомлениями по условию — 25 000–60 000 ₽ в зависимости от сложности источника. Мониторинг нескольких источников со сведением в один отчёт — от 60 000 ₽. Сопровождение с починкой при смене вёрстки — от 7 000 ₽ в месяц.
Почему парсеры ломаются?
Изменилась вёрстка, появилась защита от ботов, данные стали подгружаться через JavaScript, сменилась пагинация, включилась блокировка по IP, источник временно лёг. Смена вёрстки — самая частая причина и обычно самая простая: несколько часов работы. Самая коварная — пагинация: данные продолжают приходить, просто их становится в разы меньше, и без контроля объёма это незаметно.
Зачем платить за сопровождение парсера?
Потому что работоспособность зависит от чужого сайта, который меняется без предупреждения и без обязательств перед вами. Скрипт пишется за день, а живёт до первого редизайна источника — как правило, три-четыре месяца. Здесь сопровождение не опция, а условие того, что данные будут приходить и через полгода.
Законно ли парсить сайты?
Сбор открытых данных сам по себе обычно допустим, но нужно смотреть пользовательское соглашение конкретного сайта, соблюдать разумную частоту запросов, не создавать чрезмерную нагрузку, не обходить авторизацию и не собирать персональные данные. Это ориентир, а не юридическая гарантия — конкретный случай стоит проверить с юристом до запуска.
Когда парсинг не нужен?
Когда у источника есть официальный API, YML-фид, партнёрский прайс или выгрузка по запросу. Это надёжнее парсинга по всем параметрам. Первый шаг — написать поставщику и спросить. Это бесплатно и примерно в трети случаев закрывает задачу целиком.
Как часто можно запускать сбор данных?
Для остатков поставщика обычно достаточно 1–4 раз в сутки, для цен конкурентов — раз в день, для объявлений и дефицитных позиций — каждые 10–30 минут. Верхнюю границу задаёт не техника, а корректность: частота должна оставаться сопоставимой с нагрузкой от обычных посетителей, иначе включится блокировка, и это будет обоснованно.