Use Cases

Парсинг CAPTCHA с помощью Python: полное руководство

Библиотека Python requests эффективно обрабатывает HTTP, но CAPTCHA требует внешнего решателя. В этом руководстве показано, как интегрировать CaptchaAI в сценарии очистки Python — для большинства сайтов браузер не требуется.

Требования

Требование Подробности
Питон 3.7+ С пипсом
запросы pip install requests
красивыйсуп4 pip install beautifulsoup4
CaptchaAI API-ключ Отcaptchaai.com

Вспомогательный класс CaptchaAI

Создайте повторно используемый класс решателя для ваших проектов Python:

import requests
import time

class CaptchaSolver:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base = "https://ocr.captchaai.com"

    def _submit(self, params):
        params["key"] = self.api_key
        resp = requests.get(f"{self.base}/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit error: {resp.text}")
        return resp.text.split("|")[1]

    def _poll(self, task_id, timeout=300):
        deadline = time.time() + timeout
        while time.time() < deadline:
            time.sleep(5)
            resp = requests.get(f"{self.base}/res.php", params={
                "key": self.api_key,
                "action": "get",
                "id": task_id
            })
            if resp.text == "CAPCHA_NOT_READY":
                continue
            if resp.text.startswith("OK|"):
                return resp.text.split("|")[1]
            raise Exception(f"Solve error: {resp.text}")
        raise TimeoutError("Solve timed out")

    def solve_recaptcha_v2(self, site_key, page_url):
        task_id = self._submit({
            "method": "userrecaptcha",
            "googlekey": site_key,
            "pageurl": page_url
        })
        return self._poll(task_id)

    def solve_recaptcha_v3(self, site_key, page_url, action="verify"):
        task_id = self._submit({
            "method": "userrecaptcha",
            "googlekey": site_key,
            "pageurl": page_url,
            "version": "v3",
            "action": action
        })
        return self._poll(task_id)

    def solve_turnstile(self, site_key, page_url):
        task_id = self._submit({
            "method": "turnstile",
            "sitekey": site_key,
            "pageurl": page_url
        })
        return self._poll(task_id)

    def solve_image(self, image_base64):
        task_id = self._submit({
            "method": "base64",
            "body": image_base64
        })
        return self._poll(task_id)

Очистка формы, защищенной reCAPTCHA

from bs4 import BeautifulSoup
import requests

solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})

# Step 1: Load the page
url = "https://example.com/search"
page = session.get(url)
soup = BeautifulSoup(page.text, "html.parser")

# Step 2: Extract the site key
recaptcha_div = soup.find("div", class_="g-recaptcha")
site_key = recaptcha_div["data-sitekey"]

# Step 3: Solve the CAPTCHA
token = solver.solve_recaptcha_v2(site_key, url)

# Step 4: Submit the form with the token
form_data = {
    "q": "search term",
    "g-recaptcha-response": token
}
result = session.post(url, data=form_data)

# Step 5: Parse the results
result_soup = BeautifulSoup(result.text, "html.parser")
items = result_soup.find_all("div", class_="result-item")
for item in items:
    print(item.text.strip())

Парсинг нескольких страниц

Для результатов с разбивкой на страницы после CAPTCHA:

def scrape_all_pages(base_url, site_key, max_pages=10):
    solver = CaptchaSolver("YOUR_API_KEY")
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    })
    all_results = []

    for page_num in range(1, max_pages + 1):
        page_url = f"{base_url}?page={page_num}"

        # Solve CAPTCHA for each page if needed
        token = solver.solve_recaptcha_v2(site_key, page_url)

        resp = session.get(page_url, params={
            "g-recaptcha-response": token,
            "page": page_num
        })

        soup = BeautifulSoup(resp.text, "html.parser")
        items = soup.find_all("div", class_="item")

        if not items:
            break

        all_results.extend([item.text.strip() for item in items])
        print(f"Page {page_num}: {len(items)} items")

        time.sleep(2)  # Polite delay

    return all_results

Обработка изображений CAPTCHA

Для сайтов с текстовыми CAPTCHA на основе изображений:

import base64

def scrape_with_image_captcha(url):
    solver = CaptchaSolver("YOUR_API_KEY")
    session = requests.Session()

    page = session.get(url)
    soup = BeautifulSoup(page.text, "html.parser")

    # Find the CAPTCHA image
    captcha_img = soup.find("img", {"id": "captcha-image"})
    captcha_url = captcha_img["src"]

    # Download and encode the image
    img_resp = session.get(captcha_url)
    img_base64 = base64.b64encode(img_resp.content).decode()

    # Solve
    captcha_text = solver.solve_image(img_base64)

    # Submit
    form_data = {
        "captcha": captcha_text,
        "username": "user"
    }
    result = session.post(url, data=form_data)
    return result.text

Обработка ошибок и повторные попытки

Добавьте логику повтора для рабочих парсеров:

def solve_with_retry(solver, site_key, page_url, max_retries=3):
    for attempt in range(max_retries):
        try:
            return solver.solve_recaptcha_v2(site_key, page_url)
        except Exception as e:
            if attempt == max_retries - 1:
                raise
            print(f"Attempt {attempt + 1} failed: {e}. Retrying...")
            time.sleep(2)

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

Проблема Причина Исправить
ERROR_WRONG_USER_KEY Неверный ключ API Подтвердите ключ с панели управления
ERROR_ZERO_BALANCE Нет средств Пополните свой счет
Отправка формы снова возвращает страницу CAPTCHA Срок действия токена истек или неправильное имя поля Используйте токен немедленно; проверить имена полей формы
ConnectionError Проблема с сетью Добавить логику повтора с экспоненциальной задержкой
Пустые результаты после отправки Для сайта требуются файлы cookie/session Используйте requests.Session() для поддержки файлов cookie.

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

Нужен ли мне Selenium для очистки CAPTCHA в Python?

Не всегда. Если форма сайта работает со стандартными запросами HTTP POST, requests + CaptchaAI работает быстрее и легче, чем Selenium. Используйте Selenium только тогда, когда сайт требует рендеринга JavaScript.

Могу ли я решить CAPTCHA асинхронно?

Да. Используйте aiohttp с API CaptchaAI для асинхронных рабочих процессов. Видетьaiohttp + CaptchaAI Интеграция.

Как мне справиться с ограничением скорости?

Добавляйте задержки между запросами (time.sleep(2-5)), меняйте прокси и используйте реалистичные заголовки. ВидетьРотация прокси для парсинга CAPTCHA.

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

Комментарии для этой статьи отключены.

Похожие сообщения

Tutorials Кеширование CAPTCHA-токенов в собственном backend в пределах TTL
Корректно кешируйте и переиспользуйте CAPTCHA-токены в пределах официального TTL для идемпотентных ретраев в собственном backend.

Корректно кешируйте и переиспользуйте CAPTCHA-токены в пределах официального TTL для идемпотентных ретраев в с...

May 02, 2026
Use Cases Тестирование CAPTCHA для e-commerce checkout с высокой нагрузкой
QA-руководство по проверке CAPTCHA в собственных checkout-сценариях e-commerce в staging: фиктивный инвентарь, тестовые платежные токены и Captcha AI.

QA-руководство по проверке CAPTCHA в собственных checkout-сценариях e-commerce в staging: фиктивный инвентарь,...

May 05, 2026
Comparisons подходящий сравнение решателей результатов reCAPTCHA v3
Практическое сравнение результатов сравнения решателей re CAPTCHA v 3, сосредоточенное на различиях в стоимости, точности, скорости и усилиях по интеграции Capt...

Практическое сравнение результатов сравнения решателей re CAPTCHA v 3, сосредоточенное на различиях в стоимост...

Apr 26, 2026