Классические связки Selenium и Puppeteer всё чаще спотыкаются об антибот-системы уровня Cloudflare, DataDome и PerimeterX. На смену им приходят новые фреймворки — Scrapling, Botasaurus и nodriver, которые изначально проектировались с упором на обход детекции. Но даже самый продвинутый фреймворк бесполезен без правильно настроенных прокси. В этой статье разберём, как подключить прокси в каждом из трёх инструментов, какие ошибки убивают эффективность и как выбрать тип IP под конкретную задачу парсинга.
Чем Scrapling, Botasaurus и nodriver отличаются от Selenium
Все три фреймворка появились как ответ на то, что Selenium и обычный Puppeteer стали слишком легко детектируемыми. Антибот-системы проверяют десятки параметров: CDP-протокол, navigator.webdriver, рендеринг canvas, тайминги событий — и классические драйверы оставляют характерные следы почти в каждом из них.
Scrapling — Python-библиотека, которая совмещает адаптивный парсинг HTML с возможностью эмуляции браузера через StealthyFetcher на базе Camoufox (форк Firefox с патченным fingerprint). Она хороша для задач, где нужен быстрый парсинг с минимальным потреблением ресурсов, но при этом защита сайта активно проверяет TLS-fingerprint.
Botasaurus — фреймворк на базе модифицированного Chromium (undetected-chromedriver под капотом), заточенный под массовый параллельный скрапинг с автоматическим управлением профилями браузера и встроенной поддержкой решения капч через сторонние сервисы.
nodriver — преемник undetected-chromedriver от того же автора, который отказался от Selenium WebDriver вовсе и работает напрямую через CDP (Chrome DevTools Protocol), что убирает значительную часть детектируемых артефактов автоматизации.
Общая черта всех трёх — они снижают детекцию на уровне браузерного fingerprint, но не решают проблему IP-репутации. Если запросы идут с дата-центрового IP, который уже засвечен в блэклистах DataDome или Cloudflare, никакой патч браузера не спасёт от капчи или 403-й ошибки.
Настройка прокси в Scrapling
Scrapling поддерживает прокси как в быстром HTTP-режиме (Fetcher), так и в браузерном режиме (StealthyFetcher). Для статического парсинга без JS-рендеринга прокси передаётся напрямую в параметрах запроса:
from scrapling.fetchers import Fetcher
response = Fetcher.get(
"https://example.com",
proxy="http://user:[email protected]:9000"
)
print(response.status)
Для режима с полноценным браузером (StealthyFetcher на Camoufox) прокси передаётся через словарь с отдельными полями сервера, логина и пароля — это важно, потому что Camoufox иначе обрабатывает авторизацию прокси, чем обычный Chromium:
from scrapling.fetchers import StealthyFetcher
response = StealthyFetcher.fetch(
"https://example.com",
proxy={
"server": "gate.proxycove.com:9000",
"username": "user",
"password": "pass"
},
headless=True
)
print(response.status)
Частая ошибка — передавать прокси строкой целиком в браузерный режим, как в HTTP-запросах. Camoufox в этом случае либо игнорирует авторизацию, либо падает с таймаутом на этапе подключения к прокси-серверу. Если видите ошибку ERR_NO_SUPPORTED_PROXIES — проверяйте формат именно словаря с отдельными полями.
Настройка прокси в Botasaurus
Botasaurus использует декоратор @browser
для конфигурации драйвера, и прокси передаётся как параметр этого декоратора либо напрямую в функцию запуска:
from botasaurus.browser import browser, Driver
@browser(
proxy="http://user:[email protected]:9000"
)
def scrape_data(driver: Driver, data):
driver.get("https://example.com")
return driver.page_html
scrape_data()
Если нужно подключать разные прокси для каждой параллельной задачи (что критично при массовом скрапинге через Botasaurus), прокси лучше передавать динамически через список данных, а не захардкоживать в декораторе:
from botasaurus.browser import browser, Driver
@browser
def scrape_with_proxy(driver: Driver, data):
driver.config.proxy = data["proxy"]
driver.get(data["url"])
return driver.page_html
tasks = [
{"url": "https://example.com/page1", "proxy": "http://user:pass@ip1:port"},
{"url": "https://example.com/page2", "proxy": "http://user:pass@ip2:port"},
]
scrape_with_proxy(tasks)
Botasaurus отлично параллелит задачи через multiprocessing, поэтому при массовом скрапинге важно использовать прокси с достаточным пулом IP — иначе несколько потоков будут биться в один и тот же адрес, что мгновенно выдаёт автоматизацию антиботу по паттерну частоты запросов.
Настройка прокси в nodriver
nodriver работает через прямое подключение к CDP без Selenium-прослойки, поэтому прокси здесь настраивается через аргументы запуска браузера, а не через отдельный API. Для прокси без авторизации всё просто:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
await asyncio.sleep(3)
browser.stop()
asyncio.run(main())
Проблема в том, что Chromium не поддерживает логин/пароль в прокси через --proxy-server напрямую.
Для авторизованных прокси в nodriver нужно либо поднимать локальный прокси-туннель без авторизации
(например, через px или 3proxy), либо обрабатывать CDP-событие Fetch.authRequired:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
async def auth_handler(event):
await page.send(uc.cdp.fetch.continue_with_auth(
request_id=event.request_id,
auth_challenge_response=uc.cdp.fetch.AuthChallengeResponse(
response="ProvideCredentials",
username="user",
password="pass"
)
))
page.add_handler(uc.cdp.fetch.AuthRequired, auth_handler)
await asyncio.sleep(5)
browser.stop()
asyncio.run(main())
Это самый неочевидный момент среди всех трёх фреймворков — многие разработчики тратят часы, пытаясь понять, почему авторизация просто не срабатывает, не зная про Fetch domain в CDP.
Ротация прокси и борьба с антиботами
Даже идеально настроенный браузерный fingerprint не спасёт, если на один IP идёт больше 50-100 запросов в минуту к защищённому домену. DataDome и Cloudflare анализируют частоту запросов с конкретного адреса и временные паттерны между действиями — слишком равномерные интервалы тоже подозрительны.
Рабочая схема ротации для всех трёх фреймворков строится одинаково:
- Используйте gateway с автоматической ротацией IP на уровне провайдера — не нужно писать свою логику смены адресов на каждый запрос.
- Для сессионных задач (логин, многостраничная навигация) фиксируйте IP на сессию через sticky-параметр в строке подключения.
- Для простого парсинга статичных страниц ротируйте IP на каждый запрос или каждые 5-10 запросов.
- Добавляйте случайные задержки между запросами (1-4 секунды) — это снижает детекцию по временным паттернам.
Пример sticky-сессии в строке подключения, где session-id сохраняет один и тот же исходящий IP на 10 минут:
proxy = "http://user-session-abc123:[email protected]:9000"
Для Botasaurus такая схема особенно полезна, потому что при параллельном скрапинге каждый процесс может получать свой уникальный session-id, и вы получаете стабильный пул разных IP без ручного управления списком адресов.
Какой тип прокси выбрать для каждого фреймворка
Тип прокси влияет на успех парсинга не меньше, чем выбор фреймворка. Ниже сравнение по задачам:
| Задача | Рекомендуемый тип прокси | Почему |
|---|---|---|
| Парсинг сайтов с Cloudflare/DataDome | Резидентные прокси | Реальные IP домашних пользователей редко попадают в блэклисты антиботов |
| Массовый парсинг без строгой защиты | Прокси дата-центров | Выше скорость, ниже стоимость на больших объёмах запросов |
| Эмуляция реального пользователя на мобильных сайтах | Мобильные прокси | CGNAT-адреса операторов связи имеют максимальный уровень доверия у антиботов |
Для Scrapling в режиме StealthyFetcher резидентные прокси дают наибольший эффект, потому что Camoufox уже решает проблему fingerprint браузера — остаётся только не спалиться по IP. Для Botasaurus при массовом параллельном скрапинге дата-центровые прокси часто оптимальны по соотношению скорость/цена, если целевой сайт не использует продвинутую защиту уровня DataDome.
Типичные ошибки при связке прокси и браузерной автоматизации
На практике большинство провалов парсинга связано не с самим фреймворком, а с неправильной конфигурацией прокси. Вот список ошибок, которые встречаются чаще всего:
- Один и тот же IP для всех параллельных потоков Botasaurus. Антибот видит 20 одновременных сессий с одного адреса и блокирует его за минуты.
- Передача прокси строкой в браузерный режим Scrapling. Camoufox требует словарь с разделёнными полями — иначе авторизация не проходит.
- Игнорирование CDP Fetch domain в nodriver. Без обработчика authRequired авторизованный прокси просто не подключится, браузер зависнет на загрузке.
- Отсутствие ротации при сессионных действиях. Смена IP посреди авторизованной сессии мгновенно палит автоматизацию — используйте sticky-сессии.
- Несоответствие геолокации прокси и локали браузера. IP из Германии с заголовками Accept-Language: ru — классический признак бота для систем фрод-скоринга.
- Слишком агрессивная частота запросов даже с ротацией. Ротация IP не отменяет необходимость делать паузы между запросами — паттерн поведения тоже анализируется.
Отдельно стоит проверять DNS-утечки при работе через прокси в браузерном режиме — иногда браузер резолвит домены через системный DNS, а не через прокси-туннель, что создаёт рассинхрон между IP запроса и IP резолва, который легко фиксируется защитными системами.
Заключение
Scrapling, Botasaurus и nodriver решают проблему детекции на уровне браузерного fingerprint куда лучше классического Selenium, но ни один из них не отменяет значимость качественного прокси. Правильная настройка авторизации (особенно в nodriver через CDP), грамотная ротация IP и выбор подходящего типа прокси под конкретную антибот-систему — три фактора, которые определяют стабильность парсинга в долгосрочной перспективе.
Если вы парсите сайты с продвинутой защитой типа Cloudflare или DataDome, начните с резидентных прокси — они дают наибольший процент успешных запросов именно за счёт репутации IP. Для массовых задач без строгой защиты дата-центровые прокси остаются оптимальным выбором по соотношению скорости и стоимости на больших объёмах.