Решение капчи для
Scrapy
Проходите проверку прямо в ходе запуска, а не проваливайте задание. Рабочий пример на Python и три фактора, от которых зависит, будет ли принят ваш токен.
# middlewares.py
import time
import requests
CAPTCHANO_KEY = "cn-YOUR_API_KEY"
HEADERS = {"Authorization": f"Bearer {CAPTCHANO_KEY}"}
def solve(task: dict) -> dict:
"""Block until solved; returns e.g. {"token": "...", "userAgent": "..."}."""
r = requests.post(
"https://api.captchano.com/v1/solve",
params={"wait": 60},
json=task,
headers=HEADERS,
timeout=75,
)
data = r.json()
# A solve can outlast the 60 s wait: poll the task until it finishes.
while data.get("status") in ("queued", "solving"):
time.sleep(5)
data = requests.get(
f"https://api.captchano.com/v1/task/{data['id']}",
headers=HEADERS,
timeout=30,
).json()
if data.get("status") != "ready":
raise RuntimeError(data.get("error") or data)
return data["solution"]
class CaptchaNoMiddleware:
def process_response(self, request, response, spider):
sitekey = response.css("[data-sitekey]::attr(data-sitekey)").get()
if not sitekey:
return response
solution = solve({"type": "recaptcha_v2", "sitekey": sitekey, "url": response.url})
return request.replace(
method="POST",
body=f"g-recaptcha-response={solution['token']}",
headers={"Content-Type": "application/x-www-form-urlencoded"},
dont_filter=True,
)От чего зависит, будет ли принят токен
- Передавайте свой прокси. Токен должен быть получен с того же исходящего IP, с которого он отправляется. Для систем с оценкой сессии это обязательное условие, а не оптимизация.
- Совпадение user agent. Turnstile и ряд антибот-систем привязывают токен к user agent. Мы возвращаем использованный user agent, чтобы вы могли воспроизвести его в точности.
- Запрашивайте как можно позже. Токены истекают примерно через 120 секунд. Запрашивайте токен, когда будете готовы к отправке.
Блокирующий вызов или опрос
В примере используется ?wait=60, поэтому вызов возвращает готовое решение, и шаг в Scrapy остаётся линейным. Если не хотите держать соединение, уберите параметр, сохраните полученный id и опрашивайте GET /v1/task/{id} каждые пять секунд. Оплаченный токен можно получить в течение десяти минут, так что обрыв соединения не стоит вам решения.
Стоимость
$0.00598 за каждое успешное решение reCAPTCHA v2; неудачные решения никогда не оплачиваются. Цены на все типы проверок — на странице цен, полный формат запроса — в справочнике API.
Как решение встраивается в Scrapy
В Scrapy нет браузера, поэтому капча обрабатывается в downloader middleware: обнаружьте проверку в ответе, решите её и повторите запрос с токеном или cookie.
- 01Обнаружение в process_response
Ищите data-sitekey или известную страницу проверки в теле ответа.
- 02Решите
Вызовите API с sitekey, response.url и прокси из request.meta.
- 03Повторите с токеном
Верните FormRequest с токеном или исходный запрос с полученной cookie.
- 04Сохраняйте cookie
Пусть cookie middleware Scrapy сохраняет пройденную сессию для следующих запросов.
Как передать токен на страницу
Middleware добавляет токен в данные формы или устанавливает полученную cookie, а затем возвращает новый Request.
Где интеграции обычно ломаются
Синхронный HTTP-вызов в middleware останавливает все запросы. Используйте асинхронный клиент или отдельный поток для решения.
Если прокси-middleware меняет IP на каждый запрос, зафиксируйте IP для повтора, чтобы он совпадал с решением.
Ограничьте число повторов на URL. Страница, которая каждый раз показывает проверку, подсказывает вам сбавить темп.
Частые вопросы о капче в Scrapy
Может ли Scrapy решать JavaScript-проверки?
Scrapy не выполняет JavaScript. Для проверок с токенами нужны только sitekey и URL; для систем с оценкой сессии, таких как DataDome, вы отправляете URL проверки и получаете cookie, которую Scrapy может использовать повторно.
Может, лучше использовать scrapy-playwright?
Только если странице нужен JavaScript для отрисовки контента. Для капч с токенами подход с middleware легче и быстрее, чем запуск браузера на каждый запрос.
Где должен стоять middleware?
После прокси-middleware и перед retry middleware — так он видит прокси, который будет использован, а его собственные повторы не учитываются дважды.
Как не платить за повторные решения?
Сохраняйте cookie между запросами и соблюдайте темп обхода. Пройденная сессия часто остаётся чистой на протяжении многих страниц, а оплачиваются только успешные решения.
Полезные руководства
Готовы начать?
Начните с бесплатного 3-дневного пробного периода, а по мере роста трафика платите за каждое успешное решение. Для пробного периода карта не нужна.