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

Площадка сильно изменилась за последние годы и из сайта с объявлениями превратилась в хорошо защищенный сервис. Мало того, что на него нельзя нормально зайти с иностранного IP-адреса, так еще и капчи понавешали на него больше чем нужно. Ощущение, что имеешь дело с каким-то Амазоном, но никак не с Авито.

У себя на Гитхаб я опубликовал парсер Авито, который использовал в одном проекте (мне нужно было обработать несколько тысяч объявлений). Сейчас парсер лежит без дела, и я подумал, что он может кому-то послужить и оказаться полезным. 

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

Все исходники проекта доступны на моем GitHub - dmitriy1996-cmd, а сам репозиторий называется avito-parser.

Но сперва давайте поговорим про саму площадку и кому она может быть интересна?

Кому интересен Авито, как предмет для парсинга

Зачем вообще людям может прийти в голову парсить площадку с объявлениями и зачем? Кто этот специалист, которому нужен парсинг Авито? Давайте разбираться!

Спойлер - это далеко не обычные продавцы.

Генерация лидов

Вероятно, самая популярная задача, связанная с Авито это лидогенерация. Компании (агентства недвижимости, автосалоны, B2B-сервисы, ремонтники) собирают контакты людей, выставивших определенные товары или услуги, чтобы запустить на них холодный обзвон, SMS-рассылки или автоворонки в WhatsApp. 

Да, офлайн-бизнес сильно качнулся в сторону автоматизации, и в крупных городах подобные названия услуг не вызывают недопонимание, люди научились не только ВПНы устанавливать, но и автоворонки запускать.

Мониторинг конкурентов и SEO-анализ. 

Те компании, которые сами продают на Авито (мебель на заказ, услуги спецтехники), парсят выдачу, чтобы понять: какие цены ставят конкуренты, какие ключевые слова используют в заголовках, какие фото лучше конвертируют и как часто конкуренты используют платное продвижение. Банальная конкурентная разведка.

Конечно, когда бизнес простой, у него один собственник, он же исполнитель, вряд ли он будет заморачиваться на парсинг Авито, сильно напряжно это и не до конца понятна цель. Но крупные компании понимают ценность полученной информации и знают как ее использовать.

Динамическое ценообразование. 

Более продвинутое применение парсинга Авито - это совмещение полученных результатов с другими инструментами автоматизации.

Представьте сервис по аренде автомобилей, они хотят предлагать клиентам лучшие условия и им нужно понимать, что происходит с рынком в текущий момент, чтобы корректировать свои цены. 

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

Арбитраж и перепродажа (Снайпинг). 

Следующий лот и вовсе выглядит как способ заработка. Схема вполне рабочая, главное правильно все настроить и можно врываться. Вот пример  «перекупы» автомобилей, электроники или недвижимости (эта категория перекупов еще называет себя инвесторами) настраивают парсеры так, чтобы они проверяли выдачу каждую минуту. Как только появляется объявление с ценой ниже рынка на 15–20%, парсер отправляет уведомление в Telegram или другой мессенджер, чтобы перекупщик успел позвонить первым.

Схема думаю понятна - когда ты знаешь сколько стоит та или иная вещь, несложно распознать где можно откупить подешевле и продать подороже.

Наполнение собственных площадок (Агрегаторы). 

Создатели нишевых сайтов (локальные порталы недвижимости или автобазары) часто используют Авито как бесплатного донора контента, просто дублируя объявления к себе для создания видимости активности и SEO-трафика.

Да чего лукавить, я и сам лично принимал участие в создание подобного агрегатора под недвижимость одного города, но портал так и не полетел, Авито к нему никто подключить не успел, но это лирика.

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

Как я уже писал выше, из заурядной площадки с объявлениями, Авито превратился в крупный сервис, а сервисы не хотят ни с кем делиться данными. Сервисы создают юридические отделы, они нанимают специалистов и борются с теми, кто покушается на новую нефть (данные). 

Если бы они всего этого не делали, конкуренты (ЦИАН, Юла и т.д.) бы просто приходили к ним, парсили информацию и публиковали у себя. Думаю с этим понятно.

Какие именно сложности возникают при парсинге Авито? Я парсил объявления в конкретном регионе в разных категориях и по различным поисковым запросам, и вот с чем я столкнулся в процессе:

  • парсить Авито в headless-режиме нереально (по крайней мере у меня ни разу не получилось), площадка на каждый такой запрос выдает пустую страницу заглушку

  • нужно обязательно использовать резидентные прокси, если использовать обычные серверные Авито сразу же перекидывает тебя на страницу с капчей

  • Капча у площадки сложная, лучше на нее не попадать (технически в парсере добавлен блок с сервисом распознавания капчи), но на практике я его не использовал, а просто менял IP, так выходило дешевле.

С капчей вообще ситуация неоднозначная, так как на сайте стоит hCaptcha и вроде иногда выдается GeeTest, большинство сервисов распознавания капчи перестали ее поддерживать (hCaptcha) в качестве распознаваемой (вероятно они прошли по сервисам с досудебкой решив вопрос раз и навсегда (нет).

Теперь переходим к самому парсеру и чем он может быть полезен 

Что умеет парсер Авито

Скрипт может:

  • Искать объявления по ключевому запросу.

  • Работать параллельно в несколько потоков, используя ротацию прокси.

  • Пробивать защиту Авито (Qrator + фаервол-капча).

Технически это реализовано, но практически я ни разу не встретил капчу, вовремя меняя IP.

  • Сохранять результаты в JSON и табличный CSV.

Что под капотом

  • Playwright + playwright-extra + puppeteer-extra-plugin-stealth - основа для браузерной автоматизации с подменой фингерпринтов.

  • p-limit - контроль конкурентности (строгое ограничение на N одновременно открытых браузерных контекстов).

  • proxy-chain - локальный мост HTTP → SOCKS5.

  • инструмент для решения капчи.

На прокси остановлюсь отдельно, так как есть нюансы. Я использую прокси от сервиса NodeMaven. Они мне нравятся тем, что у NodeMaven админка сделана для людей, но что важнее — качество самих пулов. Авито не переваривает замаранные IP-шники, а у NodeMaven в панели прямо показано качество IP-адресов по регионам. 

У прокси из РФ висит метка High - это ровно то, что мне было нужно. И ожидания оправдались: благодаря чистым резидентным прокси я не встречал капчу на дистанции в несколько тысяч страниц. Могу смело рекомендовать.

Помимо выбора провайдера, нужно учесть еще один технический нюанс. Playwright и Chromium исторически не умеют работать с SOCKS5-прокси, если те требуют авторизации по логину и паролю. Вы просто не сможете прокинуть socks5://user:pass@host:port напрямую в настройки контекста браузера.

Поэтому надо либо использовать прокси по протоколу HTTP, либо поднимать локальный мост. В парсере реализованы оба варианта. Для SOCKS5 я прикрутил мост через библиотеку proxy-chain: под каждый браузерный контекст поднимается локальный HTTP-сервер, который прозрачно проксирует трафик в удаленный SOCKS5 с нужными креденшиалами.

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

Архитектура и поток выполнения (Pipeline)

Жизненный цикл парсинга выглядит так:

  1. Инициализация: Скрипт принимает на вход либо список URL (если заранее вы уже собрали урлы, которые нужно спарсить), либо поисковый запрос (node src/index.js --search "игровой ноутбук" --category noutbuki). Во втором случае модуль search.js сначала проходит по страницам пагинации и собирает ссылки на карточки.

  2. Распределение задач: p-limit распределяет собранные URL по воркерам.

  3. Изоляция: Под каждый URL берется прокси со своим уникальным sid (так как парсер писался под NodeMaven то распределение идет под уникальный sid). Создается новый контекст браузера со своим User-Agent, viewport и таймзоной.

  4. Взаимодействие: Страница открывается. Отрабатывает модуль обнаружения фаервола. Затем включается режим «человек»: курсор хаотично двигается, страница скроллится, выдерживаются случайные паузы (от 2 до 6 секунд).

  5. Сбор: Происходит извлечение данных.

  6. Зачистка и ретрай: Прокси освобождается, контекст закрывается. Если словили 403, 429 или таймаут — URL уходит на повторную попытку (до 3 раз) с новой сессией.

Режим «человек» нужен чтобы сбить с толку антифрод площадки. Когда вы парсите 10-20 страниц, это не так заметно, а на 1000+ страницах антифрод может начать ругаться, если заметит паттерны ботоподобного поведения.

Личный опыт — как я обходил защиту

Авито агрессивно защищает свои данные. Вот ключевые грабли, на которые я наступил, и как в итоге решил вопрос.

Headful решает почти всё

Самый рабочий инсайт который я получил заключается в том, что: Авито почти всегда отдает капчу «Доступ ограничен: проблема с IP» для headless-Chromium. Каким бы идеальным ни был ваш парсер. Однако, если запустить видимое окно (HEADLESS=false) с российским резидентным IP — защита ослабевает. В контексте Авито отрисовка интерфейса оказалась важнее, чем глубокая подмена WebGL. На данном этапе даже не пришлось внедрять антидетект браузер, хотя признаюсь, планы на внедрение были, особенно когда не получалось пробиться сквозь защиту.

Российские резидентные прокси — это база

Зарубежные резидентные и серверные IP-адреса попадают на фаервол-заглушку сразу же. Проект стабильно работает только на RU-резидентах.

Sticky-сессии на каждый поток

Ротация IP на каждый запрос может спровоцировать антифрод-системы на ненужную активность. В моем proxy.js реализованы липкие сессии, парсер умеет динамически менять токен -sid- внутри username прокси. Таким образом, каждый браузерный контекст получает свой фиксированный выходной IP-адрес на время обработки конкретного объявления.

Если сессия все же улетела в бан, ретрай отрабатывает со свежим sid и новым фингерпринтом. Заблокированный IP не стучится в заведомо закрытую для него дверь.

Эмуляция поведения

Модуль human.js умеет эмулировать жизнь. Так сказать вдохнул частичку души в бездушный парсер. Это происходит за счет случайных движений мыши перед кликами, переменными шагами скролла и, самое главное, рандомных задержек (2000–6000 мс) перед ключевыми действиями.

Капча: ожидание и суровая реальность

В парсер интегрирован модуль с авто обнаружением типа защиты (конкретно в Авито стоят hCaptcha и GeeTest, вот их модуль и определяет). 

Реализован детект за счет перехвата ответов эндпоинта Авито /web/5/firewallCaptcha/get, передачей rqdata и инъекцией токена через внутренние хуки страницы.

На практике все оказалось несколько сложнее — фаервол Авито использует hCaptcha Enterprise, а в headless-режиме она зачастую вообще не дорисовывается. Решать просто нечего.

Методом проб и ошибок я понял, что самый дешевый и надежный способ «обойти» капчу — не вызывать её появление. Стратегия Headful + RU-резидентные прокси + умные ретраи работает стабильнее, чем надеяться на сторонний сервис распознавания капчи

Особенности извлечения данных

Парсер собирает такие данные:

  • заголовок

  • цену

  • полное описание

  • имя продавца

  • тип аккаунта

  • локацию

  • массив ссылок на фото в высоком разрешении.

Есть нюансы с начальным запросом, Авито не отдает результаты по «голому» запросу вида ?q=. В URL обязательно должен быть слаг категории. Мой модуль search.js учитывает это и строит правильные ссылки: /<регион>/<категория>?q=<запрос>&p=<страница>. Списки категорий я закинул в парсер, если не хватает, можно руками добавить недостающий.

Нюанс с телефонами

Это самая сложная часть. Номер скрыт за XHR-запросом. Для неавторизованного пользователя по клику на кнопку «Показать телефон» Авито открывает модальное окно логина. Это логика работы площадки, тут уже никак не обойти. Нужно либо иметь залогиненный аккаунт, либо получать номер телефона уже после этапа парсинга путем прокликивания полученных ссылок.

Вместо заключения

Посмотреть, как это реализовано в коде, можно в моем репозитории. Как его найти я написал в начале текста.

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

Комментарии (1)


  1. digrobot
    30.06.2026 17:28

    Авито же сейчас подменяет настоящие номера телефонов своими?