Перейти к содержанию

Инструмент 6: "Спецназ" (Stealth / Anti-Bot Bypass)

Стек: DrissionPage (Sync). Суть: Это библиотека "последнего шанса". Она не использует WebDriver (как Selenium), а управляет браузером напрямую через Chrome DevTools Protocol (CDP). Почему это круто:

  1. У неё нет флагов автоматизации (navigator.webdriver чистый).
  2. Она умеет управлять мышью на уровне операционной системы (клики выглядят 100% натурально).
  3. Она проходит 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()

Куда смотреть:

  1. page.change_mode(): Это главная фишка. Ты проходишь капчу как браузер, а потом переключаешься в режим "запросов" и парсишь остальной сайт быстро, используя полученные куки.
  2. page.ele('@type=checkbox'): Синтаксис @ ищет по атрибутам. DrissionPage сам пробивает Shadow DOM (теневой DOM), который используют капчи. В Selenium/Playwright для этого нужно писать простыни кода.
  3. Синхронность: Не используй asyncio и await с этой библиотекой. Она работает в блокирующем режиме.