Назад к статьям

Обработка CAPTCHA: автоматическое решение задач

Привет! Сегодня поговорим о CAPTCHA — этих надоедливых головоломках, которые мешают парсить сайты. Но мы не сдаёмся! Есть способы автоматически решать CAPTCHA. 🤖

Что такое CAPTCHA и зачем она нужна?

CAPTCHA (Completely Automated Public Turing test to tell Computers and Humans Apart) — это тест, который проверяет, что ты человек, а не бот. Но мы-то знаем, как с этим справиться!

Сервисы для решения CAPTCHA

Есть несколько сервисов, которые решают CAPTCHA за тебя. Самые популярные:

  • 2Captcha — самый популярный, недорогой
  • AntiCaptcha — быстрый и надёжный
  • CapSolver — новый, но уже популярный

Интеграция с 2Captcha

Давай напишем скрипт для автоматического решения CAPTCHA через 2Captcha:

import requests import time API_KEY = "YOUR_2CAPTCHA_API_KEY" def solve_captcha_2captcha(image_base64, captcha_type='image'): """Решаем CAPTCHA через 2Captcha""" # Шаг 1: Отправляем CAPTCHA на решение submit_url = "http://2captcha.com/in.php" submit_data = { 'key': API_KEY, 'method': 'base64', 'body': image_base64 } response = requests.post(submit_url, data=submit_data) captcha_id = response.text.split('|')[1] if 'OK' in response.text else None if not captcha_id: print("Ошибка отправки CAPTCHA") return None # Шаг 2: Ждём решения (обычно 10-30 секунд) result_url = "http://2captcha.com/res.php" for _ in range(30): # Ждём максимум 30 попыток time.sleep(5) # Ждём 5 секунд между проверками params = { 'key': API_KEY, 'action': 'get', 'id': captcha_id } result_response = requests.get(result_url, params=params) if 'OK' in result_response.text: solution = result_response.text.split('|')[1] return solution elif 'CAPCHA_NOT_READY' in result_response.text: continue else: print(f"Ошибка: {result_response.text}") return None return None # Использование # Сначала нужно получить изображение CAPTCHA и конвертировать в base64 # solution = solve_captcha_2captcha(image_base64) # print(f"Решение: {solution}")

Решение reCAPTCHA v2

reCAPTCHA v2 (та самая "Я не робот") решается немного иначе:

def solve_recaptcha_v2(site_key, page_url): """Решаем reCAPTCHA v2""" # Отправляем задачу submit_url = "http://2captcha.com/in.php" submit_data = { 'key': API_KEY, 'method': 'userrecaptcha', 'googlekey': site_key, 'pageurl': page_url } response = requests.post(submit_url, data=submit_data) captcha_id = response.text.split('|')[1] if 'OK' in response.text else None if not captcha_id: return None # Ждём решения result_url = "http://2captcha.com/res.php" for _ in range(60): # reCAPTCHA решается дольше time.sleep(10) params = { 'key': API_KEY, 'action': 'get', 'id': captcha_id } result_response = requests.get(result_url, params=params) if 'OK' in result_response.text: token = result_response.text.split('|')[1] return token return None # Использование # site_key можно найти в HTML страницы # token = solve_recaptcha_v2(site_key, 'https://example.com') # Затем используем token в запросе

Используем готовую библиотеку

Есть готовая библиотека python-anticaptcha, которая упрощает работу:

# pip install python-anticaptcha from python_anticaptcha import AnticaptchaClient, ImageToTextTask def solve_with_anticaptcha(image_path): """Решаем CAPTCHA через AntiCaptcha""" client = AnticaptchaClient('YOUR_ANTICAPTCHA_API_KEY') task = ImageToTextTask(image_path) job = client.createTask(task) job.join() return job.get_captcha_text() # Использование # solution = solve_with_anticaptcha('captcha.png') # print(f"Решение: {solution}")

Интеграция с Selenium

Вот как автоматически решать CAPTCHA при парсинге с Selenium:

from selenium import webdriver from selenium.webdriver.common.by import By def parse_with_captcha_solving(url): """Парсим сайт с автоматическим решением CAPTCHA""" driver = webdriver.Chrome() try: driver.get(url) # Проверяем, есть ли CAPTCHA try: captcha_image = driver.find_element(By.ID, 'captcha-image') # Получаем изображение CAPTCHA captcha_screenshot = captcha_image.screenshot_as_base64 # Решаем через 2Captcha solution = solve_captcha_2captcha(captcha_screenshot) if solution: # Вводим решение input_field = driver.find_element(By.ID, 'captcha-input') input_field.send_keys(solution) # Нажимаем кнопку отправки submit_btn = driver.find_element(By.ID, 'submit-btn') submit_btn.click() # Ждём загрузки контента time.sleep(2) except: # CAPTCHA не найдена, продолжаем pass # Парсим данные content = driver.find_element(By.TAG_NAME, 'body').text return content finally: driver.quit()

Стоимость и лимиты

Большинство сервисов работают по принципу оплаты за решение:

  • 2Captcha: ~$2.99 за 1000 решений обычной CAPTCHA
  • AntiCaptcha: ~$1.00 за 1000 решений
  • reCAPTCHA v2: дороже, ~$2.99 за 1000

Итоги

Автоматическое решение CAPTCHA — это не взлом, а просто использование сервисов, которые решают головоломки за тебя. Главное — правильно интегрировать это в свой парсер. Удачи! 🎯