В этой главе мы поймем, как выполнять очистку и обработку веб-страниц CAPTCHA, которая используется для тестирования пользователя на человека или робота.
Что такое капча?
Полной формой CAPTCHA является полностью автоматизированный публичный тест Тьюринга, который говорит «Компьютеры и люди отдельно» , который ясно показывает, что это тест для определения, является ли пользователь человеком или нет.
CAPTCHA — это искаженное изображение, которое обычно нелегко обнаружить с помощью компьютерной программы, но человек может каким-то образом понять его. Большинство сайтов используют CAPTCHA для предотвращения взаимодействия ботов.
Загрузка капчи с Python
Предположим, что мы хотим зарегистрироваться на веб-сайте, и есть форма с CAPTCHA, а затем, перед загрузкой изображения CAPTCHA, мы должны узнать о конкретной информации, требуемой в форме. С помощью следующего скрипта Python мы можем понять требования к форме регистрации на веб-сайте http://example.webscrapping.com.
import lxml.html import urllib.request as urllib2 import pprint import http.cookiejar as cookielib def form_parsing(html): tree = lxml.html.fromstring(html) data = {} for e in tree.cssselect('form input'): if e.get('name'): data[e.get('name')] = e.get('value') return data REGISTER_URL = '<a target="_blank" rel="nofollow" href="http://example.webscraping.com/user/register">http://example.webscraping.com/user/register'</a> ckj = cookielib.CookieJar() browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckj)) html = browser.open( '<a target="_blank" rel="nofollow" href="http://example.webscraping.com/places/default/user/register?_next"> http://example.webscraping.com/places/default/user/register?_next</a> = /places/default/index' ).read() form = form_parsing(html) pprint.pprint(form)
В приведенном выше скрипте Python сначала мы определили функцию, которая будет анализировать форму с помощью модуля Python lxml, а затем она напечатает требования к форме следующим образом:
{ '_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab', '_formname': 'register', '_next': '/places/default/index', 'email': '', 'first_name': '', 'last_name': '', 'password': '', 'password_two': '', 'recaptcha_response_field': None }
Вы можете проверить из вышеприведенного вывода, что вся информация, кроме recpatcha_response_field , понятна и понятна. Теперь возникает вопрос, как мы можем обработать эту сложную информацию и загрузить CAPTCHA. Это можно сделать с помощью подушки библиотеки Python следующим образом;
Подушка Python Пакет
Подушка — это форк библиотеки изображений Python с полезными функциями для работы с изображениями. Это может быть установлено с помощью следующей команды —
pip install pillow
В следующем примере мы будем использовать его для загрузки CAPTCHA —
from io import BytesIO import lxml.html from PIL import Image def load_captcha(html): tree = lxml.html.fromstring(html) img_data = tree.cssselect('div#recaptcha img')[0].get('src') img_data = img_data.partition(',')[-1] binary_img_data = img_data.decode('base64') file_like = BytesIO(binary_img_data) img = Image.open(file_like) return img
Вышеприведенный скрипт Python использует пакет подушек Python и определяет функцию для загрузки изображения CAPTCHA. Он должен использоваться с функцией с именем form_parser () , определенной в предыдущем скрипте, для получения информации о форме регистрации. Этот скрипт сохранит изображение CAPTCHA в полезном формате, который затем может быть извлечен в виде строки.
OCR: извлечение текста из изображения с использованием Python
После загрузки CAPTCHA в полезном формате мы можем извлечь ее с помощью Optical Character Recognition (OCR), процесса извлечения текста из изображений. Для этой цели мы собираемся использовать движок Tesseract OCR с открытым исходным кодом. Это может быть установлено с помощью следующей команды —
pip install pytesseract
пример
Здесь мы расширим приведенный выше скрипт Python, который загрузил CAPTCHA с помощью пакета подушек Python, следующим образом:
import pytesseract img = get_captcha(html) img.save('captcha_original.png') gray = img.convert('L') gray.save('captcha_gray.png') bw = gray.point(lambda x: 0 if x < 1 else 255, '1') bw.save('captcha_thresholded.png')
Приведенный выше скрипт Python будет читать CAPTCHA в черно-белом режиме, который будет понятен и легко передается в tesseract следующим образом:
pytesseract.image_to_string(bw)
После запуска вышеуказанного скрипта мы получим CAPTCHA регистрационной формы в качестве вывода.