Моя первая реализация REST API сервиса для парсинга маркетплейсов с автоматизацией браузера на Rust. Проект задумывался как многопользовательский публичный сервис для парсинга.
Дата публикации: 1/16/25
RustScraper API - это мощный инструмент для парсинга данных о товарах с популярных маркетплейсов. API разработано на языке Rust, что обеспечивает высокую производительность и надежность работы.
- Поддержка крупнейших маркетплейсов:
- Гибкая система обхода блокировок через прокси-серверы
- Поддержка пользовательских cookies для сохранения настроек сессии
- WebSocket подключение для отслеживания статуса парсинга в реальном времени
- Простой и понятный REST API интерфейс
- Детальная валидация входящих данных
- Система очередей для распределения нагрузки
Для начала работы с API необходимо получить тестовый токен через метод /test-token. Тестовый токен предоставляется автоматически для уникальных IP-адресов и имеет ограниченный срок действия.
Заказ на парсинг состоит из трех основных компонентов:
- Список товаров (
products) - Пул прокси-серверов (
proxyPool) - Пользовательские cookies (
cookies)
Поддерживается два формата указания товаров:
- Короткий формат:
маркет/idwb/145700662(Wildberries)oz/1736756863(Ozon)ym/1732949807-100352880819(Яндекс.Маркет)mm/100065768905(МегаМаркет)
- Полный URL товара с маркетплейса
Процесс парсинга состоит из следующих шагов:
- Валидация заказа через метод
/valid-order - Отправка заказа методом
/order - Получение
order_hashдля отслеживания статуса - Мониторинг выполнения через REST API или WebSocket
API предоставляет два механизма защиты от блокировок:
-
Прокси-пул (ProxyPool):
- Позволяет распределять запросы через разные IP-адреса
- Поддерживает формат:
USERNAME:PASSWORD@HOST:PORT - Возможность указания нескольких прокси-серверов
-
Пользовательские Cookies:
- Сохранение настроек авторизации
- Поддержка геолокационных настроек
- Сохранение пунктов выдачи заказов
- Персонализированные настройки отображения цен
Каждый токен имеет следующие ограничения:
- Лимит на количество товаров в заказе
- Лимит на количество одновременных обработок
- Ограничение времени жизни токена (TTL)
- Лимит на количество WebSocket подключений
Получение статуса выполнения через периодические запросы к методу /task/{order_hash}
Установка постоянного соединения через /task-ws/{order_hash} для получения обновлений в реальном времени
API использует унифицированную систему кодов ошибок. Каждая ошибка содержит:
- Текстовое описание (
error) - Числовой код (
code) - Информативное сообщение (
message)
Подробное описание всех возможных ошибок представлено в таблице ApiError.
| Название | Описание | Код | HTTP код |
|---|---|---|---|
| UnknownError | Неизвестная ошибка сервера | 0 | 500 |
| MissingAuthorizationHeader | Отсутствует заголовок авторизации | 102 | 400 |
| MalformedAuthorizationHeader | Неверный формат заголовка авторизации. Ожидается формат 'Bearer ' | 103 | 401 |
| InvalidAccessToken | Предоставлен недействительный токен доступа | 104 | 401 |
| AccessTokenExpired | Срок действия токена доступа истек | 105 | 401 |
| MissingUrlQueryParameter | Отсутствует обязательный URL-параметр запроса | 200 | 400 |
| InvalidUrlQueryParameter | Недопустимое значение URL-параметра запроса | 201 | 400 |
| InvalidOrderParameter | Недопустимое значение параметра заказа | 202 | 400 |
| InvalidOrderFormat | Не удалось десериализовать тело запроса в объект заказа | 203 | 400 |
| EmptyRequestBody | Тело запроса пусто. Ожидается определенная структура | 204 | 400 |
| EmptyOrder | Отправленный заказ пуст | 205 | 400 |
| QueueOverflow | Очередь обработчика заполнена. Достигнуто максимальное количество задач | 300 | 409 |
| ProductLimitExceeded | Заказ превышает максимальный лимит продуктов | 301 | 409 |
| ConcurrencyLimitExceeded | Токен превысил лимит одновременной обработки | 302 | 409 |
| DuplicateTask | Задача с указанным order_hash уже существует | 303 | 409 |
| WebSocketLimitExceeded | Невозможно установить новое WebSocket-соединение, так как сервер достиг максимального лимита одновременных подключений |
304 | 409 |
| AccessRestricted | Доступ к методу ограничен | 305 | 409 |
| TokenDoesNotExist | Токен не существует | 400 | 404 |
| TaskNotFound | Задача с указанным order_hash не существует | 401 | 404 |
| PathNotFound | Запрошенный путь не найден | 404 | 404 |
| TaskSendFailure | Не удалось отправить задачу обработчику | 500 | 500 |
| ReqwestSessionError | Ошибка сессии запроса | 501 | 500 |
| DatabaseError | Сбой транзакции базы данных | 502 | 500 |
| SerializationError | Не удалось сериализовать объект | 503 | 500 |
https://github.com/nlkli/ScraperApiService/blob/main/src/api/doc.rs