📅  最后修改于: 2020-11-07 08:05:44             🧑  作者: Mango
在本章中,让我们了解如何执行Web抓取和处理用于测试用户的人类或机器人的CAPTCHA。
CAPTCHA的完整形式是完全自动化的公共Turing测试,可以告诉Computers and Humans Apart ,它清楚地表明,这是确定用户是否为人类的测试。
验证码是失真的图像,通常不易通过计算机程序检测到,但是人类可以以某种方式设法理解它。大多数网站都使用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 = 'http://example.webscraping.com/user/register'
ckj = cookielib.CookieJar()
browser = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckj))
html = browser.open(
'
http://example.webscraping.com/places/default/user/register?_next = /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库完成以下操作:
枕头是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脚本使用了枕头Python包,并定义了用于加载CAPTCHA图像的函数。它必须与先前脚本中定义的名为form_parser()的函数一起使用,以获取有关注册表单的信息。该脚本将以一种有用的格式保存CAPTCHA图像,该图像可以进一步提取为字符串。
以有用的格式加载CAPTCHA之后,我们可以借助光学字符识别(OCR)来提取它,该过程是从图像中提取文本的过程。为此,我们将使用开源Tesseract OCR引擎。可以在以下命令的帮助下安装-
pip install pytesseract
在这里,我们将扩展上述Python脚本,该脚本通过使用Pillow Python Package加载了CAPTCHA,如下所示-
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)
运行上述脚本后,我们将获得注册表格的验证码作为输出。