Python Web Scraping - Verarbeitung von CAPTCHA
Lassen Sie uns in diesem Kapitel verstehen, wie das Web-Scraping und die Verarbeitung von CAPTCHA durchgeführt werden, das zum Testen eines Benutzers auf Mensch oder Roboter verwendet wird.
Was ist CAPTCHA?
Die vollständige Form von CAPTCHA ist Completely Automated Public Turing test to tell Computers and Humans ApartDies deutet eindeutig darauf hin, dass es sich um einen Test handelt, um festzustellen, ob der Benutzer ein Mensch ist oder nicht.
Ein CAPTCHA ist ein verzerrtes Bild, das normalerweise mit einem Computerprogramm nicht leicht zu erkennen ist, aber ein Mensch kann es irgendwie schaffen, es zu verstehen. Die meisten Websites verwenden CAPTCHA, um die Interaktion von Bots zu verhindern.
Laden von CAPTCHA mit Python
Angenommen, wir möchten uns auf einer Website registrieren und es gibt ein Formular bei CAPTCHA. Bevor wir das CAPTCHA-Bild laden, müssen wir die spezifischen Informationen kennen, die für das Formular erforderlich sind. Mit Hilfe des nächsten Python-Skripts können wir die Formularanforderungen des Registrierungsformulars auf der genannten Website verstehenhttp://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)
Im obigen Python-Skript haben wir zuerst eine Funktion definiert, die das Formular mithilfe des lxml-Python-Moduls analysiert und dann die Formularanforderungen wie folgt druckt:
{
'_formkey': '5e306d73-5774-4146-a94e-3541f22c95ab',
'_formname': 'register',
'_next': '/places/default/index',
'email': '',
'first_name': '',
'last_name': '',
'password': '',
'password_two': '',
'recaptcha_response_field': None
}
Sie können anhand der obigen Ausgabe überprüfen, ob alle Informationen außer recpatcha_response_fieldsind verständlich und unkompliziert. Nun stellt sich die Frage, wie wir mit diesen komplexen Informationen umgehen und CAPTCHA herunterladen können. Dies kann mit Hilfe der Pillow Python-Bibliothek wie folgt erfolgen:
Kissen Python-Paket
Pillow ist eine Abzweigung der Python-Bildbibliothek mit nützlichen Funktionen zum Bearbeiten von Bildern. Es kann mit Hilfe des folgenden Befehls installiert werden:
pip install pillow
Im nächsten Beispiel werden wir es zum Laden des CAPTCHA verwenden -
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
Das obige Python-Skript wird verwendet pillowPython-Paket und Definieren einer Funktion zum Laden des CAPTCHA-Images. Es muss mit der genannten Funktion verwendet werdenform_parser()Dies ist im vorherigen Skript definiert, um Informationen zum Registrierungsformular abzurufen. Dieses Skript speichert das CAPTCHA-Bild in einem nützlichen Format, das weiter als Zeichenfolge extrahiert werden kann.
OCR: Extrahieren von Text aus Bildern mit Python
Nachdem Sie das CAPTCHA in einem nützlichen Format geladen haben, können Sie es mithilfe der optischen Zeichenerkennung (OCR) extrahieren, einem Prozess zum Extrahieren von Text aus den Bildern. Zu diesem Zweck werden wir die Open-Source-OCR-Engine Tesseract verwenden. Es kann mit Hilfe des folgenden Befehls installiert werden:
pip install pytesseract
Beispiel
Hier erweitern wir das obige Python-Skript, das das CAPTCHA mithilfe des Pillow Python-Pakets geladen hat, wie folgt:
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')
Das obige Python-Skript liest das CAPTCHA im Schwarzweißmodus, der klar und einfach wie folgt an tesseract übergeben werden kann:
pytesseract.image_to_string(bw)
Nach dem Ausführen des obigen Skripts erhalten wir das CAPTCHA des Registrierungsformulars als Ausgabe.