Парсер 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: подход и инструменты
- Requests + BeautifulSoup: когда применять и ограничения
- Selenium vs Playwright: практический выбор
- Прокси для парсинга Avito: мобильные vs серверные
- Обход блокировок и капч: техники и интеграция
- Архитектура парсера, масштабирование и надёжность
- Чек-лист и пример кода (Playwright + прокси)
- Источники
- Заключение
Парсер 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 с «заглушкой».
- Проксируйте запросы через пул (см. секцию про прокси).
Пример простого запроса:
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 (сокращённо):
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):
# 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, прокси, имитация движений).
Источники
- GitHub - Duff89/parser_avito
- Как парсить авито? — Хабр Q&A
- Playwright: Лучшая альтернатива Selenium. Первое знакомство / Хабр
- Парсинг Avito: для чего нужен, какой софт используют профессионалы / proxys.io
- Хабр — удалённая/неработающая страница (упомянута в анализе)
Заключение
Парсер авито будет надёжным, когда вы объедините правильные инструменты (playwright/python парсинг для динамики), продуманный пул прокси и систему решения капч. Покупка качественных мобильных прокси оправдана при масштабировании и частых блокировках, но сначала оптимизируйте загрузку страниц, реюз сессий и настройку контекстов — это часто даёт заметный выигрыш без лишних затрат. Нужна помощь с конкретным кодом или конфигурацией прокси‑пула? Могу помочь адаптировать пример под вашу инфраструктуру.