识别图片验证码
1.识别流程
- 获取图片生成的url,进而获取要识别的验证码
- 通过第三方库识别验证码
- 输出识别结果
2.识别方法
我们这里通过chaojiying(付费,识别度高)和Tesseract(免费,对于中文识别程度较差)进行识别。
3.操作
3.1.基本框架
我们以登陆人人网为例,进行识别验证码的操作。
首先,我们进入人人网,获取人人网验证码图片的地址,
注意,这里rnd是随机生成的因此,我们需要用random模块,随机输出。
我们登录人人网,并通过fiddler工具获取登录所需要的相关参数。以下是除识别验证码代码的基本框架,
import requests
import random
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36 Edg/83.0.478.56",
}
def get_code():
url = "http://icode.renren.com/getcode.do?t=web_login&rnd={}".format(random.random())
# 使用random.random()格式化url地址
res = requests.get(url, headers=headers)
# 保存图片,二进制写入
with open('code.jpg', 'wb') as fp:
fp.write(res.content)
fp.flush() # 不用回车就往里写
"""
识别验证码区域代码(待完成)
"""
def login(code):
# 通过fiddler抓取相关参数和传入参数的地址
url = "http://www.renren.com/ajaxLogin/login?1=1&uniqueTimestamp=202063121980"
data = {
'email': '账号',
'password': '密码',
'icode': code, # 识别出的验证码结果
'origURL': 'http://www.renren.com/home',
'domain': 'renren.com',
'kwy_id': 1,
'captcha_type': 'web_login',
'f': 'http://www.renren.com/974712722', # 跳转地址
}
res = session.post(url, headers=headers, data=data)
# session对象保存了我们登陆后的信息,后期请求个人中心是携带着登陆信息的
res = res.content.decode()
print(res)
def get_profile():
url = "http://www.renren.com/974712722/profile"
res = session.get(url, headers=headers)
result = res.content.decode()
print(result)
if __name__ == '__main__':
session = requests.session() # 创建一个session对象存放会话数据
# 获取验证码图片,交给第三方打码平台进行识别
code = get_code()
# 登录
login(code)
# 获取个人中心页
get_profile()
3.2.chaojiying识别图片验证码
我们登录超级鹰首页,并注册。
进入开发文档,下载python开发文档。解压,放入python文件目录。
以下为识别图片验证码的代码,
chaojiying = Chaojiying_Client('超级鹰用户名', '密码', '软件ID') # 用户中心>>软件ID 生成软件ID
im = open('code.jpg', 'rb').read() # 读取图片
result = chaojiying.PostPic(im, 1902)['pic_str'] # 识别验证码
return result # 返回验证码
3.3.Tesseract识别图片验证码
Tesseract是一个OCR库,目前由谷歌赞助。Tesseract是目前公认最优秀、最准确的开源OCR库。Tesseract具有很高的识别度,也具有很高的灵活性,他可以通过训练识别任何字体。
安装包下载。
安装完成后,我们需要将Tesseract安装位置添加到Path环境变量中。
我们可以在cmd中使用代码实现识别图片内容,
tesseract 图片路径 结果存放路径
在python中,我们需要先安装pytesseract,
pip install pytessseract
使用以下代码来识别图片,
import pytesseract
from PIL import Image # 安装pillow
pytesseract.pytesseract.tesseract_cmd = r"tesseract.exe位置路径" # 设置tesseract.exe位置路径
image = Image.open('code.jpg') # 打开图片
text = pytesseract.image_to_string(image, lang='eng') # 识别
print(text)
如果要用Tesseract识别中文,需要在源码地址中的tessdata_best文件中下载chi_sim.traineddata训练数据并将其放入Tesseract安装目录中的tessdata文件夹下。
注意,因为中文训练数据过于陈旧,因此中文识别准确度不高。