Python Web Scraping - обработка CAPTCHA

В этой главе давайте поймем, как выполнять парсинг веб-страниц и обрабатывать CAPTCHA, которая используется для тестирования пользователя на человека или робота.

Что такое капча?

Полная форма CAPTCHA: Completely Automated Public Turing test to tell Computers and Humans Apart, что явно предполагает, что это тест, чтобы определить, является ли пользователь человеком или нет.

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 сначала мы определили функцию, которая будет анализировать форму с помощью модуля lxml python, а затем она распечатает требования к форме следующим образом:

{
   '_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 Pillow следующим образом:

Подушка Python Package

Pillow - это ответвление библиотеки изображений 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 использует pillowpython и определение функции для загрузки изображения CAPTCHA. Он должен использоваться с функцией с именемform_parser()который определен в предыдущем скрипте для получения информации о регистрационной форме. Этот скрипт сохранит изображение CAPTCHA в удобном формате, который в дальнейшем может быть извлечен как строка.

OCR: извлечение текста из изображения с помощью Python

После загрузки CAPTCHA в удобном формате, мы можем извлечь ее с помощью оптического распознавания символов (OCR), процесса извлечения текста из изображений. Для этого мы собираемся использовать движок Tesseract OCR с открытым исходным кодом. Его можно установить с помощью следующей команды -

pip install pytesseract

пример

Здесь мы расширим приведенный выше скрипт Python, который загрузил CAPTCHA с помощью пакета Python Pillow, следующим образом:

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 регистрационной формы в качестве вывода.