Капча

Обходим капчу

В процессе парсинга сайтов вы наверняка сталкивались с ограничениями, накладываемыми вебмастерами на автоматизированные методы использования ресурсов сайта. Одним из таких методов является использование капчи. Капча - это автоматизированный тест Тьюринга для различия роботов и людей. Как правило, пользователю показывается изображение с символами и система просит ввести эти символы в поле, или же показывается серия изображений и требуется выбрать только изображения с определенным признаком. Например, только те, на которых изображены автомобили, или дорожные знаки.

Существует множество сервисов и программных продуктов, позволяющих вебмастеру внедрить капчу на сайт. Наиболее распространены сервисы Google ReCaptcha и Funcaptcha. Если капча сложная и использовать OCR функционал не получается для ее обхода, то на помощь к вам придут специализированные сервисы с ручным решением капчи. С двумя такими сервисами мы внедрили интеграцию и ваши диггеры могут легко отдавать капчу для решения в эти сервисы и получать в ответ специальные токены или вручную распознанные символы с картинок в автоматическом режиме.

Для использования этого функционала вам нужно будет иметь аккаунт в одном из таких сервисов. Поскольку эти услуги платные, вы оплачиваете их самостоятельно используя ваш собственный аккаунт в этих системах.

AntiCaptcha - сервис для решения графических капч и капч типа Google ReCaptcha v2. Для Google ReCaptcha v2 может быть использован режим "без прокси", в обычном режиме вы должны для парсинга использовать свои прокси сервера с доступом по логину и паролю. Этот режим может быть полезен тем, кто не имеет своих прокси-серверов и не желает их использовать, предпочитая использовать нашу прокси сеть.

DeathByCaptcha - может практически то же, что и AntiCaptcha, кроме режима "без прокси". Также для этого провайдера у нас интегрирован только сервис для решения Google ReCaptcha v2. Поэтому, если вы хотите использовать режим "без прокси" или решать графические капчи - используйте сервис AntiCaptcha.

Команда для решения капчи captcha_resolve может быть использована в контексте блока или страницы. Процесс происходит автоматически, но так как это ручное распознавание, процесс может длиться от 20 сек до 2 минут. По завершению выполнения команды, результат распознавания (или токен для ReCaptcha v2) будет записан в переменную captcha.

Эта переменная в дальнейшем может быть прочитана в регистр и передана с формой валидации капчи, или с запросом на сервер. Ниже мы приведем пример, как правильно описывать логику работы для решения ReCaptcha v2 и обычной графической капчи.

Командой используются следующие параметры:

Параметр Описание
provider Обязательный параметр, который указывает какой провайдер для решения капчи будет использован. В данный момент поддерживаются провайдеры: deathbycaptcha.com и anticaptcha.
type Тип распознаваемой капчи. В данный момент поддерживаются опции: image для распознавания графической капчи (работает только с провайдером AntiCaptcha), nocaptchav2 для распознавания Google ReCaptcha v2 и proxyless_recaptchav2 для распознавания Google ReCaptcha v2 в режиме "без прокси" (работает только с провайдером AntiCaptcha).
image Если тип капчи image, в этом параметре передается изображение, закодированное в формате base64.
username Если вы используете провайдера Death By Captcha, в этом параметре нужно передавать ваше имя пользователя в системе deathbycaptcha.com.
password Если вы используете провайдера Death By Captcha, в этом параметре нужно передавать ваш пароль в системе deathbycaptcha.com.
apikey Если вы используете провайдера AntiCaptcha, в этом параметре нужно передавать ваш ключ к API в системе AntiCaptcha.

Рассмотрим пример, когда на странице присутствует Google ReCaptcha v2. Мы будем использовать метод "без прокси":

                        # ЗАХОДИМ НА СТРАНИЦУ С КАПЧЕЙ
- walk:
    to: https://www.nebraska.gov/sos/corp/corpsearch.cgi
    do:
    # РЕШАЕМ КАПЧУ
    - captcha_resolve:
        provider: anticaptcha
        type: proxyless_recaptchav2
        apikey: xxxxxxxxxxxxxxxxxxx
    - find: 
        path: body 
        do: 
        # ПРОВЕРЯЕМ ЕСТЬ ЛИ ТОКЕН В ПЕРЕМЕННОЙ captcha
        - variable_get: captcha 
        - if:
            match: \S
            do:
            # ТОКЕН НА МЕСТЕ, ОТПРАВЛЯЕМ ФОРМУ
            - walk:
                to:
                    post: https://www.nebraska.gov/sos/corp/corpsearch.cgi
                    data:
                        search: 1
                        keyword_type: all
                        search_type: num_search
                        corpname: 
                        acct-num: 1000011010101
                        g-recaptcha-response: <%captcha%>
                        submit: submit
                do:
                # ОБРАБАТЫВАЕМ СТРАНИЦУ И СОБИРАЕМ ДАННЫЕ
                        
                    

Приведем еще один пример для графической капчи:

                            # ЗАХОДИМ НА СТРАНИЦУ С КАПЧЕЙ
- walk:
    to: https://eservices.cmcoh.org/eservices/home.page
    headers:
        Wicket-Focusedelementid: ''
        Wicket-Ajax: ''
    do:
    # ИЩЕМ ЭЛЕМЕНТ С ИЗОБРАЖЕНИЕМ КАПЧИ
    - find:
        path: img.captchaImg
        do:
        - parse:
            attr: src
        # ЗАГРУЖАЕМ КАРТИНКУ В BASE64
        - walk:
            to: value
            do:
            - find:
                path: imgbase64
                do:
                - parse
                - variable_set: image
                # РЕШАЕМ КАПЧУ
                - captcha_resolve:
                    provider: anticaptcha
                    type: image
                    apikey: xxxxxxxxxxxxxxxxxxx
                    image: <%image%>
    - find:
        path: a.anchorButton
        do:
        - variable_get: captcha
        - if:
            match: \w+
            do:
            # ЕСЛИ КАПЧА РАСПОЗНАНА, ОТПРАВЛЯЕМ ЕЕ НА СЕРВЕР И СОБИРАЕМ ДАННЫЕ
                        
                    

В некоторых случаях капча может быть распознана неверно. В этом случае вы можете отправить отчет о неправильно решенной капче с помощью команды captcha_report. В этом случае неправильно распознанная капча может быть вам компенсирована сервисом распознавания капчи. Будьте предельно внимательны и не отправляйте такой отчет если капча была корректно распознана, в противном случае сервис по распознаванию капч может наложить на вас санкции.

                            # ЗАХОДИМ НА СТРАНИЦУ С КАПЧЕЙ
- walk:
    to: https://www.nebraska.gov/sos/corp/corpsearch.cgi
    do:
    # РЕШАЕМ КАПЧУ
    - captcha_resolve:
        provider: anticaptcha
        type: proxyless_recaptchav2
        apikey: xxxxxxxxxxxxxxxxxxx
    - find: 
        path: body 
        do: 
        # ПРОВЕРЯЕМ ЕСТЬ ЛИ ТОКЕН В ПЕРЕМЕННОЙ captcha
        - variable_get: captcha 
        - if:
            match: \S
            do:
            # ТОКЕН НА МЕСТЕ, ОТПРАВЛЯЕМ ФОРМУ
            - walk:
                to:
                    post: https://www.nebraska.gov/sos/corp/corpsearch.cgi
                    data:
                        search: 1
                        keyword_type: all
                        search_type: num_search
                        corpname: 
                        acct-num: 1000011010101
                        g-recaptcha-response: <%captcha%>
                        submit: submit
                do:
                - variable_clear: recap
                - find: 
                    path: body 
                    do:
                    # ПРОВЕРЯЕМ ПРИНЯТА ЛИ НАША КАПЧА
                    - find: 
                        path: .g-recaptcha 
                        do: 
                        # ЕСЛИ ЭТОТ БЛОК ЕСТЬ НА СТРАНИЦЕ, ЗНАЧИТ НАШ ТОКЕН НЕКОРРЕКТНЫЙ, КАПЧА БЫЛА РЕШЕНА НЕВЕРНО И НУЖНО СНОВА ВВОДИТЬ КАПЧУ
                        - parse:
                            attr: data-sitekey
                        - variable_set: recap
                    - variable_get: recap
                    - if:
                        match: \S
                        do:
                        # КАПЧА РЕШЕНА НЕВЕРНО, ОТПРАВЛЯЕМ ОТЧЕТ О НЕВЕРНО РЕШЕННОЙ КАПЧЕ
                        - captcha_report
                        else:
                        # КАПЧА РЕШЕНА ВЕРНО, СОБИРАЕМ ДАННЫЕ
                        
                    

Далее мы рассмотрим функции, предназначенные для работы с географическими данными.