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