在本章中,让我们了解如何执行Web抓取和处理CAPTCHA,用于测试用户的人或机器人.
什么是CAPTCHA?
CAPTCHA的完整形式是完全自动化的公共图灵测试,以告诉计算机和人类,这清楚地表明它是一个测试,以确定用户是否是人.
CAPTCHA是一个扭曲的图像,通常不容易通过计算机程序检测到,但人类可以以某种方式设法理解它.大多数网站使用CAPTCHA来防止僵尸程序进行交互.
用Python加载CAPTCHA
假设我们想在网站上进行注册并且有使用CAPTCHA表格,然后在加载CAPTCHA图像之前,我们需要知道表格所需的具体信息.在下一个Python脚本的帮助下,我们可以在名为 http:/的网站上了解注册表单的表单要求/example.webscrapping.com.
import lxml.htmlimport urllib.request as urllib2import pprintimport http.cookiejar as cookielibdef 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 dataREGISTER_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库的帮助下完成,如下所示;
Pillow Python包
枕头是Python图像库的一个分支,有用用于处理图像的功能.它可以在以下命令和减号的帮助下安装;
pip install pillow
在下一个例子中,我们将使用它从io import BytesIO
import lxml加载CAPTCHA :
from io import BytesIOimport lxml.htmlfrom PIL import Imagedef 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图像,该格式可进一步提取为字符串.
OCR:使用Python从图像中提取文本
之后以有用的格式加载CAPTCHA,我们可以借助光学字符识别(OCR)提取它,这是一个从图像中提取文本的过程.为此,我们将使用开源Tesseract OCR引擎.它可以在以下命令和减号的帮助下安装;
pip install pytesseract
示例
这里我们将扩展上面的Python脚本,它使用Pillow Python Package加载CAPTCHA,如下 :
import pytesseractimg = 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作为输出.