Инструменты11 минобновлено

Свой парсер Авито через Claude Code

Зачем писать парсер Авито самому, если сервисов полно?

Коротко: готовый сервис удобен, пока твоя задача совпадает с его кнопками. Как только нужно своё - сравнить цены в трёх городах, отфильтровать объявления по словам в описании, складывать историю в свою таблицу и присылать в Telegram только то, что подешевело, - проще собрать инструмент под себя. С Claude Code это вечер работы, и код писать руками не придётся.

Открываешь выдачу по «парсер авито» и видишь одно и то же: сервисы с тарифами, подборки «топ-7», репозиторий на GitHub. Всё это работает. Вопрос в том, что именно ты хочешь получить. Если собираешь парсер не себе, а на заказ, оформление разобрано в статье самозанятый программист: НПД или ИП, а договор, аванс и чек - в статье как принимать оплату самозанятым.

Типовые задачи, с которыми ко мне приходят:

  • следить за ценами конкурентов по своей категории и видеть, кто демпингует;
  • ловить новые объявления по узкому запросу раньше других, например б/у технику под перепродажу;
  • понять рынок перед запуском: сколько объявлений, какой разброс цен, в каких городах;
  • держать под рукой свои объявления со статистикой, не заходя в кабинет.

Последней задаче парсер вообще не нужен, у Авито на неё есть официальный API. Для первых трёх нужен сбор открытых страниц, и здесь начинаются правила площадки. Разберу обе дороги, а потом покажу, что именно говорить агенту на каждом шаге.

Без установленного Claude Code дальше не пойти, поэтому сначала установка, а что вообще такое агент и чем он отличается от чата, разобрано в словаре.

Сам парсер - маленький проект. Если заказчик - компания, чек с её ИНН и документы для бухгалтерии разобраны в статье самозанятый и ООО. Основная работа в нём - правила, которые ты задаёшь агенту: что брать, как часто ходить, где остановиться. Этому в курсе посвящён отдельный урок «Правила агента: CLAUDE.md и AGENTS.md», он открывается после подключения к ClaudeBase.

С какого шага начинать парсер

Коротко: от того, где ты стоишь, зависит, с какого шага начинать. Четыре типичных положения - и куда из каждого идти дальше.

  1. Claude Code не установлен, терминал страшный. Сначала установка и один простой проект на пробу, парсер потом. На него нужен агент, который уже умеет читать и создавать файлы в папке.
  2. Агент работает, но нужны только свои объявления и их статистика. Иди сразу в раздел про официальный API: это проще, стабильнее и без риска блокировки.
  3. Нужны чужие цены и объявления по запросу. Читай всё подряд, особенно правила частоты и список того, что собирать нельзя.
  4. Парсер уже есть, но ломается. Прыгай в раздел с ошибками: там три текста, которые ты скорее всего уже видел.

Что даёт официальный 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 картой для подписок «Плати по миру»: выпускается за пару минут, пополняется рублями через СБП. Оформить карту

Как проверить парсер до первого большого прогона?

Коротко: собрать разбор на сохранённой странице. Тогда агент отлаживается сколько угодно раз, не делая ни одного запроса к Авито, а поломку вёрстки ты потом поймаешь упавшим тестом.

Это место, где новички теряют больше всего времени. Агент пишет разбор, запускает на живой выдаче, что-то не находит, правит, запускает снова. Десять итераций - десять заходов на Авито подряд, и адрес уже под подозрением.

Порядок, который работает лучше:

  1. Открой нужную выдачу в браузере и сохрани страницу в папку проекта, например samples/vydacha.html.
  2. Скажи агенту: «Напиши разбор этой страницы и тест на нём. Тест должен проверять, что нашлось больше нуля объявлений и у каждого есть цена и ссылка».
  3. Когда тест зелёный, разреши один живой прогон на одной странице.
  4. Открой таблицу и сверь три-четыре строки с сайтом глазами.

Последний пункт не пропускай. Парсер, который тихо пишет пустые цены, хуже парсера, который падает: ты неделю копишь мусор и думаешь, что копишь данные.

Что делать с данными после сбора?

Коротко: хранить всю историю. Одна строка на объявление на каждую дату сбора - и ты видишь, как менялись цены, какие объявления ушли и какие появились.

Я прошу агента класть всё в 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. На них видно, как устроен такой инструмент изнутри, а агент берёт их из базы сам, когда ты собираешь свой.

Спрашивают

Пять вопросов по теме

Можно ли парсить Авито законно?

Я не юрист, поэтому скажу, что проверил сам. В условиях использования Авито пункт 6.4 запрещает действия, направленные на обход технических ограничений площадки. Робот, который пробивает капчу или меняет адреса ради обхода блокировки, под это подходит. Медленный сбор открытых цен без персональных данных - другая история, но окончательный ответ по своему случаю даст юрист.

Есть ли у Авито официальный API для парсинга объявлений?

API есть, но не для парсинга чужих объявлений. Он работает с данными того аккаунта, который получил токен: твои объявления, статистика просмотров, сообщения, автозагрузка. Метод списка объявлений прямо описан как список объявлений авторизованного пользователя. Выдачу по запросу и цены конкурентов через него не получить.

Сколько запросов в минуту можно делать к Авито?

Для сайта Авито публичного числа нет, в robots.txt задержка между запросами тоже не указана. Для API лимиты написаны у каждого метода: у списка своих объявлений это 25 запросов в минуту. Для страниц сайта я держу паузу в несколько секунд со случайным разбросом и ограничиваю число страниц за прогон. Это моя привычка, а не правило Авито.

Можно ли собрать телефоны продавцов с Авито?

Не надо. Раздел /items/phone в robots.txt Авито закрыт для всех роботов, а телефон и имя продавца по закону о персональных данных относятся к информации о конкретном человеке. Хранить такую базу и тем более использовать её для обзвона - прямой путь к проблемам. Парсеру хватает цены, заголовка, города, даты и ссылки на объявление.

Почему парсер Авито перестал работать через неделю?

Чаще всего по двум причинам. Первая: Авито поменял вёрстку, и разбор страницы ищет то, чего больше нет. Вторая: адрес попал под ограничение за слишком частые запросы. Первое лечится образцом страницы и тестом на нём, второе - паузами и меньшими порциями. Агенту достаточно показать свежую страницу и упавший тест.

Источники