Парсер ВКонтакте: как собирать товары и цены
Владислав КовнеровАналитик данных и разработчик
Товары и цены ВКонтакте собирают официальным API. За каталог товаров сообщества отвечает метод market.get: до 200 позиций за запрос, и в каждом ответе название, цена, наличие и фото. Цена приходит в сотых долях валюты, то есть в копейках, и пересчитывается в рубли одной строкой кода. Скриптовый обход витрины по HTML-страницам запрещён правилами, а API открыт для работы при соблюдении лимитов. Для наблюдения за ценами каталог сохраняют снимками с датой по расписанию, и из снимков складывается история.
Такой парсер я делаю под заказ в услуге парсинга ВКонтакте: выгружаю товары сообществ и магазинов в таблицу или базу, а для мониторинга цен настраиваю сбор по расписанию.
Как устроены товары ВК
Товары живут в сообществах. У сообщества есть каталог, внутри каталога позиции собраны в подборки, и всё это отдаёт раздел Market в API. Методов четыре: market.get возвращает список товаров сообщества, market.getById достаёт позиции по идентификаторам, market.search ищет по каталогу с фильтрами, market.getAlbums перечисляет подборки.
В ответе товар приходит объектом с полями id, owner_id, title, description, price, thumb_photo, photos, availability, category и albums_ids. Цена идёт объектом price: amount строкой в сотых долях валюты (100000 означает 1000 рублей), currency с кодом валюты, где 643 это рубль, и text с готовой записью цены для вывода. Рядом бывает old_amount_text, текстовая запись старой цены.
Поля date и views_count вернут только администратору сообщества-владельца, внешнему сборщику их не отдают. Ждать их в ответе по чужому каталогу бессмысленно.
Пошагово: как собрать товары и цены
Сбор каталога умещается в шесть шагов.
- Составьте список сообществ. Идентификатор сообщества идёт в owner_id со знаком минус: owner_id=-1 соответствует club1. Минус сообщает API, что владелец каталога сообщество, а не человек.
- Получите ключ доступа. Запрос market.get без ключа возвращает ошибку 15 «Access denied: token required». Ключи бывают трёх типов: пользователя, сообщества и сервисный, передаётся ключ в заголовке Authorization: Bearer.
- Заберите структуру каталога. market.getAlbums возвращает подборки товаров, по ним удобно разложить выгрузку.
- Пройдите каталог методом market.get. Параметр count принимает максимум 200 позиций и по умолчанию равен 100, offset двигает выборку дальше. Фильтры date_from и date_to в формате YYYY-MM-DD отбирают товары по дате обновления, а extended=1 добавляет расширенные поля вроде likes и photos.
- Отфильтруйте нужное методом market.search. Он ищет по строке q внутри каталога одного сообщества и ограничивает цену параметрами price_from и price_to в сотых долях валюты, в документации пример 100000. Сортировка задаётся кодом: 0 пользовательская, 1 по дате добавления, 2 по цене, 3 по популярности; отдельный фильтр отсекает неактивные товары.
- Сохраните снимок с датой. Строка без даты не станет историей цен. Как из таких снимков собирают регулярный мониторинг, я разбирал в статье как устроен парсинг цен конкурентов.
Лимиты API и как в них укладываться
Скорость запросов ограничена типом ключа.
| Ключ доступа | Запросов в секунду |
|---|---|
| Пользователя | 3 |
| Сообщества | 20 |
| Сервисный, до 10 000 пользователей приложения | 5 |
| Сервисный, до 100 000 | 20 |
| Сервисный, до 500 000 | 40 |
| Сервисный, до 1 000 000 | 50 |
| Сервисный, свыше 1 000 000 | 60 |
Превышение лимита возвращает ошибку 6 «Too many requests per second». Точные количественные лимиты однотипных вызовов ВКонтакте не раскрывает: при их превышении метод на время становится недоступным или начинает требовать капчу, и касается это только превышенного метода, остальные продолжают отвечать. На практике в лимит укладываются паузами между проходами по каталогу.
Что запрещают правила
Правила сайта отвечают на вопрос о парсинге прямо. Пункт 6.3.9 запрещает без специального разрешения Администрации Сайта «использовать автоматизированные скрипты (программы, боты, краулеры) для сбора информации на Сайте и/или взаимодействия с Сайтом и его функциональностью». Соседние пункты закрывают остальное: 6.3.7 говорит о программах и действиях, направленных на нарушение нормального функционирования сайта, 6.3.11 о незаконном сборе и обработке персональных данных других лиц. Контент сайта охраняется исключительными правами, пункты 7.1.1 и 7.1.2 допускают копирование только в случаях, установленных правилами и законодательством.
Отсюда рабочая граница. Скриптовый обход HTML-страниц без разрешения нарушает правила. Официальный API при соблюдении лимитов разрешён. Товарные данные, то есть название, цена, фото и наличие, персональными не являются. Профили людей и контакты продавцов-физлиц не собирают.
Отдельная путаница живёт вокруг robots.txt. Каталог товаров и страницы сообществ от индексации не закрыты, закрыты личные кабинеты, поиск и часть служебных адресов с параметрами, а офлайн-краулерам вроде Wget, WebZIP, Teleport Pro, WebSnake, Offline Explorer и ia_archiver вход запрещён полностью. При этом robots.txt регулирует индексацию, а не сбор данных: разрешение на парсинг он не выдаёт. Общий разбор темы читайте в статье легален ли парсинг.
Частые ошибки
- Парсить HTML вместо API. Данные те же, но обход страниц сайта правилами запрещён, а API отдаёт их сам и в структурированном виде.
- Превышать лимиты. Ошибка 6 «Too many requests per second» лечится паузами между запросами, а не повтором в лоб.
- Хранить выгрузку без дат. Один снимок отвечает на вопрос «сколько стоит сейчас», для динамики каждой строке нужна дата.
- Ждать поля date и views_count у чужих товаров. Эти поля приходят только администратору сообщества-владельца.
- Собирать профили людей и контакты продавцов-физлиц. Красная линия правил, за товарными данными она не нужна.
- Пугаться ошибки 1526 «Market services are disabled». Она означает, что у сообщества выключен раздел товаров. Такие сообщества просто пропускают.
Коротко
Товары и цены ВКонтакте собирают официальным API: market.get по идентификатору сообщества, до 200 позиций за запрос, цена в сотых долях валюты, наличие и фото в том же ответе. Скорость задаёт тип ключа, от 3 до 60 запросов в секунду, и в лимит укладываются паузами. Правила запрещают скриптовый обход страниц, но не работу через API, а профили людей остаются за границей задачи. Если собирать нужно и в Telegram, посмотрите парсер Telegram-каналов.
Частые вопросы
- Как собрать товары из группы ВКонтакте?
- Официальным API. Метод market.get вызывают с owner_id сообщества со знаком минус и забирают до 200 позиций за запрос, дальше выборку двигают параметром offset. Без ключа доступа метод не ответит.
- Можно ли следить за ценами конкурентов во ВКонтакте?
- Да. Товарные данные публичны и приходят из API. Каталог сохраняют снимками с датой по расписанию, и из снимков складывается история цен по каждому товару.
- Нужен ли токен для парсера ВКонтакте?
- Да. Запрос market.get без ключа возвращает ошибку «Access denied: token required». Тип ключа заодно задаёт лимит запросов в секунду.
- Сколько запросов в секунду разрешает API ВКонтакте?
- 3 для ключа пользователя и 20 для ключа сообщества. Сервисный ключ растёт с числом пользователей приложения: 5 запросов в секунду до 10 000 пользователей, 20 до 100 000, 40 до 500 000, 50 до 1 000 000 и 60 свыше. Превышение возвращает ошибку «Too many requests per second».
- Законно ли собирать товары из ВКонтакте?
- Товарные данные (название, цена, фото, наличие) персональными не являются, и API для их сбора разрешён. Скриптовый обход страниц сайта без разрешения Администрации запрещён правилами. Профили людей и контакты продавцов-физлиц не собирают.
- Что собирает парсер каталога товаров ВКонтакте?
- Каталог сообщества целиком. Метод market.get отдаёт позиции с полями title, price, availability и thumb_photo, а market.getAlbums перечисляет подборки, в которых позиции собраны. Для мониторинга каталог сохраняют снимками по расписанию, и из снимков складывается история цен. От простого списка товаров такую выгрузку отличают подборки и снимки.
- Как парсер товаров ВКонтакте выгружает цены в таблицу?
- Цена приходит объектом price с полем amount в сотых долях валюты: 100000 означает 1000 рублей. Пересчёт в рубли умещается в одну строку кода, готовая таблица выгружается в CSV или Google Sheets, а для мониторинга цен сбор запускают по расписанию. Такую выгрузку я делаю под заказ в услуге парсинга ВКонтакте.
Читайте также
- Парсинг Amazon: как собирать цены, отзывы и Buy BoxПарсинг Amazon собирает цены, остатки, отзывы и Buy Box по списку ASIN в таблицу или базу по расписанию. Как устроен сбор и что пишут правила Амазона.
- Ошибка парсинга цены: 7 причин и как исправитьПарсер вернул пустое поле или кусок карточки вместо числа. Семь причин: вёрстка, антибот, скрипт, кэш. Проверки до записи не пустят мусор в таблицу цен.