Зачем писать парсер Авито самому, если сервисов полно?
Коротко: готовый сервис удобен, пока твоя задача совпадает с его кнопками. Как только нужно своё - сравнить цены в трёх городах, отфильтровать объявления по словам в описании, складывать историю в свою таблицу и присылать в Telegram только то, что подешевело, - проще собрать инструмент под себя. С Claude Code это вечер работы, и код писать руками не придётся.
Открываешь выдачу по «парсер авито» и видишь одно и то же: сервисы с тарифами, подборки «топ-7», репозиторий на GitHub. Всё это работает. Вопрос в том, что именно ты хочешь получить. Если собираешь парсер не себе, а на заказ, оформление разобрано в статье самозанятый программист: НПД или ИП, а договор, аванс и чек - в статье как принимать оплату самозанятым.
Типовые задачи, с которыми ко мне приходят:
- следить за ценами конкурентов по своей категории и видеть, кто демпингует;
- ловить новые объявления по узкому запросу раньше других, например б/у технику под перепродажу;
- понять рынок перед запуском: сколько объявлений, какой разброс цен, в каких городах;
- держать под рукой свои объявления со статистикой, не заходя в кабинет.
Последней задаче парсер вообще не нужен, у Авито на неё есть официальный API. Для первых трёх нужен сбор открытых страниц, и здесь начинаются правила площадки. Разберу обе дороги, а потом покажу, что именно говорить агенту на каждом шаге.
Без установленного Claude Code дальше не пойти, поэтому сначала установка, а что вообще такое агент и чем он отличается от чата, разобрано в словаре.
Сам парсер - маленький проект. Если заказчик - компания, чек с её ИНН и документы для бухгалтерии разобраны в статье самозанятый и ООО. Основная работа в нём - правила, которые ты задаёшь агенту: что брать, как часто ходить, где остановиться. Этому в курсе посвящён отдельный урок «Правила агента: CLAUDE.md и AGENTS.md», он открывается после подключения к ClaudeBase.
С какого шага начинать парсер
Коротко: от того, где ты стоишь, зависит, с какого шага начинать. Четыре типичных положения - и куда из каждого идти дальше.
- Claude Code не установлен, терминал страшный. Сначала установка и один простой проект на пробу, парсер потом. На него нужен агент, который уже умеет читать и создавать файлы в папке.
- Агент работает, но нужны только свои объявления и их статистика. Иди сразу в раздел про официальный API: это проще, стабильнее и без риска блокировки.
- Нужны чужие цены и объявления по запросу. Читай всё подряд, особенно правила частоты и список того, что собирать нельзя.
- Парсер уже есть, но ломается. Прыгай в раздел с ошибками: там три текста, которые ты скорее всего уже видел.
Что даёт официальный API Авито, а чего нет?
Коротко: API Авито отвечает по адресу api.avito.ru и работает с данными того аккаунта, который получил токен. Свои объявления, статистика, сообщения, автозагрузка - да. Чужие объявления и выдача по поисковому запросу - нет. Это главная развилка всей темы.
Каталог методов лежит на developers.avito.ru. Когда я проверял его для этой статьи, страница документации отвечала экраном капчи на сервисные адреса, а сам API отвечал нормально: запрос к /core/v1/items без токена возвращает 401, запрос к /token с чужими ключами - понятную ошибку авторизации.
Как это устроено по шагам:
Ключи. В настройках аккаунта Авито создаётся приложение, за ним закрепляются client_id и client_secret. Это пара логин-пароль для твоего робота.
Токен. Робот отправляет ключи на метод /token со схемой client_credentials и получает токен доступа. Дальше каждый запрос идёт с заголовком Authorization: Bearer и этим токеном.
Данные. Метод GET /core/v1/items в документации описан так: возвращает список объявлений авторизованного пользователя - статус, категорию и ссылку на сайте. Лимит там же: не больше 25 запросов в минуту. Метод статистики по списку объявлений отдаёт уникальные просмотры, контакты и добавления в избранное, но только по твоим объявлениям.
То есть если задача звучит как «хочу видеть свои объявления и их просмотры в одной таблице», парсить сайт не надо. Попроси агента так:
Подключи официальный API Авито. Ключи client_id и client_secret
лежат в файле .env, в код их не вставляй и в ответах не печатай.
Получи токен через /token, выгрузи мои объявления через
/core/v1/items и статистику просмотров. Соблюдай лимит 25 запросов
в минуту. Результат сложи в avito.sqlite, одна строка на объявление
на каждую дату.
Ключи кладёшь в .env сам и в чат агенту их не вставляешь: переписка хранится, и ключ в ней будет лежать открытым текстом.
Как парсить чужие объявления и не нарушить правила площадки?
Коротко: собирать только открытые страницы, медленно, без телефонов и имён, и останавливаться на первой же капче. Обход защиты условия Авито запрещают прямым текстом.
Три источника, на которые я опираюсь, и все три открыты:
Условия использования Авито. В разделе запретов есть пункт 6.4: пользователю нельзя «предпринимать действия, направленные на нарушение нормального функционирования, обход технических ограничений Авито». Капча, ограничение по IP, лимит на частоту - как раз технические ограничения. Значит, сервисы разгадывания капчи и ротация сотни прокси, чтобы блок не сработал, - мимо. Я не юрист и за чужой случай не отвечу, но эту границу видно без юриста.
robots.txt Авито. Файл открыт всем, и в блоке для любых роботов (User-agent: *) закрыты, среди прочего, раздел /items/phone и служебный /api/. Задержка между запросами (Crawl-delay) не указана, так что «безопасной частоты» от площадки нет.
Закон о персональных данных. Статья 3 закона 152-ФЗ определяет персональные данные как любую информацию, относящуюся к прямо или косвенно определённому физическому лицу. Имя продавца и его телефон - как раз она. Для анализа рынка они и не нужны: цена, заголовок, город, дата, ссылка.
Из этого складываются правила, которые я записываю агенту в проект до первой строки кода:
- одна страница за раз, пауза несколько секунд со случайным разбросом;
- лимит страниц за один прогон, например 20;
- при капче, странице «Доступ ограничен» или коде 429 - остановиться и сообщить мне;
- никаких телефонов, имён продавцов и фото людей;
- сервисы разгадывания капчи и смена адресов ради обхода блокировки под запретом.
Паузы и лимиты тут - моя привычка, Авито таких цифр не публикует. Суть в том, чтобы твой робот нагружал сайт не сильнее, чем человек, который листает выдачу.
С какого промпта начать парсер?
Коротко: начать в режиме плана, чтобы агент сначала расспросил и предложил устройство, а потом уже создавал файлы. Правила частоты и запреты записать в CLAUDE.md, тогда агент будет помнить их в каждой следующей сессии.
Режим плана. По документации Claude Code, в режиме плана агент читает файлы и предлагает план, но ничего не правит, пока ты не одобришь. Включается он клавишами Shift+Tab: нажимай, пока в строке состояния не появится ⏸ plan mode on. Другие клавиши и команды собраны в шпаргалке по Claude Code.
Первое сообщение я пишу примерно так:
Хочу парсер объявлений Авито для себя. Задача: раз в сутки
собирать объявления по запросу «посудомоечная машина» в Москве
и Подмосковье, поля - заголовок, цена, город, дата публикации,
ссылка. Телефоны и имена продавцов не собирать.
Правила: одна страница за раз, пауза 4-9 секунд, не больше
20 страниц за прогон. На капче, странице «Доступ ограничен»
или ответе 429 - остановиться и написать мне.
Хранение: SQLite, у каждой записи дата сбора.
Сначала задай вопросы, потом предложи план. Файлы пока не создавай.
Хороший промпт здесь держится на конкретике: какие поля, откуда, как часто, где стоп. Агент обычно переспросит, нужен ли браузер или хватит обычных запросов, куда присылать уведомления и что делать с дублями.
CLAUDE.md. Когда план согласован, попроси: «Запиши правила сбора из нашего разговора в CLAUDE.md проекта». Файл читается в начале каждой сессии, и через неделю, когда попросишь «добавь ещё один город», агент не забудет про паузы. Как устроен этот файл и что в него писать, разобрано в статье про CLAUDE.md. В документации есть и короткий путь: команда /init сама создаёт стартовый CLAUDE.md, изучив проект.
Правила пишутся один раз, а работают в каждом проекте. Мои собственные настройки Claude Code и Codex - что агенту можно без спроса, а какие команды закрыты - лежат в материале «Настройки Claude Code, Codex и VS Code» внутри базы ClaudeBase, там же урок про разрешения и рабочее окружение.
Я сам плачу за Claude картой для подписок «Плати по миру»: выпускается за пару минут, пополняется рублями через СБП. Оформить карту
Как проверить парсер до первого большого прогона?
Коротко: собрать разбор на сохранённой странице. Тогда агент отлаживается сколько угодно раз, не делая ни одного запроса к Авито, а поломку вёрстки ты потом поймаешь упавшим тестом.
Это место, где новички теряют больше всего времени. Агент пишет разбор, запускает на живой выдаче, что-то не находит, правит, запускает снова. Десять итераций - десять заходов на Авито подряд, и адрес уже под подозрением.
Порядок, который работает лучше:
- Открой нужную выдачу в браузере и сохрани страницу в папку проекта, например
samples/vydacha.html. - Скажи агенту: «Напиши разбор этой страницы и тест на нём. Тест должен проверять, что нашлось больше нуля объявлений и у каждого есть цена и ссылка».
- Когда тест зелёный, разреши один живой прогон на одной странице.
- Открой таблицу и сверь три-четыре строки с сайтом глазами.
Последний пункт не пропускай. Парсер, который тихо пишет пустые цены, хуже парсера, который падает: ты неделю копишь мусор и думаешь, что копишь данные.
Что делать с данными после сбора?
Коротко: хранить всю историю. Одна строка на объявление на каждую дату сбора - и ты видишь, как менялись цены, какие объявления ушли и какие появились.
Я прошу агента класть всё в SQLite: одна база в одном файле, ставить ничего не надо, открывается любой программой для таблиц после выгрузки в CSV. Структура простая: ссылка на объявление как ключ, поля, дата сбора.
Дальше включается то, ради чего всё затевалось. Примеры задач, которые агент доделывает одной фразой:
- «Выгрузи в CSV объявления, у которых цена упала больше чем на 10% за неделю»;
- «Посчитай медианную цену по городам на сегодня»;
- «Присылай мне в Telegram новые объявления дешевле 15 000 рублей» - понадобится бот и его токен, их тоже храни в
.env.
Запуск по расписанию ставится последним. Сначала неделя ручных прогонов, чтобы увидеть, как парсер ведёт себя на живых данных.
Частые ошибки парсера
Коротко: три текста, которые встречаются почти у всех. Два из них видны сразу, третий прячется и портит данные молча.
«Доступ ограничен: проблема с IP»
Страница блокировки Авито. Дальше там сказано: «С него идёт очень много запросов - как если бы вы разом открывали десятки вкладок или слишком часто обновляли страницу». Я поймал её, пока проверял документацию для этой статьи. Лечение одно: остановиться, увеличить паузы, уменьшить порцию. Смена адреса, чтобы продолжить с той же частотой, как раз и будет обходом ограничения.
“error”: “unauthorized_client”
Ответ метода /token официального API, дословно: The client is not authorized to request a token using this method. Значит, ключи неверные или приложение не имеет права на такую схему авторизации. Проверь, что client_id и client_secret скопированы из настроек того самого аккаунта, и что в .env нет лишних пробелов и кавычек.
Таблица заполняется, а цены пустые
Ошибки нет, и это самое неприятное. Авито поменял вёрстку, разбор ищет старые метки и молча пишет пустоту. Помогает тест на образце страницы из раздела выше плюс правило в CLAUDE.md: «если у больше чем половины объявлений нет цены - прервать прогон и сообщить». Потом сохраняешь свежую страницу, показываешь агенту упавший тест, и он чинит разбор.
Чек-лист перед запуском по расписанию
Коротко: пройди по пунктам перед тем, как ставить парсер на расписание.
- Понял, нужны тебе свои данные (официальный API) или чужие объявления (открытые страницы).
- Правила сбора записаны в CLAUDE.md: пауза, лимит страниц, остановка на капче и коде 429.
- В полях нет телефонов, имён продавцов и фото людей.
- Ключи API и токен бота лежат в
.env, а не в коде и не в переписке. - Разбор проверен тестом на сохранённой странице.
- Первый живой прогон сделан на одной странице, строки сверены с сайтом глазами.
- У каждой записи есть дата сбора, повторный прогон не затирает историю.
Парсер Авито - хороший первый проект, потому что в нём всё настоящее: чужой сайт, лимиты, данные, которые ломаются. Два готовых парсера, организаций и Telegram, лежат в базе ClaudeBase. На них видно, как устроен такой инструмент изнутри, а агент берёт их из базы сам, когда ты собираешь свой.