赞
踩
验证码是页面上非常常见的一种识别用户身份的方式,如图所示:
在使用爬虫爬取网页时,我们要对验证码进行自动的识别和填写。这里使用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进行训练。具体方式可以参考相关技术文档。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。