Привет! Сегодня поговорим о 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 — это не взлом, а просто использование сервисов, которые решают головоломки за тебя. Главное — правильно интегрировать это в свой парсер. Удачи! 🎯