Python网页爬取 处理验证码
在这一章中,让我们了解如何进行网络爬虫和处理验证码,验证码是用来测试用户是人类还是机器人。
什么是CAPTCHA?
CAPTCHA的全称是 Completely Automated Public Turing Test to tell Computers and Humans Apart ,这清楚地表明它是一个测试,以确定用户是否是人类。
CAPTCHA是一个扭曲的图像,通常不容易被计算机程序检测到,但人类可以以某种方式理解它。大多数网站使用CAPTCHA来防止机器人进行互动。
用Python加载验证码
假设我们想在一个网站上进行注册,并且有带CAPTCHA的表单,那么在加载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 = '<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)
在上面的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 之外,所有的信息都是可以理解的,而且是直接的。现在问题来了,我们如何处理这些复杂的信息并下载验证码。它可以在枕头Python库的帮助下完成,如下所示。
Pillow Python包
Pillow是Python图像库的一个分叉,具有处理图像的有用功能。它可以在以下命令的帮助下安装 —
pip install pillow
在下一个例子中,我们将使用它来加载验证码:
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脚本使用了 pillow python包并定义了一个加载验证码图像的函数。它必须与前面脚本中定义的名为 form_parser() 的函数一起使用,以获取注册表的信息。这个脚本将把验证码图像保存为有用的格式,并可以进一步爬取为字符串。
OCR:使用Python从图像中爬取文本
在以有用的格式加载验证码后,我们可以在光学字符识别(OCR)的帮助下爬取它,这是一个从图像中爬取文本的过程。为此目的,我们将使用开源的Tesseract OCR引擎。它可以在以下命令的帮助下安装
pip install pytesseract
例子
这里我们将扩展上面的Python脚本,它通过使用Pillow Python包加载验证码,如下所示
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脚本将以黑白模式读取验证码,这将是清晰和容易传递给魔方的,如下图所示
pytesseract.image_to_string(bw)
运行上述脚本后,我们将得到注册表的验证码作为输出。