Программирование

Парсер Avito на Python — прокси, обход блокировок и капч

Пошагово: как настроить парсер Avito на Python, обходить блокировки и капчи, управлять пулом прокси, использовать Playwright и оптимизировать трафик безопасно.

Как правильно парсить Avito на Python, обходя блокировки, капчи и проблемы с прокси? Опыт с requests, BeautifulSoup, Selenium и Playwright

Заинтересован в автоматизации парсинга объявлений на Avito. Столкнулся с блокировками и капчами. Пробовал мобильные прокси с ручной ротацией, случайными таймаутами и скроллами для имитации человека, но:

  • Без прокси (интернет 80 Мбит/с) всё работает отлично.
  • С прокси (скорость до 5 Мбит/с) сайт тормозит, не прогружается.

Пробовал прокси от разных сервисов. Стоит ли покупать лучшие мобильные прокси или есть другие способы? Как вы обходите защиты Avito: ротация прокси, настройки браузеров, headers, user-agents или другие техники?

Парсер Avito на Python стабилен, когда сочетать правильные инструменты (Playwright/Selenium для динамики), прокси-пул и систему решения капч — вместе они дают устойчивый парсинг. Простые requests + BeautifulSoup подходят для единичных или «легких» страниц, но при массовом парсинге Avito чаще встречаются 403 и блокировки, поэтому переход на playwright/python парсинг с ротацией прокси и имитацией поведения пользователя обычно обязателен. Дорогие мобильные прокси помогают, но сначала оптимизируйте загрузку страницы (блокируйте картинки/скрипты, реюз сессий), тестируйте прокси и используйте капча‑пулы.


Содержание


Парсер Avito на Python: подход и инструменты

Если задача — автоматический мониторинг объявлений Avito (новые объявления, парсер объявлений авито), начинайте с простого: requests + BeautifulSoup для проверки, доступны ли нужные страницы без JS. Но Avito активно использует динамику и анти‑бот логику; поэтому для стабильного парсинга чаще нужен браузерный подход. Схема простая: небольшой «предварительный» requests‑слой (поиск ссылок / sitemap), и для страниц, требующих JS, — браузерный рендерер (Playwright/Selenium).

Практические исходники и примеры есть в открытых проектах: например, репозиторий с реализацией парсера и настройкой ротации прокси — GitHub - Duff89/parser_avito. Для понимания отличий Playwright и тонкостей stealth‑настроек полезна обзорная статья про Playwright: Playwright: Лучшая альтернатива Selenium / Хабр. А в обсуждениях разработчики делятся реальными проблемами с прокси и undetected‑chromedriver: Хабр Q&A — Как парсить авито?.

Коротко: выбор инструмента зависит от объёма и требований. Небольшой парсер — requests + BS. Масштаб и устойчивость к JS/капчам — Playwright (рекомендую) или Selenium с undetected‑chromedriver.


Requests + BeautifulSoup: когда работает и как избегать 403

Requests + BeautifulSoup — быстрый и лёгкий старт. Работает, если страница отдаёт HTML сервера без критичной JS‑логики (например, некоторые карточки или поисковые результаты в простых вариантах). Но у Avito многие данные подгружаются через XHR/JS и защищены.

Практика для requests:

  • Используйте сессии: requests.Session() — реюз cookies.
  • Подменяйте заголовки: User‑Agent, Referer, Accept‑Language.
  • Ограничивайте скорость запросов: рандомные паузы, лимит запросов на IP.
  • Проверяйте код ответа и тело — Avito может отдавать 200 с «заглушкой».
  • Проксируйте запросы через пул (см. секцию про прокси).

Пример простого запроса:

python
import requests
import random, time

session = requests.Session()
session.headers.update({
 "User-Agent": random.choice(USER_AGENTS),
 "Accept-Language": "ru-RU,ru;q=0.9",
 "Referer": "https://www.avito.ru/"
})
resp = session.get("https://www.avito.ru/moskva/avtomobili", timeout=10, proxies={"http": proxy, "https": proxy})
time.sleep(random.uniform(1, 3))

Но учтите: при массовой сборке requests быстро ловит 403/429. Тогда переходите на браузерный рендер.

(Подробнее о проблемах с requests/Selenium и прокси — обсуждение на Хабр Q&A.)


Selenium vs Playwright: практический выбор для парсинга Avito

Playwright выигрывает по асинхронности, стабильности ожиданий и возможностям управления контекстами. Он удобен для параллельных контекстов с разными прокси и состояниями (storage_state). Selenium — зрелый инструмент, но требует патчей (undetected‑chromedriver) и больше «танцев» для stealth.

Практические приёмы:

  • Для Playwright: создавайте множество контекстов в одном браузере, каждый контекст — отдельный proxy + cookies. Это быстрее, чем перезапускать браузер.
  • Добавляйте инициализационные скрипты, чтобы скрыть webdriver‑флаги.
  • Перехватывайте и блокируйте лишние ресурсы (изображения, статику) при медленных прокси.

Пример Playwright (сокращённо):

python
from playwright.async_api import async_playwright
import random, asyncio

USER_AGENTS = ["..."]

async def fetch_with_proxy(proxy):
 ua = random.choice(USER_AGENTS)
 async with async_playwright() as p:
 browser = await p.chromium.launch(headless=True, args=["--disable-blink-features=AutomationControlled"])
 context = await browser.new_context(user_agent=ua, proxy={"server": proxy})
 await context.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
 page = await context.new_page()
 # блокируем картинки, шрифты и сторонние скрипты для скорости
 await page.route("**/*", lambda route: route.abort() if route.request.resource_type in ["image","font","stylesheet"] else route.continue_())
 await page.goto("https://www.avito.ru")
 await page.mouse.wheel(0, 1000)
 await page.wait_for_timeout(int(random.uniform(1200, 2800)))
 html = await page.content()
 await context.storage_state(path="state.json")
 await browser.close()

asyncio.run(fetch_with_proxy("http://user:pass@proxy:port"))

Для Selenium: используйте webdriver_manager и undetected-chromedriver (см. обсуждения на Хабр Q&A), но будьте готовы к более частым обходам защиты.


Прокси для парсинга Avito: мобильные vs серверные

Вы наблюдали: без прокси всё работает, с прокси — тормозит. Почему? Разные факторы: скорость канала, latency, качество прокси (натуральный трафик/репутация), геолокация IP и ограничения провайдера.

Мобильные прокси — часто лучший выбор по отпечатку и «естественности» трафика: Avito реже блокирует мобильные операторские адреса. Но они медленнее (5 Мбит/с — нормальная реальность для некоторых провайдеров) и дороже. Серверные (datacenter) — быстрые и дешёвые, но имеют худшую репутацию и чаще блокируются.

Что делать при медленных прокси:

  • Отключайте загрузку тяжёлых ресурсов (изображения, шрифты, видео) — это существенно снизит трафик.
  • Используйте мобильный User‑Agent и подгоняйте viewport под мобильное устройство (совпадение UA + IP повышает доверие).
  • Делайте health‑check прокси: проверка скорости/latency, откладывание в пуле плохих прокси.
  • Применяйте «sticky sessions» — фиксируйте прокси для одной сессии (cookies + storage_state).
  • Для высоких объёмов — инвестируйте в качественные мобильные провайдеры; иногда дешевле купить 50 стабильных мобильных прокси, чем тратить время на отладку падений.

Практическая настройка ротации: ротация по N запросам или при ошибках, хранение конфигурации (в repo, как в parser_avito config.toml с rotate_proxies = true).

Подробнее про софт и подходы к прокси — статья на proxys.io.


Обход блокировок и капч: техники и интеграция

Какие техники работают вместе:

  • Ротация прокси + ограничение запросов на IP. Не превышайте 1–5 запросов в минуту на один IP для «чувствительных» путей.
  • Ротация User‑Agent и Referer, Accept‑Language; подмена заголовков на правдоподобные.
  • Имитация поведения: скроллы, случайные паузы, mouse move, клики по элементам (иногда Avito смотрит поведение).
  • Блокировка аналитики и тяжёлых стилей: уменьшает нагрузку по медленным каналам.
  • Реюз сессий: сохраняйте cookies/LocalStorage (Playwright storage_state), чтобы не «рождаться» заново для каждой страницы.
  • Капча: интеграция 2Captcha/AntiCaptcha или human‑in‑the‑loop (телеграм‑бот + оператор) — зависит от объёма. proxys.io рекомендует иметь резервную схему решения капч.

Технические приёмы для stealth:

  • Отключить автоматические флаги: --disable-blink-features=AutomationControlled.
  • Переопределить navigator.webdriver через add_init_script.
  • Подменять WebGL/отпечатки — для продвинутой защиты (есть готовые stealth‑плаги/плагины).
  • Перехватывать и блокировать анти‑бот API‑запросы (если видно, что запросы уходят на явные эндпоинты).

Важно: не делайте всё одинаково для всех сессий — паттерны «ровных» действий выдаются хорошо.


Архитектура парсера, масштабирование и надёжность

Рекомендованная модульная архитектура:

  • Менеджер задач (queue: Redis/RabbitMQ).
  • Фетчер (workers): lightweight (requests) + browser workers (Playwright).
  • Proxy manager: health checks, рейтинг, blacklisting.
  • Captcha solver: пулы сервисов + fallback на ручное решение.
  • Парсер/детектор изменений: извлечение полей, дедупликация.
  • Хранилище и мониторинг: БД, логирование, метрики (Prometheus/Grafana).

Масштабирование:

  • Разграничьте задачи: сначала проходим поисковые страницы через requests, затем карточки через Playwright только по необходимости.
  • Ограничение concurrency (для каждого proxy и глобально).
  • Retry/backoff и circuit breaker для плохих прокси.
  • Автоматический health check и удаление прокси из пула при падении.

Юридическая заметка: учитывайте правила Avito и законы о защите данных. Часто корректнее использовать API (если доступно) или согласовать сбор данных.


Чек-лист и пример кода (Playwright + прокси)

Короткий чек-лист перед запуском:

  • [ ] Разделить запросы: requests для простого, Playwright для динамики.
  • [ ] Настроить пул прокси + health checks.
  • [ ] Ротация User‑Agent и Referer.
  • [ ] Блокировка изображений/шрифтов при медленных прокси.
  • [ ] Сохранение storage_state / cookies для повторного использования.
  • [ ] Интеграция капча‑провайдеров (2Captcha/AntiCaptcha) + fallback.
  • [ ] Логи и метрики: время отклика, ошибки 403/429, пропускная способность прокси.
  • [ ] Ограничение concurrency и rate limits на IP.

Минимальный рабочий пример (сокращённый Playwright):

python
# pip install playwright
# playwright install chromium
from playwright.async_api import async_playwright
import random, asyncio

USER_AGENTS = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64)...", "...mobile UA..."]

async def fetch_avito(url, proxy):
 ua = random.choice(USER_AGENTS)
 async with async_playwright() as p:
 browser = await p.chromium.launch(headless=True, args=["--disable-blink-features=AutomationControlled"])
 context = await browser.new_context(user_agent=ua, proxy={"server": proxy})
 await context.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
 page = await context.new_page()
 # экономим трафик для медленных прокси
 await page.route("**/*", lambda route: route.abort() if route.request.resource_type in ["image","font","stylesheet"] else route.continue_())
 await page.goto(url, timeout=30000)
 await page.mouse.wheel(0, 1000)
 await page.wait_for_timeout(int(random.uniform(1200, 3000)))
 html = await page.content()
 await context.storage_state(path="state.json")
 await browser.close()
 return html

asyncio.run(fetch_avito("https://www.avito.ru/moskva/avtomobili", "http://user:pass@proxy:port"))

Если используете Selenium, применяйте webdriver_manager + undetected_chromedriver и аналогичные эвристики (UA, прокси, имитация движений).


Источники

  1. GitHub - Duff89/parser_avito
  2. Как парсить авито? — Хабр Q&A
  3. Playwright: Лучшая альтернатива Selenium. Первое знакомство / Хабр
  4. Парсинг Avito: для чего нужен, какой софт используют профессионалы / proxys.io
  5. Хабр — удалённая/неработающая страница (упомянута в анализе)

Заключение

Парсер авито будет надёжным, когда вы объедините правильные инструменты (playwright/python парсинг для динамики), продуманный пул прокси и систему решения капч. Покупка качественных мобильных прокси оправдана при масштабировании и частых блокировках, но сначала оптимизируйте загрузку страниц, реюз сессий и настройку контекстов — это часто даёт заметный выигрыш без лишних затрат. Нужна помощь с конкретным кодом или конфигурацией прокси‑пула? Могу помочь адаптировать пример под вашу инфраструктуру.

Авторы
Проверено модерацией
Модерация