验证码识别
点触验证码识别
爬虫遇到最多的就是验证码,验证码也是当前最为有效的反爬措施,python中机器视觉也有相关的模块解决这种情况
一、概述
1. OCR
光学字符识别(Optical Character Recognition)
2. 原理
通过扫描等光学输入方式将各种票据、报刊、书籍、文稿及其它印刷品的文字转化为图像信息,再利用文字识别技术将图像信息转化为电子文本
3. tesserct-ocr
OCR的一个底层识别库(不是模块,不能导入)
Google维护的开源OCR识别库
4. pytesseract
Python模块,可调用底层识别库
对tesseract-ocr做的一层Python API封装
安装
Ubuntu
sudo apt-get install tesseract-ocr
Windows
下载安装包``
字体库
https://github.com/tesseract-ocr/tessdata
测试
终端 | cmd命令行
tesseract xxx.jpg 文件名
二、在线打码
网络上在线打码平台不计其数,这里以云打码为例
tesseract-ocr识别率很低,文字变形、干扰,导致无法识别验证码
1. 使用
- 下载并查看接口文档
- 调整接口文档,调整代码并接入程序测试
- 真正接入程序,在线识别后获取结果并使用
该演示涉及网站会员信息,不便展示,只做简要提示
-
下载API示例点击下载
-
写一个方法将其封装起来,记得填好自己的用户名和密码
def get_result(filename): # 用户名 username = 'xxxxxxx' # 密码 password = 'xxxxxxx' # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得! appid = 1 # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得! appkey = '22cc5376925e9387a23cf797cb9ba745' # 图片文件 filename = filename # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html codetype = 5000 # 超时时间,秒 timeout = 60 # 检查 if (username == 'username'): print('请设置好相关参数再测试') else: # 初始化 yundama = YDMHttp(username, password, appid, appkey) # 登陆云打码 uid = yundama.login() # 查询余额 balance = yundama.balance() # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果 cid, result = yundama.decode(filename, codetype, timeout) return result
-
在使用的时候直接调用即可
2. 示例
'''
以云打码为例,识别其登录验证码
'''
from fake_useragent import UserAgent
from ydmapi import * # 刚才修改的API
def get_cap():
headers = {'User-Agent':UserAgent().random}
url = "http://www.yundama.com/index/captcha"
html = requests.get(url=url, headers=headers).content
with open('demo.png', "wb") as f:
f.write(html)
if __name__ == '__main__':
get_cap()
result = get_result("demo.png")
print(result)
chancey@PythonServer:~/project/spider$ ls
00-test_ydm.py 01-ydm-yzm.py 02-ydm-yzm.py demo.png __pycache__ ydmapi.py
chancey@PythonServer:~/project/spider$ python3 02-ydm-yzm.py
EGIV # 识别数来的EGIV