Большинство ценных веб-сайтов используют 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 при парсинге