一、在测试的过程中解决验证码的问题有以下几种方式:
1.在测试环境将验证码屏蔽掉
2.设置万能验证码
3.通过cookies绕过
4.通过图片识别的方式,进行识别
二、本篇文章主要讨论使用识别的方式进行验证码的识别
2.1 具体的实现思路如下:
- 获取验证码图片,并将图片保存到本地
-
from lxml import etree import requests import tujian headers = { 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36' } #将验证码图片请求后保存到本地 login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx' page_text = requests.get(url=login_url,headers=headers).text tree = etree.HTML(page_text) img_src = 'https://so.gushiwen.cn'+tree.xpath('//*[@id="imgCode"]/@src')[0] code_data = requests.get(url=img_src,headers=headers).content with open('./code.jpg','wb') as fp: fp.write(code_data)
- 识别验证码图片
- 使用ddddocr来进行识别(免费)
-
import ddddocr with open("v1.png", 'rb') as f: img_bytes = f.read() ocr = ddddocr.DdddOcr(show_ad=False) code = ocr.classification(img_bytes) print(code)
- 使用muggle_ocr(麻瓜) 来进行识别(免费)
import muggle_ocr
from muggle_ocr import ModelType
# 二进制 模式打开文件
with open(r"v2.png", "rb") as f:
# 方法用于从文件读取指定的字节数
b = f.read()
# model_type 包含了 ModelType.OCR/ModelType.Captcha 两种
# ModelType.OCR 用于识别普通印刷文本 是ModelType.Captcha 可识别光学印刷文本
sdk = muggle_ocr.SDK(model_type=ModelType.Captcha)
text = sdk.predict(image_bytes=b)
print(text)
- 使用 第三方打码平台(收费)
result = tujian.getImgCodeText('./code.jpg',3)
print(result)
# 一、图片文字类型(默认 3 数英混合):
# 1 : 纯数字
# 1001:纯数字2
# 2 : 纯英文
# 1002:纯英文2
# 3 : 数英混合
# 1003:数英混合2
# 4 : 闪动GIF
# 7 : 无感学习(独家)
# 11 : 计算题
# 1005: 快速计算题
# 16 : 汉字
# 32 : 通用文字识别(证件、单据)
# 66: 问答题
# 49 :recaptcha图片识别
# 二、图片旋转角度类型:
# 29 : 旋转类型
#
# 三、图片坐标点选类型:
# 19 : 1个坐标
# 20 : 3个坐标
# 21 : 3 ~ 5个坐标
# 22 : 5 ~ 8个坐标
# 27 : 1 ~ 4个坐标
# 48 : 轨迹类型
#
# 四、缺口识别
# 18 : 缺口识别(需要2张图 一张目标图一张缺口图)
# 33 : 单缺口识别(返回X轴坐标 只需要1张图)
# 五、拼图识别
# 53:拼图识别
- 模拟登录
-
url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx' data = { "__VIEWSTATE": "opfVI7oolwkr7MLRVzsNSMASqLRUuO1dg5ZP5EIRa4FyM+mOYKEs6KWEKQKaba2ulLoZQIaLFiKK4mr5K3ci1v8ua28wtcRtabKWjOtJtU/i2etH+zSduegTMcg=", "__VIEWSTATEGENERATOR": "C93BE1AE", "from": "http://so.gushiwen.cn/user/collect.aspx", "email": "15027900535", "pwd": "bobo@15027900535", "code":result , "denglu": "登录" } #获取了登录成功后的页面源码数据 login_page_text = requests.post(url=url,headers=headers,data=data).text