Python Web Scraping - Przetwarzanie CAPTCHA

W tym rozdziale wyjaśnijmy, jak wykonać przeglądanie sieci i przetwarzanie CAPTCHA, które jest używane do testowania użytkownika na obecność człowieka lub robota.

Co to jest CAPTCHA?

Pełna forma CAPTCHA to Completely Automated Public Turing test to tell Computers and Humans Apart, co wyraźnie sugeruje, że jest to test mający na celu określenie, czy użytkownik jest człowiekiem, czy nie.

CAPTCHA to zniekształcony obraz, który zwykle nie jest łatwy do wykrycia przez program komputerowy, ale człowiek może w jakiś sposób go zrozumieć. Większość witryn korzysta z CAPTCHA, aby uniemożliwić botom interakcję.

Ładowanie CAPTCHA z Pythonem

Załóżmy, że chcemy dokonać rejestracji na stronie internetowej i istnieje formularz z CAPTCHA, a następnie przed załadowaniem obrazu CAPTCHA musimy wiedzieć, jakie szczegółowe informacje są wymagane przez formularz. Przy pomocy kolejnego skryptu w Pythonie możemy zrozumieć wymagania formularza rejestracyjnego na stronie o nazwiehttp://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)

W powyższym skrypcie Pythona najpierw zdefiniowaliśmy funkcję, która przeanalizuje formularz przy użyciu modułu lxml python, a następnie wydrukuje wymagania formularza w następujący sposób -

{
   '_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab',
   '_formname': 'register',
   '_next': '/places/default/index',
   'email': '',
   'first_name': '',
   'last_name': '',
   'password': '',
   'password_two': '',
   'recaptcha_response_field': None
}

Na podstawie powyższych danych wyjściowych możesz sprawdzić, czy wszystkie informacje oprócz recpatcha_response_fieldsą zrozumiałe i proste. Teraz pojawia się pytanie, jak poradzić sobie z tymi złożonymi informacjami i pobrać CAPTCHA. Można to zrobić za pomocą biblioteki Python poduszek w następujący sposób;

Pakiet Pillow Python

Pillow to rozwidlenie biblioteki Python Image posiadające przydatne funkcje do manipulowania obrazami. Można go zainstalować za pomocą następującego polecenia -

pip install pillow

W następnym przykładzie użyjemy go do załadowania 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

Powyższy skrypt w Pythonie używa pillowpython i zdefiniowanie funkcji do ładowania obrazu CAPTCHA. Musi być używany z funkcją o nazwieform_parser()to jest zdefiniowane w poprzednim skrypcie do uzyskiwania informacji o formularzu rejestracyjnym. Ten skrypt zapisze obraz CAPTCHA w użytecznym formacie, który można następnie wyodrębnić jako ciąg.

OCR: wyodrębnianie tekstu z obrazu za pomocą Pythona

Po załadowaniu CAPTCHA w przydatnym formacie możemy go wyodrębnić za pomocą optycznego rozpoznawania znaków (OCR), procesu wyodrębniania tekstu z obrazów. W tym celu wykorzystamy silnik Tesseract OCR typu open source. Można go zainstalować za pomocą następującego polecenia -

pip install pytesseract

Przykład

Tutaj rozszerzymy powyższy skrypt Pythona, który załadował CAPTCHA za pomocą pakietu Pillow Python, w następujący sposób -

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')

Powyższy skrypt Pythona odczyta CAPTCHA w trybie czarno-białym, który byłby przejrzysty i łatwy do przekazania do tesseraktu w następujący sposób -

pytesseract.image_to_string(bw)

Po uruchomieniu powyższego skryptu otrzymamy CAPTCHA formularza rejestracyjnego jako wyjście.