Разбираю, как устроен сбор данных через API: где искать API у сервиса, как не упереться в лимиты, почему выгрузка «работала вчера и упала сегодня», как хранить ключи и что по этому поводу говорит российский закон.
Привет, я Дени, разработчик Hated.Ru. Пишу фронтенд и бэкенд, работаю с базами данных, API и серверами. Почти каждую неделю приходит одна из трёх просьб: «спарсите цены поставщика», «выгрузите заказы с маркетплейса в учёт», «соберите отчёт из рекламы и CRM в одну таблицу».
Во всех трёх случаях данные обычно уже лежат в API. Забрать их оттуда быстрее, дешевле и спокойнее с юридической стороны, чем вырезать из страниц сайта. Чтобы разложить эту работу по полочкам, я прошёл курс «Парсинг API на Python» Павла Хошева и Ильи Мирошниченко на Stepik: запросы, JSON, пагинация, лимиты, авторизация, сжатие и прокси. Ниже то, что из него полезно знать заказчику, плюс наша практика интеграций.
- API или парсинг страниц
- Какие задачи решает бизнес
- Как найти API у сервиса
- Запрос и ответ простыми словами
- Пагинация, лимиты и скорость
- Ловушки в данных
- Ключи, токены и их хранение
- Сжатие и прокси
- Что говорит закон
- Парсер как рабочий инструмент
- Чек-лист ТЗ на выгрузку
- Как мы работаем и цены
- Частые вопросы
API или парсинг страниц: в чём разница для бизнеса
В 1990-х и начале 2000-х данные жили прямо в HTML. Забрать чужой каталог можно было только одним способом: скачать страницы и вырезать из вёрстки нужные куски. Такой скрапинг нередко приравнивали к взлому, а некоторые сайты специально меняли разметку каждые несколько часов, чтобы сломать чужие парсеры.
Потом появились RSS-ленты, в 1998 году SOAP, а в 2000 году Рой Филдинг описал принципы REST. К середине 2000-х крупные сервисы открыли публичные API: им было выгодно, чтобы сторонние разработчики строили вокруг них свои продукты. Сегодня API есть у маркетплейсов, CRM, рекламных кабинетов, банков, служб доставки и у многих поставщиков.
Данные из API запрашивают. Парсинг начинается потом, когда ответ уже у вас на руках.
Мысль из курса, которую я повторяю клиентам| Что сравниваем | Парсинг HTML-страниц | Работа через API |
|---|---|---|
| Что получаем | Страницу целиком, из которой вырезаем данные | Готовые данные в JSON, только нужные поля |
| Что ломает выгрузку | Любая правка дизайна или вёрстки | Смена версии API, о которой сервис обычно предупреждает заранее |
| Скорость | Тяжёлые страницы, одна карточка за запрос | Порции по 20-200 записей, пакетные запросы по списку ID |
| Правила | Только пользовательское соглашение сайта | Документация: лимиты, ключи, условия использования |
| Закон | Серая зона, всё решают данные и условия сайта | Понятно, если соблюдать условия сервиса и 152-ФЗ |
| Когда выбирать | API нет или в нём нет нужных полей | Всегда, когда API есть |
Если у сервиса нет API, первым делом я спрашиваю про готовую выгрузку: YML-фид, CSV по ссылке, файл в личном кабинете. Разбирать HTML-страницы имеет смысл, только когда других вариантов нет.
Какие задачи бизнес решает через API
Заказчики редко говорят «нам нужен API». Они говорят «менеджер полдня копирует цены из одного окна в другое». Вот задачи, с которыми к нам приходят чаще всего.
Цены и остатки поставщика
Поставщик отдаёт данные по ключу. Раз в час выгрузка забирает цены и остатки и обновляет каталог интернет-магазина. Прайс руками больше никто не правит.
Заказы с маркетплейсов
У Ozon, Wildberries и Яндекс Маркета есть API для продавцов: заказы, остатки, цены и отчёты по своему кабинету. Их забирают в 1С, МойСклад или CRM.
Отчёт по рекламе
Расходы из API Яндекс Директа, визиты из Метрики и заявки из CRM сводятся в одну таблицу. Маркетолог перестаёт склеивать отчёт по понедельникам.
Проверка контрагентов
По ИНН через сервисы вроде DaData в карточку сделки подтягиваются реквизиты, адрес и статус компании. Реквизиты больше никто не перепечатывает руками.
Курсы валют и справочники
ЦБ РФ публикует курсы валют каждый день. Прайс в долларах или юанях пересчитывается в рубли автоматически.
Мониторинг рынка
Цены и наличие в открытых каталогах, вакансии, отзывы. Здесь больше всего юридических нюансов, о них в разделе 9.
API продавца на маркетплейсе отдаёт данные вашего кабинета: ваши заказы, ваши остатки, ваши отчёты. Сбор витрины конкурентов через внутренние запросы сайта устроен иначе, и условия площадки его часто ограничивают. Это разные задачи с разными рисками.
Как найти API у нужного сервиса
Первое правило из курса звучит скучно, но экономит дни: сначала документация, потом код. Без неё разработчик сидит во вкладке Network и подбирает параметры наугад.
Раздел «Для разработчиков»
Ищите на сайте сервиса ссылки «API», «Интеграции», «Разработчикам». Часто документация сделана в Swagger: у каждого адреса описание, параметры и примеры ответов. Кнопка «Try it out» отправляет запрос прямо из браузера и показывает готовый адрес для кода.
Личный кабинет и тарифы
Ключи доступа, лимиты и цена обычно лежат в кабинете. Типичная схема: определённое число запросов в день бесплатно, дальше по тарифу. Это сразу закладывается в бюджет.
Вкладка Network в браузере
Современный сайт сам получает данные через API. Откройте инструменты разработчика (F12), вкладку Network, и прокрутите каталог. В списке появится запрос вроде page=2&per_page=20. Это внутреннее API сайта. Оно показывает, как устроены данные, но публичным договором с вами не является.
Вопрос поставщику
У многих B2B-поставщиков есть выгрузка по ключу, о которой не пишут на сайте. Одно письмо менеджеру часто заменяет неделю разработки.
Если API нет
Просим фид (YML или CSV) или договариваемся об обмене файлами. Парсинг страниц оставляем на крайний случай и сначала читаем пользовательское соглашение.
Запрос и ответ простыми словами
Любой обмен с API устроен одинаково. Программа отправляет запрос на адрес, сервер возвращает ответ: код, служебные заголовки и сами данные. Разберём адрес по частям.
Куда отправляем запрос. Базовый адрес держат отдельно, чтобы переключать тестовую и боевую среду.
Какой ресурс нужен: отзывы товара 1024. Путь отвечает на вопрос «что именно».
Как отдать: вторая страница по 50 штук. Сюда же идут фильтры, сортировка и поиск.
К запросу прикладываются заголовки: кто спрашивает (User-Agent), в каком формате нужен ответ (Accept), ключ доступа (Authorization). Библиотека requests по умолчанию представляется как python-requests, и многие серверы отвечают на это отказом. Поэтому нормальный парсер всегда представляется явно. Подмена User-Agent, как честно говорят авторы курса, анонимности не даёт и серьёзную защиту не обходит.
Что ответил сервер и что с этим делать
Главная привычка из курса: сначала смотреть код ответа, потом данные. Нажмите на код, чтобы увидеть, что он значит и как на него реагирует хорошо написанная выгрузка.
Данные пришли, запрос выполнен.
Проверяет, что в ответе действительно JSON, и только потом разбирает данные.
Всё в порядке, запись попадает в отчёт.
Код 200, а внутри ошибка: поле success со значением false, пустые данные или HTML-страница заглушки от CDN или капчи.
Проверяет тип ответа и поле успеха. В журнал пишет код, тип содержимого и первые 200 байт ответа.
Без такой проверки в отчёт тихо попадают пустые строки, и никто этого не замечает неделями.
Запрос выполнен, но данных нет и тела ответа нет.
Не пытается разобрать JSON и отмечает запись как пустую.
Нормальная ситуация, например у товара ещё нет отзывов.
Сервер не понял запрос: неверный формат или параметр.
Не повторяет запрос. Пишет ошибку в журнал, чинить нужно код.
Выгрузка остановилась по вине нашей стороны, это задача разработчику.
Сервер вас не узнал: ключа нет, он просрочен или с опечаткой.
Если есть пара токенов, один раз обновляет их и повторяет запрос. Не вышло, останавливается и сообщает человеку.
Кто-то сменил пароль, отозвал ключ или истёк токен. Нужен новый доступ.
Сервер узнал вас, но не пускает: нет прав, не тот тариф, заблокирован адрес или нужен заголовок.
Не давит повторами, это бесполезно. Останавливается и показывает текст ошибки.
Нужны права у владельца API, другой тариф или договорённость с сервисом.
Такого ресурса нет: товар удалён, ID устарел.
Пропускает запись, отмечает её в журнале и идёт дальше. Весь обход из-за одной позиции не падает.
В любом списке есть битые ID. Их полезно показывать менеджеру отдельным списком.
Отказал прокси-сервер, до самого API запрос не дошёл.
Проверяет логин и пароль прокси или белый список адресов, адрес временно убирает из работы.
Проблема у поставщика прокси или в настройках, данные API тут ни при чём.
Параметры не прошли проверку. Хорошие API пишут, какой параметр не понравился и какие значения допустимы.
Не повторяет. Разработчик читает подсказку сервера и исправляет запрос.
Авторы курса называют такой ответ подарком: сервер сам объясняет ошибку.
Превышен лимит запросов. Сервер просит сбавить темп.
Ждёт столько, сколько сказано в заголовке Retry-After или до времени сброса лимита, и повторяет ту же страницу.
Постоянные 429 значат, что выгрузка слишком жадная. Следующий шаг сервиса обычно бан.
Проблема на стороне сервиса: 500, 502, 503 или 504.
Делает паузу и 2-3 повтора с растущим интервалом: 1, 2, 4 секунды. Повторяет только чтение, запросы на запись не дублирует.
Сбой у поставщика. Данные подтянутся при следующем запуске, если выгрузка это предусматривает.
Пагинация, лимиты и скорость выгрузки
Сервер не отдаёт весь каталог одним ответом. В учебном API курса 13 428 записей, и при 80 записях на странице это 206 запросов. Размер страницы всегда ограничен, в учебном API от 1 до 200. Так сервис защищает базу: один жадный запрос мог бы положить её для всех.
Как обходят страницы
По числу страниц
Сервер пишет в ответе, сколько всего страниц. Выгрузка берёт первую, узнаёт total_pages и идёт циклом до конца.
До пустой страницы
Запасной вариант, если служебных данных нет. Стоит одного лишнего запроса в конце.
По флагу «есть ещё»
Сервер в каждом ответе говорит, есть ли следующая страница. Авторы курса советуют именно этот способ.
Пока выгрузка идёт по страницам, в каталог добавляют и удаляют товары. Записи сдвигаются, и одни попадают в выгрузку дважды, а другие пропадают. Минимальная защита: убирать дубли по ID. Для остатков, заказов и оплат лучше подходят выгрузка только изменённых записей по дате обновления, курсорная пагинация или вебхуки, когда сервис сам сообщает об изменениях.
Лимиты: сколько запросов можно отправить
Почти у любого API есть ограничение частоты. Учебный API курса пропускает 10 запросов в секунду и 600 в минуту с одного адреса. Если превысить лимит, придёт ответ 429. Подсказки о лимите сервер кладёт в заголовки: сколько всего можно, сколько осталось и когда счётчик обнулится. Время обнуления в заголовке X-RateLimit-Reset обычно указано как момент во времени, и его легко ошибочно принять за количество секунд.
Самую простую стратегию авторы курса считают лучшей для большинства задач: постоянная пауза между запросами, равная единице, делённой на лимит. При 10 запросах в секунду это 0,1 секунды. Счётчику оставшихся запросов одному доверять нельзя: заблокированный клиент иногда получает 403 или даже 200 с пустыми данными, и выгрузка «залипает».
быстрее с одной сессией
Каждый новый запрос тратит время на установку соединения. В замере курса 50 запросов шли 47,8 секунды по отдельности и 10,6 секунды через одно открытое соединение. Сессию создают один раз перед циклом.
ID в одном пакетном запросе
Если API умеет отдавать данные по списку ID, один запрос заменяет десятки. Сервер молча пропускает несуществующие ID, поэтому запрошенное всегда сверяют с полученным.
Повторы при ошибках
Автоматически повторяют только временные сбои: 429 и ошибки сервера 5xx. Ответы 400, 401, 403 и 404 повторять бессмысленно, выгрузка только нагрузит чужой сервер. Запросы, которые что-то создают, не повторяют вовсе: повтор может оформить заказ или платёж дважды.
Сколько займёт выгрузка
Покрутите параметры и посмотрите, что сильнее всего влияет на время: размер страницы, лимит сервиса, одно соединение и сжатие.
Оценка по данным курса: около 1,3 КБ на запись без сжатия, gzip экономит 75% трафика, накладные расходы запроса около 0,96 с без сессии и 0,21 с с сессией, скорость канала 1 МБ/с. Реальные цифры зависят от конкретного API, их проверяют пробным запуском.
Главный вывод из калькулятора: при жёстком лимите время определяет число запросов. Поэтому первым делом проверяют, какой максимальный размер страницы разрешает сервис и есть ли пакетные запросы. Ускорять выгрузку потоками или асинхронностью имеет смысл только в пределах лимита. Авторы курса формулируют это так: ускорение не отменяет вежливость.
Ловушки в данных: почему выгрузка работала вчера и упала сегодня
Сквозной сюжет курса: скрипт собирает цены 100 позиций и в три часа ночи падает на 47-й, потому что у одной записи вместо автора пришло пустое значение. В другом примере сбор 1 000 записей ломается на 999-й, и всё собранное теряется. Внешним данным доверять нельзя, даже если документация обещает порядок.
Цена строкой, пустая цена, цена целым числом. Даты в двух форматах. Бренд у второй записи пустой.
| Артикул | Название | Цена | Обновлено | Бренд |
|---|---|---|---|---|
| A-1024 | Кресло | 1990.00 | 09.05.2026 | {'name': 'Мебель-Т'} |
| A-1025 | Стол | 0 | 2026-04-10T12:00:00+03:00 | ошибка |
| A-1031 | Полка | 99900 | 01.12.2025 | {'name': 'Ока'} |
Кириллица превратилась в кракозябры из-за кодировки. Пустую цену заменили нулём, и товар стал бесплатным. 99 900 может оказаться копейками, то есть ошибкой в сто раз. Даты в разных форматах, при сортировке как текста май встанет раньше апреля. Вложенный бренд попал в ячейку как кусок кода, а на пустом бренде скрипт упал.
| Артикул | Название | Цена, ₽ | Обновлено | Бренд |
|---|---|---|---|---|
| A-1024 | Кресло «Тула» | 1 990,00 | 2026-05-09 | Мебель-Т |
| A-1025 | Стол «Рязань» | нет цены | 2026-04-10 | не указан |
| A-1031 | Полка «Ока» | 999,00 | 2025-12-01 | Ока |
Кодировка для русского Excel, разделитель «точка с запятой», цены в точном десятичном формате, копейки пересчитаны по документации, даты в одном формате, пустые значения подписаны явно.
Восемь правил, которые спасают выгрузку
Пустое значение не равно нулю
Пустая цена значит «цены нет». Если молча подставить ноль, средняя цена поедет, а в отчёте появятся бесплатные товары среди самых дорогих.
Деньги считают точно
Обычные дробные числа в программировании дают погрешность: 0,1 + 0,2 превращается в 0,30000000000000004. Миллион сложений по 10 копеек в курсе дал 100 000,00000133288. Для денег используют точный десятичный тип.
Копейки или рубли
Число 99900 может означать и 999 рублей, и 99 900. Решает только документация. Ошибка здесь стоит в сто раз.
Один формат дат
В учебном API встречаются три формата дат сразу. Их приводят к ISO 8601 и учитывают часовой пояс, иначе сравнение «за последние 7 дней» врёт.
Код 200 ещё не данные
При сбое CDN или капче сервер может вернуть 200 и HTML-страницу. Выгрузка проверяет тип ответа и пишет в журнал код, тип и начало ответа.
Файл для русского Excel
Три настройки: кодировка UTF-8 с меткой BOM, разделитель «;» и правильные переводы строк. Без них менеджер увидит кракозябры, одну колонку или удвоенные строки.
Вложенное раскладывают по колонкам
Бренд становится колонкой, а список характеристик превращается в отдельные строки. Записи без вложенных данных не выбрасывают, иначе их пропажу заметят через неделю.
Отчёт по закрытым периодам
Счётчики в API живые и меняются каждую минуту. Для сверки считают по завершённым дням в одном часовом поясе, тогда два запуска дают одинаковый результат.
Всё приведение типов собирают в одном месте, его называют нормализацией. Это граница между «грязным» внешним API и вашей системой. Из двадцати с лишним полей ответа остаются 5-15 нужных, с понятными названиями и правильными типами. Если сервис переименует поле, правка займёт одну строку вместо поиска по всему проекту.
Ключи, токены и где их хранить
Закрытые данные API отдаёт только тому, кто предъявил секрет: ключ, токен, логин с паролем или идентификатор сессии. Два кода отказа путают постоянно. 401 значит «я вас не знаю», лечится новым ключом. 403 значит «узнал, но сюда нельзя», лечится только расширением прав у владельца API. Серверы иногда путают их сами, поэтому разработчик читает текст ошибки.
| Схема | Как устроена | Где встречается | Главный риск |
|---|---|---|---|
| Ключ API | Длинная строка из личного кабинета в заголовке запроса. Живёт месяцы и годы | DaData, Ozon Seller API, Wildberries, многие поставщики | Утёкший ключ работает, пока его не отзовут |
| Токен Bearer | Короткоживущий токен на минуты или часы и второй токен для его обновления | Большинство современных сервисов и внутренних API | Украденный токен действует до истечения срока |
| OAuth 2.0 | Приложение получает токен с ограниченными правами, пароль пользователя ему не нужен | Яндекс Директ и Метрика, amoCRM, VK | Нужно продумать обновление токенов, иначе выгрузка встанет |
| Basic Auth | Логин и пароль в каждом запросе | 1С (OData и HTTP-сервисы), старые системы, сетевое оборудование | Пароль уходит постоянно, работает только через HTTPS |
| Cookie-сессия | Идентификатор сессии после входа на сайт | Сайты и админки без публичного API | Равносилен паролю от аккаунта |
Отдельно про Битрикс24: во входящем вебхуке секретный код стоит прямо в адресе. Такой адрес хранят как пароль и не отправляют в общие чаты.
Как хранить секреты
Вне кода
Ключи лежат в переменных окружения или файле .env, который не попадает в репозиторий. В репозиторий кладут только шаблон с названиями переменных.
Никогда в адресе
Адрес запроса оседает в журналах серверов, истории браузера и чужих логах через Referer. Ключ передают в заголовке.
Утёк, значит отозван
Ключ, попавший в публичный репозиторий, боты находят за минуты. Удалить файл новым коммитом мало: ключ отзывают и выпускают новый.
Разные ключи на тест и бой
Тестовая среда не должна уметь менять боевые данные. Ошибка в тесте тогда остаётся в тесте.
Минимальные права
Для отчёта хватит доступа на чтение. Отдельный ключ на каждую интеграцию позволяет отключить одну, не трогая остальные.
Доступы при смене подрядчика
Список всех ключей и где они используются лежит у вас. Ушёл подрядчик, ключи перевыпускаются за час.
В курсе показано, как взять cookies из своего браузера и обращаться к внутренним адресам сайта от своего имени. Для собственного кабинета это рабочий приём. Использовать чужие сессии, пароли и ключи нельзя: это неправомерный доступ к информации, за него предусмотрена уголовная ответственность по статье 272 УК РФ.
Сжатие и прокси: трафик, скорость и деньги
Один заголовок, который экономит 75% трафика
Выгрузка может попросить сервер сжимать ответы. JSON сжимается отлично, потому что в нём сотни раз повторяются одни и те же названия полей. Сервер выбирает алгоритм из предложенных и сообщает, какой взял. Библиотека requests распаковывает ответ сама, для современных алгоритмов Brotli и zstd нужны дополнительные пакеты.
Замер из курса: 20 страниц по 80 записей из учебного API. gzip оказался самым быстрым по итоговому времени, Brotli самым плотным.
Сжатие почти ничего не стоит клиенту: распаковка быстрая, процессор тратит в основном сервер. Не нужно оно только для уже сжатых файлов вроде картинок, PDF и архивов. Во всех остальных случаях я включаю его по умолчанию.
Прокси: когда нужны и когда бесполезны
Прокси это посредник между выгрузкой и сервисом, сервис видит его адрес. Он помогает, когда лимит считается по адресу, когда нужны региональные цены и каталоги или когда сервис недоступен из вашей сети. Если лимит привязан к ключу, аккаунту или поведению, смена адреса ничего не даст. Трафик прокси не шифрует, и его владелец видит, куда вы обращаетесь, поэтому ключи через чужой прокси отправляют только по HTTPS.
| Серверные | Резидентские | Мобильные | |
|---|---|---|---|
| Откуда адреса | Дата-центры и хостинги | Домашние подключения | Модемы и смартфоны с SIM-картой |
| Как платят | За адрес в месяц | За гигабайт трафика | За порт в день или месяц |
| Цена | самые дешёвые | в разы дороже | на порядок дороже серверных |
| Доверие сервисов | низкое | высокое | максимальное |
| Скорость | Высокая и стабильная | Как у домашнего интернета | Нестабильная, смена адреса 5-10 с |
Авторы курса предлагают лестницу. Сначала работаем напрямую: паузы, нормальный User-Agent, обработка 429 и таймауты. Не помогло, пробуем серверные прокси. Их режут именно за происхождение, переходим к резидентским, и только в крайнем случае к мобильным. Сравнивают цену одного полученного результата, процент успешных запросов сам по себе мало что говорит.
на 100 000 ответов по 20 КБ
Резидентские прокси оплачиваются за гигабайт. Сжатие вместе с большим размером страницы снижает счёт примерно в пять раз. В курсе это сказано точно: урок про сжатие оказывается уроком про бюджет.
ваша нагрузка никуда не делась
Прокси законны и нужны для стабильной работы. Условия сервиса они не отменяют. Нагрузка через десять адресов остаётся вашей нагрузкой, и отвечаете за неё вы.
Что говорит закон: светофор для парсинга в России
Отдельного закона о парсинге в России нет. Всё решают три вещи: какие данные вы берёте, как вы их получаете и что потом с ними делаете. Авторы курса сводят легальную работу к трём принципам: изучить документацию и условия использования до первой строки кода, соблюдать лимиты и правила доступа, уважать данные и ограничения владельца. Юридическую оценку даёт юрист, я смотрю на задачу глазами разработчика, поэтому спорные случаи мы согласуем с юристом клиента. Вот как я оцениваю риски на старте.
| Что собираем | Риск | На что опираться |
|---|---|---|
| Официальный API в рамках условий | Низкий | Документация и соглашение сервиса: цели, лимиты, коммерческое использование, срок хранения данных. |
| Свои данные из своего кабинета | Низкий | Заказы, остатки, реклама, сделки в CRM принадлежат вам. Важно только правильно хранить ключи. |
| Открытые цены и наличие | Средний | Проверьте пользовательское соглашение сайта и не создавайте нагрузку. Базу данных от 10 000 записей закон охраняет (ст. 1334 ГК РФ): извлекать её существенную часть без разрешения нельзя, как и систематически выбирать мелкие части (ст. 1335.1). |
| Тексты, фото, описания товаров | Высокий | Это объекты авторского права. Анализировать можно, публиковать у себя без разрешения нельзя. |
| Персональные данные | Высокий | ФИО, телефоны, профили в соцсетях подпадают под 152-ФЗ. Открытый профиль не означает согласия на сбор. С 11 декабря 2024 года действует статья 272.1 УК РФ о незаконном сборе и хранении компьютерной информации с персональными данными. |
| Обход защиты и чужие аккаунты | Высокий | Взлом авторизации, чужие ключи и сессии подпадают под неправомерный доступ к информации (ст. 272 УК РФ). |
Самое известное дело о сборе данных в России: ВКонтакте против Double Data. Соцсеть в 2017 году подала иск о незаконном сборе данных пользователей, решения несколько раз отменялись в разных инстанциях, и в сентябре 2022 года спор закончился мировым соглашением в Суде по интеллектуальным правам. Шесть лет судов обходятся дороже любой выгрузки, поэтому юридическую часть мы проверяем до разработки.
Если выгрузка всё же хранит персональные данные, например контакты клиентов из CRM, базы должны находиться в России. Серверы под это требование мы разворачиваем в Yandex Cloud и VK Cloud.
Парсер как рабочий инструмент
Скрипт, который один раз красиво вывел данные на экран, ещё не выгрузка. Рабочий инструмент запускается сам по расписанию, переживает сбои, складывает данные в базу и сообщает, если что-то пошло не так. Финальный урок курса как раз об этом: планировщики, базы данных, Docker, журналы и документация.
Каждый час, ночью или по событию
Одна сессия, паузы, повторы при сбоях
Код, тип ответа, полнота страниц
Типы, даты, деньги, пустые значения
PostgreSQL, история изменений
1С, сайт на Битриксе, CRM, отчёт
Журнал и уведомление в мессенджер
Несколько вещей я закладываю в любую выгрузку. Файл результата записывается целиком или не записывается вовсе, чтобы сбой питания не оставил обрезанный прайс вместо вчерашнего. Проект упакован в Docker и одинаково запускается на ноутбуке и на сервере. В README описано, какие переменные нужны и как запустить выгрузку, иначе через полгода её не поднимет никто, включая автора.
Так выглядит основа бережной выгрузки по страницам: одно соединение, повторы только временных сбоев, пауза под лимит и остановка по флагу «есть ещё».
Типовые схемы, которые мы собираем
- Раз в час забираем цены и остатки нескольких поставщиков по их API или фидам.
- Обновляем только изменившиеся позиции, пропавшие снимаем с продажи.
- Менеджер получает список битых артикулов и позиций без цены.
- Через API продавца забираем новые заказы Ozon и Wildberries.
- Передаём их в 1С или МойСклад и сверяем остатки.
- При расхождении отправляем уведомление в рабочий чат.
- Ночью выгружаем расходы из Яндекс Директа и визиты из Метрики.
- Добавляем сделки и оплаты из CRM за закрытый день.
- Собираем таблицу или дашборд со стоимостью заявки и продажи.
Чек-лист ТЗ на выгрузку данных
Этот список я прохожу с заказчиком на первой встрече. Отметьте то, что у вас уже есть, и посмотрите, насколько задача готова к разработке.
- Известен источник, есть документация API или договорённость с поставщиком
- Прочитаны условия использования, автоматический сбор разрешён
- Определены поля и формат результата, есть пример готовой строки
- Понятно, как часто обновлять данные и за какой период
- Известны лимиты и тариф API
- Доступ выдан отдельному пользователю с минимальными правами
- Ключи хранятся вне кода, есть список, где какой ключ используется
- Решено, что делать с пустыми значениями, валютами и копейками
- Персональные данные не собираются или есть правовое основание и сервер в России
- Сбой не затирает старые данные, есть повторы и журнал
- Если выгрузка не прошла, ответственный получает уведомление
- Назначен человек со стороны бизнеса, который проверяет результат
Как мы работаем и сколько это стоит
Разбор задачи
Смотрим источник, документацию, условия использования и лимиты. Проверяем, есть ли готовая выгрузка у поставщика.
Пробный запрос
Получаем реальные ответы, считаем число запросов, время и трафик, фиксируем поля результата.
Смета и ТЗ
Оценку объёма даём письменно до начала работ, вместе с перечнем рисков.
Разработка
Выгрузка, нормализация, хранилище, передача в 1С, на сайт или в CRM, журнал и уведомления.
Запуск и поддержка
Разворачиваем на сервере, передаём документацию и доступы, следим за изменениями API.
| Услуга | Что входит | Цена |
|---|---|---|
| Разовые задачи по часам | Скрипт выгрузки, доработка существующей интеграции | от 3 500 ₽/час |
| API и интеграции | Регулярная выгрузка, серверная часть, база данных, документация, срок от 2 недель | от 60 000 ₽ |
| Бизнес-система | CRM, портал или кабинет с серверной логикой | от 150 000 ₽ |
| Интеграция сайта на 1С-Битрикс с 1С | Обмен каталогом, ценами, остатками и заказами | от 30 000 ₽ |
| Интеграция с Битрикс24 | Заявки и сделки из сайта и внешних сервисов | от 20 000 ₽ |
| Модуль для 1С-Битрикс | Например, импорт каталога поставщика по расписанию | от 35 000 ₽ |
| Telegram-бот | Уведомления о сбоях, заказах и расхождениях | от 30 000 ₽ |
| Сервер в Yandex Cloud | Инфраструктура в России под требования 152-ФЗ | от 30 000 ₽ |
| CI/CD и Docker | Сборка и выкладка без ручных действий | от 40 000 ₽ |
| Поддержка сайта на 1С-Битрикс | Обновления, интеграции, исправления | от 10 000 ₽/мес |
Частые вопросы
Это автоматическое получение данных из сервиса через его программный интерфейс. Программа отправляет запрос, сервис отвечает данными в формате JSON, а выгрузка приводит их к нужному виду и передаёт в таблицу, базу, 1С, CRM или на сайт.
API отдаёт готовые данные, работает быстрее и не ломается от смены дизайна. Правила доступа описаны в документации, поэтому юридически такой сбор понятнее. Страницы разбирают, только когда API и готовой выгрузки нет.
Отдельного запрета на сбор открытых цен нет, но нужно соблюдать пользовательское соглашение сайта, не создавать нагрузку и помнить, что база данных от 10 000 записей охраняется статьями 1334 и 1335.1 ГК РФ. Тексты и фото публиковать у себя нельзя. Спорные случаи лучше согласовать с юристом.
Это персональные данные, и на них распространяется 152-ФЗ. Открытый профиль не означает согласия на сбор. С 11 декабря 2024 года за незаконный сбор и хранение таких данных предусмотрена уголовная ответственность по статье 272.1 УК РФ. Без правового основания мы такие задачи не берём.
Разовый скрипт оцениваем по часам, от 3 500 ₽ в час. Регулярная интеграция с хранилищем и документацией стоит от 60 000 ₽ и занимает от двух недель. Интеграция сайта на 1С-Битрикс с 1С от 30 000 ₽. Точную смету даём после пробного запроса к API.
Это определяют лимиты API и объём данных. Цены и остатки обычно обновляют раз в час или чаще, отчёты раз в сутки по закрытому дню. Если сервис умеет отдавать только изменённые записи или присылать уведомления, обновлять можно почти мгновенно без лишней нагрузки.
Самые частые причины: истёк или отозван ключ, сервис изменил поле в ответе, выгрузка упёрлась в лимит, сервер вернул HTML вместо данных, в записи пришло пустое значение. Хорошая выгрузка пишет журнал и сообщает о сбое, а старые данные при этом остаются на месте.
Для официального API обычно нет: хватает пауз под лимит и правильной обработки ответов. Прокси помогают, когда лимит считается по адресу или нужны региональные данные. Условия сервиса они не отменяют.
В переменных окружения на сервере или в файле .env, который не попадает в репозиторий. Никогда в адресе запроса и в коде. Ключ, попавший в публичный доступ, отзывают и выпускают новый.
Да. Мы делаем модули для 1С-Битрикс, которые по расписанию забирают каталог и цены поставщика, и настраиваем обмен сайта с 1С и Битрикс24. Если данные нужны нескольким системам, ставим промежуточную базу и раздаём их оттуда.
Расскажите, откуда и куда нужно передавать данные. Сделаем пробный запрос к API, посчитаем время и стоимость и соберём выгрузку с журналом, повторами и уведомлениями.
