Scraping Web Python - Traitement CAPTCHA

Dans ce chapitre, nous allons comprendre comment effectuer le scraping Web et le traitement du CAPTCHA qui est utilisé pour tester un utilisateur pour un humain ou un robot.

Qu'est-ce que CAPTCHA?

La forme complète de CAPTCHA est Completely Automated Public Turing test to tell Computers and Humans Apart, ce qui suggère clairement qu'il s'agit d'un test pour déterminer si l'utilisateur est humain ou non.

Un CAPTCHA est une image déformée qui n'est généralement pas facile à détecter par un programme informatique, mais un humain peut d'une manière ou d'une autre réussir à la comprendre. La plupart des sites Web utilisent CAPTCHA pour empêcher les robots d'interagir.

Chargement de CAPTCHA avec Python

Supposons que nous souhaitons vous enregistrer sur un site Web et qu'il existe un formulaire avec CAPTCHA, puis avant de charger l'image CAPTCHA, nous devons connaître les informations spécifiques requises par le formulaire. Avec l'aide du prochain script Python, nous pouvons comprendre les exigences de forme du formulaire d'inscription sur le site Web nommé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)

Dans le script Python ci-dessus, nous avons d'abord défini une fonction qui analysera le formulaire en utilisant le module python lxml, puis il imprimera les exigences du formulaire comme suit -

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

Vous pouvez vérifier à partir de la sortie ci-dessus que toutes les informations sauf recpatcha_response_fieldsont compréhensibles et simples. Maintenant, la question se pose de savoir comment nous pouvons gérer ces informations complexes et télécharger CAPTCHA. Cela peut être fait avec l'aide de la bibliothèque oreiller Python comme suit;

Paquet oreiller Python

Pillow est un fork de la bibliothèque d'images Python ayant des fonctions utiles pour manipuler les images. Il peut être installé à l'aide de la commande suivante -

pip install pillow

Dans l'exemple suivant, nous l'utiliserons pour charger le 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

Le script python ci-dessus utilise pillowpackage python et définition d'une fonction pour charger l'image CAPTCHA. Il doit être utilisé avec la fonction nomméeform_parser()qui est défini dans le script précédent pour obtenir des informations sur le formulaire d'inscription. Ce script enregistrera l'image CAPTCHA dans un format utile qui pourra ensuite être extrait sous forme de chaîne.

OCR: extraction de texte à partir d'une image à l'aide de Python

Après avoir chargé le CAPTCHA dans un format utile, nous pouvons l'extraire à l'aide de la reconnaissance optique de caractères (OCR), un processus d'extraction de texte à partir des images. Pour cela, nous allons utiliser le moteur Open Source Tesseract OCR. Il peut être installé à l'aide de la commande suivante -

pip install pytesseract

Exemple

Ici, nous allons étendre le script Python ci-dessus, qui a chargé le CAPTCHA en utilisant le package Pillow Python, comme suit -

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

Le script Python ci-dessus lira le CAPTCHA en mode noir et blanc qui serait clair et facile à passer à tesseract comme suit -

pytesseract.image_to_string(bw)

Après avoir exécuté le script ci-dessus, nous obtiendrons le CAPTCHA du formulaire d'inscription comme sortie.