Инструмент 6: "Спецназ" (Stealth / Anti-Bot Bypass)
Стек: DrissionPage (Sync).
Суть: Это библиотека "последнего шанса". Она не использует WebDriver (как Selenium), а управляет браузером напрямую через Chrome DevTools Protocol (CDP).
Почему это круто:
- У неё нет флагов автоматизации (
navigator.webdriverчистый). - Она умеет управлять мышью на уровне операционной системы (клики выглядят 100% натурально).
- Она проходит Cloudflare Turnstile (галочку) часто просто фактом своего существования.
Где применять: Когда Playwright ловит бан, когда видишь "Checking your browser...", когда нужно прокликать сложную капчу.
Внимание: Библиотека синхронная (потому что имитация человека не терпит спешки).
from DrissionPage import ChromiumPage, ChromiumOptions
import time
import random
# --- 1. CONFIG ---
# Настройка "Профиля". DrissionPage может использовать твой реальный профиль Chrome,
# тогда ты будешь залогинен везде. Но тут сделаем чистый инстанс.
def get_options():
co = ChromiumOptions()
# co.headless(True) # Включи, если не хочешь видеть браузер (но для отладки лучше False)
co.set_argument('--no-first-run')
# Можно подставить прокси
# co.set_proxy('<http://user:pass@ip>:port')
return co
# --- 2. PARSER CLASS ---
class StealthWorker:
def __init__(self):
# Запускаем браузер
self.page = ChromiumPage(get_options())
def bypass_protection(self, url: str):
print(f"🥷 Спецназ заходит на: {url}")
self.page.get(url)
# --- ЭТАП 1: Проход защиты (Cloudflare / Turnstile) ---
# DrissionPage часто проходит Cloudflare сам, просто ожидая.
# Если нужна кнопка "Verify you are human":
if self.page.ele('text:Verify you are human', timeout=2):
print("⚠️ Обнаружена проверка Cloudflare...")
time.sleep(random.uniform(2, 4))
# Ищем чекбокс (Shadow Root пробивается автоматически!)
# Это киллер-фича: не надо писать сложный JS для shadow-dom
checkbox = self.page.ele('@type=checkbox')
if checkbox:
print("⚡ Кликаем галочку...")
checkbox.click() # Клик натуральный
time.sleep(5) # Ждем перезагрузки
# Ждем, пока исчезнет лоадер или появится контент
# self.page.wait.ele_display('#product-list')
def parse_data(self):
# --- ЭТАП 2: Парсинг ---
title = self.page.title
print(f"✅ Успешно зашли. Заголовок: {title}")
# Синтаксис DrissionPage специфичный, но мощный
# .eles() = найти все элементы
products = self.page.eles('.product-card')
print(f"📦 Найдено товаров: {len(products)}")
for p in products:
# Относительный поиск внутри элемента
name = p.ele('.name').text
price = p.ele('.price').text
print(f" - {name} | {price}")
def switch_to_fast_mode(self):
"""
РЕЖИМ БОГА: Переключение на requests.
После прохождения капчи можно переключиться в режим без рендеринга,
чтобы парсить остальные страницы молниеносно, используя куки браузера.
"""
print("🚀 Переключаемся в режим s_mode (только запросы)...")
self.page.change_mode() # Теперь self.page работает как Session, а не как Браузер
# Теперь это работает в 100 раз быстрее (как requests)
resp = self.page.get("<https://site.com/api/products>")
print("Ответ API:", resp.text[:100])
def close(self):
self.page.quit()
# --- 3. ENTRY ---
def main():
worker = StealthWorker()
try:
# Тест на сайте, который проверяет ботов
worker.bypass_protection("<https://nowsecure.nl>")
# worker.parse_data()
# worker.switch_to_fast_mode()
finally:
worker.close()
if __name__ == "__main__":
main()
Куда смотреть:
page.change_mode(): Это главная фишка. Ты проходишь капчу как браузер, а потом переключаешься в режим "запросов" и парсишь остальной сайт быстро, используя полученные куки.page.ele('@type=checkbox'): Синтаксис@ищет по атрибутам. DrissionPage сам пробивает Shadow DOM (теневой DOM), который используют капчи. В Selenium/Playwright для этого нужно писать простыни кода.- Синхронность: Не используй
asyncioиawaitс этой библиотекой. Она работает в блокирующем режиме.