requests高级之图形验证码

  • 日常工作中,一般各业务接口会对登录接口有所依赖,而登录接口中会存在有要求输入图片验证码的问题,最终导致爬取数据或者接口自动化测试难以顺利展开。
  • 如何解决这种办法勒?
    • 测试:自己公司的系统,可以叫开发屏蔽或者给一个万能验证码
    • 爬虫:这种只能自行处理,下面小编将结合第三方识别工具提取并且识别验证码信息
  • 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)
posted @ 2022-03-21 22:49  Tony_xiao  阅读(455)  评论(0编辑  收藏  举报