Сценарии использования

Парсинг веб-сайтов, защищенных CAPTCHA

Большинство ценных веб-сайтов используют CAPTCHA как часть защиты от ботов. В этом руководстве описаны стратегии надежного парсинга этих сайтов с помощью CaptchaAI, в том числе способы определения типов CAPTCHA, их автоматического решения и создания устойчивых парсеров.

Общие реализации CAPTCHA

КАПЧА Где используется CaptchaAI Метод
reCAPTCHA v2 Формы входа, страницы поиска method=userrecaptcha
reCAPTCHA v3 Фоновая оценка на любой странице method=userrecaptcha&version=v3
Cloudflare Turnstile Сайты, стоящие за Cloudflare method=turnstile
страница Cloudflare-защиты в staging Полностраничный блок Cloudflare method=turnstile
Изображение/OCR CAPTCHA Устаревшие сайты, Amazon method=base64
hCaptcha Сайты, ориентированные на конфиденциальность method=hcaptcha

Стратегия 1: Обнаружение и решение по требованию

Самый надежный подход — парсить в обычном режиме и решать CAPTCHA только тогда, когда они появляются:

import requests
import time
from bs4 import BeautifulSoup

API_KEY = "YOUR_API_KEY"

class ProtectedScraper:
    def __init__(self):
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })

    def scrape(self, url):
        resp = self.session.get(url)

        # Check for CAPTCHA
        if self._has_captcha(resp.text):
            resp = self._handle_captcha(resp.text, url)

        return resp.text

    def _has_captcha(self, html):
        indicators = ["g-recaptcha", "cf-turnstile", "h-captcha", "captcha"]
        return any(ind in html.lower() for ind in indicators)

    def _handle_captcha(self, html, url):
        soup = BeautifulSoup(html, "html.parser")

        # reCAPTCHA v2
        rc = soup.find("div", class_="g-recaptcha")
        if rc:
            token = self._solve_recaptcha(rc["data-sitekey"], url)
            return self.session.post(url, data={"g-recaptcha-response": token})

        # Cloudflare Turnstile
        ts = soup.find("div", class_="cf-turnstile")
        if ts:
            token = self._solve_turnstile(ts["data-sitekey"], url)
            return self.session.post(url, data={"cf-turnstile-response": token})

        raise Exception("Unknown CAPTCHA type")

    def _solve_recaptcha(self, site_key, page_url):
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY, "method": "userrecaptcha",
            "googlekey": site_key, "pageurl": page_url
        })
        return self._poll(resp.text.split("|")[1])

    def _solve_turnstile(self, site_key, page_url):
        resp = requests.get("https://ocr.captchaai.com/in.php", params={
            "key": API_KEY, "method": "turnstile",
            "sitekey": site_key, "pageurl": page_url
        })
        return self._poll(resp.text.split("|")[1])

    def _poll(self, task_id):
        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": API_KEY, "action": "get", "id": task_id
            })
            if result.text == "CAPCHA_NOT_READY": continue
            if result.text.startswith("OK|"): return result.text.split("|")[1]
            raise Exception(result.text)
        raise TimeoutError()

# Usage
scraper = ProtectedScraper()
html = scraper.scrape("https://example.com/data")

Стратегия 2: предварительная QA-проверка известных страниц CAPTCHA

Если вы знаете, на каких страницах всегда есть CAPTCHA, решите заранее:

def scrape_known_captcha_page(url, site_key):
    # Solve before even loading the page
    token = solve_recaptcha(site_key, url)

    # Submit directly with token
    resp = requests.post(url, data={
        "g-recaptcha-response": token,
        "query": "search term"
    })
    return resp.text

Стратегия 3: Сайты, защищенные Cloudflare

Сайтам Cloudflare часто требуется файл cookie qa_validation_cookie:

def get_cloudflare_clearance(url, proxy):
    resp = requests.get("https://ocr.captchaai.com/in.php", params={
        "key": API_KEY,
        "method": "turnstile",
        "pageurl": url,
        "proxy": proxy,
        "proxytype": "HTTP"
    })
    task_id = resp.text.split("|")[1]

    for _ in range(60):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": task_id
        })
        if result.text == "CAPCHA_NOT_READY": continue
        if "qa_validation_cookie" in result.text:
            # Parse qa_validation_cookie and user_agent from response
            return result.text
    raise TimeoutError()

Шаблон многостраничного парсинга

def scrape_multiple_pages(base_url, site_key, pages):
    scraper = ProtectedScraper()
    results = []

    for page in pages:
        url = f"{base_url}?page={page}"
        try:
            html = scraper.scrape(url)
            soup = BeautifulSoup(html, "html.parser")
            items = soup.find_all("div", class_="item")
            results.extend([item.text.strip() for item in items])
            print(f"Page {page}: {len(items)} items")
        except Exception as e:
            print(f"Page {page} failed: {e}")

        time.sleep(random.uniform(2, 5))

    return results

Поиск неисправностей

Проблема Исправить
CAPTCHA появляется на каждой странице Используйте прокси; уменьшить частоту запросов
Токен отклонен после решения Возможно, срок действия токена истек; использовать в течение 120 секунд
Cloudflare блокируется, несмотря на разрешение Используйте один и тот же прокси и пользовательский агент для всех запросов.
Сайт возвращает другую страницу после решения Проверьте наличие дополнительных перенаправлений или файлов cookie.

Часто задаваемые вопросы

Какие сайты сложнее всего парсить?

Сайты, использующие Cloudflare Enterprise, PerimeterX или Akamai Bot Manager, являются наиболее сложными. CaptchaAI обрабатывает компоненты CAPTCHA; комбинируйте со скрытыми браузерами и прокси-серверами для достижения наилучших результатов.

Могу ли я парсить сайты, требующие входа в систему?

Да. Сначала войдите в систему (решая любую CAPTCHA), сохраните файлы cookie сеанса, а затем очистите аутентифицированные страницы. CaptchaAI обрабатывает CAPTCHA на любом этапе.

Как обрабатывать страницы, отображаемые с помощью JavaScript?

Используйте Selenium, Puppeteer или Playwright для рендеринга JavaScript, затем извлеките параметры CAPTCHA и решите с помощью CaptchaAI. ВидетьОбработка Selenium CAPTCHA.

Связанные руководства

  • Как решать проблемы CAPTCHA в рабочих процессах веб-скрапинга
  • Проблемы с капчой в headless браузере
  • Объяснение обнаружения CAPTCHA при парсинге
Комментарии для этой статьи отключены.