Учебники

Python Web Scraping — Обработка CAPTCHA

В этой главе мы поймем, как выполнять очистку и обработку веб-страниц 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 регистрационной формы в качестве вывода.