- 日常工作中,一般各业务接口会对登录接口有所依赖,而登录接口中会存在有要求输入图片验证码的问题,最终导致爬取数据或者接口自动化测试难以顺利展开。
- 如何解决这种办法勒?
- 测试:自己公司的系统,可以叫开发屏蔽或者给一个万能验证码
- 爬虫:这种只能自行处理,下面小编将结合第三方识别工具提取并且识别验证码信息
- 1.推荐两个三方识别平台
- 2.使用图鉴识别古诗文网登录中的验证码
- 3.1:注册登录图鉴平台(自行研究)
- 3.2:登录后,点击开发文档,提取识别的源代码
- 开发文档---选择对应的语言(python)
- 封装tujian.py模块,用来识别验证码
import base64
import json
import requests
# 一、图片文字类型(默认 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:拼图识别
def base64_api(uname, pwd, img, typeid):
with open(img, 'rb') as f:
base64_data = base64.b64encode(f.read())
b64 = base64_data.decode()
data = {"username": uname, "password": pwd, "typeid": typeid, "image": b64}
result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text)
if result['success']:
return result["data"]["result"]
else:
return result["message"]
return ""
def getImgCodeText(imgPath,imgType):
result = base64_api(uname='图鉴平台账号', pwd='图鉴平台密码', img = imgPath, typeid = imgType)
return result
- 3.3:分析以上脚本可知,我们需要识别图片验证码文本,需要知道图片路径、图片文字类型
- 图片路径,我们可以通过requests获取页面源码,保持验证码图片至本地
- 图片文字类型,通过多次刷新页面,我们发现验证码文本为4位的数字+字母,typeid = 3即可
import requests
from tujian import getImgCodeText
from lxml import etree
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.80 Safari/537.36',
}
#获取图片验证码链接
response = requests.get(url = url,headers = headers)
page_text = response.text
tree = etree.HTML(page_text)
img_src = 'https://so.gushiwen.cn/' + tree.xpath('//*[@id="imgCode"]/@src')[0]
# print(img_src)
#请求图片链接,获取图片数据并且保存至本地
img_data = requests.get(url = img_src,headers = headers).content
with open('./code.jpg','wb') as fp:
fp.write(img_data)
#通过封装好的图鉴脚本,识别图片验证码的内容
text = getImgCodeText('./code.jpg',3)
print(text)