python识别验证码

验证码是页面上非常常见的一种识别用户身份的方式,如图所示:

Image CAPTCHA

在使用爬虫爬取网页时,我们要对验证码进行自动的识别和填写。这里使用tesseract来完成对验证码的扫描识别。

1. 安装tesseract。

tesseract是一个独立的软件,并不是python模块,需要单独的下载并安装。

下载地址:https://github.com/UB-Mannheim/tesseract/wiki 选择适当的版本下载。

当前最新版本是64位的4.00版本。下载后双击安装即可。

安装完毕后要将tesseract.exe路径添加到环境变量中,在命令行窗口输入tesseract --version测试:

2. 我们的测试网站是http://www.pythonscraping.com/humans-only 打开网页后有一个需要用户提交的表格,在提交内容的下方有一个由网站生成的验证码:

 利用requests访问网站,利用BeautifulSoup提取填写表格时必须要的验证信息,利用pillow处理和保存图片。

resp = requests.get('http://www.pythonscraping.com/humans-only')
bsobj = BeautifulSoup(resp.text, features='html.parser')

表格中有很多防止CSRF的隐藏域,通过Chrome的开发者工具可以获得这些隐藏域的值。通过表单提交数据也必须提交这些隐藏域的信息作为CSRF_TOKEN,否则表单验证不会通过:

图中标红框的内容都是要提取的内容,三个隐藏input的value值是CSRF_TOKEN,img标签的src值是验证码图片的地址。

imageURL = bsobj.find('img', {'title': 'Image CAPTCHA'})['src']
formBuildID = bsobj.find('input', {'name': 'form_build_id'})['value']
captchaSid = bsobj.find('input', {'name': 'captcha_sid'})['value']
captchaToken = bsobj.find('input', {'name': 'captcha_token'})['value']

 3. 根据imageURL发起网络请求获得验证码图片。需要注意的是,src是一个相对路径,访问时要使用完整的路径:

imgContent = requests.get('http://pythonscraping.com' + imageURL)
image = Image.open(BytesIO(imgContent.content))
filename = 'captcha.jpg'
image.save(filename)

imgContent.content是图片的二进制格式,利用pillow的Image和io的BytesIO封装为一个pillow的Image对象,调用save方法将图片保存到指定路径。

4. 为了提高识别的准曲率,可以适当对图像进行处理。增加图像的对比度:

img = Image.open(filename)
img = img.point(lambda x: 0 if x < 143 else 255)
borderImg = ImageOps.expand(img, 10, 'white')
borderImg.save(filename)

尽量减少图像上的灰色内容,做到非黑即白。

5. 在python中开启一条进程,启动tesseract识别图片中的内容,并将识别结果输出到一个txt文件中保存:

p = subprocess.Popen(['tesseract', 'captcha.jpg', 'captcha'],
                     stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
p.wait()

通过subprocess在当前py运行的进程中开启另外一个线程运行tesseract,并且当前线程暂停等待tesseract线程完成识别工作并将识别结果保存到captcha.txt中。

6. 打开captcha.txt,读取解析结果:

with open('captcha.txt', 'r') as reader:
    catchacode = reader.read().replace(' ', '').replace('\n', '')
    print('验证码为:', catchacode)

对识别中产生的空格和换行都做了替换处理,最终打印识别的结果。

识别效果展示:

识别效果还可以,但并不是每次都可以正确识别的。为了提高tesseract的识别率,可以对tesseract进行训练。具体方式可以参考相关技术文档。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值