一、 前置回顾(承接上篇文章)
承接上篇:超级鹰账号注册、充值、获取 softid
💡 核心重点:
1.使用现成Chaojiying_Client超级鹰打码
2.DrissionPage 操控浏览器,元素截图提取验证码
3.题型编码1004:普通字符验证码识别
4.Mac / Windows 双环境适配(重点讲解 Mac Chrome 路径坑)
5.滑块验证码放到下一篇,本篇只讲图片字符验证码!
⚠️ 重要合规提醒
✅ 本文代码仅用于自己账号自动化学习测试,请勿用于批量恶意爬虫、破解等违规场景,遵守网站 robots 协议与相关法律法规。
项目文件清单(本篇)
chaojiying.py:超级鹰核心打码客户端(导入使用)图片验证码免登录.py:本篇核心主程序,古诗文网自动登录
开始之前需先安装“DrissionPage”自动化库
pip install requests DrissionPage前置准备清单
1.注册超级鹰账号并充值题分(字符验证码识别消耗题分)
2.获取你的超级鹰账号、密码、softid
3.安装 DrissionPage(操控 Chromium 浏览器,定位网页元素、截图验证码)
4.题型编码牢记:1004普通字母数字字符验证码(本篇核心)
5.Mac 用户重点:指定 Chrome 浏览器路径!Windows 可简化初始化代码
6.项目结构your_project/├─ chaojiying.py └─ 图片验证码免登录.py# 本篇核心:古诗文网字符验证码自动识别登录
🔗 完整业务流程总览(本篇核心)
完整流程拆解
1.初始化 ChromiumOptions,Mac 用户配置 Chrome 浏览器路径,创建 ChromiumPage 对象
2.请求古诗文网登录页面,等待页面加载完成
3.实例化 Chaojiying_Client,传入你的超级鹰账号密码 softid
4.定位验证码图片元素#imgCode,对该元素截图保存为yzm.png
5.二进制读取截图文件,调用PostPic(),题型编码填1004
6.拿到返回结果res['pic_str'],就是识别出的验证码字符串
7.依次填充账号输入框、密码输入框、验证码输入框
8.点击登录提交按钮,完成自动化登录,实现免手动输入验证码
9.【拓展优化】增加异常捕获、重试逻辑,识别错误调用 ReportError 上报错题返还题分
二、chaojiying.py 源码解析(通用打码模块,导入使用)
文件:
chaojiying.py,主程序中from Chaojiying import Chaojiying_Client导入
#!/usr/bin/env python# coding:utf-8importrequestsfromhashlibimportmd5classChaojiying_Client(object):def__init__(self,username,password,soft_id):self.username=username password=password.encode('utf8')self.password=md5(password).hexdigest()self.soft_id=soft_id self.base_params={'user':self.username,'pass2':self.password,'softid':self.soft_id,}self.headers={'Connection':'Keep-Alive','User-Agent':'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',}defPostPic(self,im,codetype,str_debug=""):""" im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html """params={'codetype':codetype,'str_debug':str_debug}params.update(self.base_params)files={'userfile':('ccc.jpg',im)}r=requests.post('http://upload.chaojiying.net/Upload/Processing.php',data=params,files=files,headers=self.headers)returnr.json()defPostPic_base64(self,base64_str,codetype):""" im: 图片字节 codetype: 题目类型 参考 http://www.chaojiying.com/price.html """params={'codetype':codetype,'file_base64':base64_str}params.update(self.base_params)r=requests.post('http://upload.chaojiying.net/Upload/Processing.php',data=params,headers=self.headers)returnr.json()defReportError(self,im_id):""" im_id:报错题目的图片ID """params={'id':im_id,}params.update(self.base_params)r=requests.post('http://upload.chaojiying.net/Upload/ReportError.php',data=params,headers=self.headers)returnr.json()if__name__=='__main__':# 账号和密码替换成自己的!!!chaojiying=Chaojiying_Client('tiantian1000','htur6h31','96001')# 更改成要识别的验证码的图片im=open('../RandCode.png','rb').read()result=chaojiying.PostPic(im,1004)#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//print(result['pic_str'])#1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()#print chaojiying.PostPic(base64_str, 1902) #此处为传入 base64代码✨ 核心方法重点解读(本篇重点使用 PostPic)
__init__:初始化超级鹰账号密码,密码做 md5 加密,组装基础请求参数PostPic(im, codetype)【本篇核心】传入图片字节流 + 题型编码,上传图片给超级鹰识别,返回 json 结果 -1004:普通字符验证码(本篇古诗文网,识别字母数字)PostPic_base64:base64 图片上传识别备选方案,某些场景优化使用ReportError:识别错误上报错题,申请返还题分(拓展优化必加)
三、【图片验证码免登录.py】完整源码逐行深度解析
文件【图片验证码免登录.py】,Mac 环境重点适配版本,DrissionPage 操作 Chromium,元素截图识别字符验证码
fromChaojiyingimportChaojiying_ClientfromDrissionPageimportChromiumPage,ChromiumOptions#网页自动化爬取------自动化库importtime#Mac电脑必备----创建浏览器【安卓只需要page=ChromiumPage()即可】co=ChromiumOptions()co.set_browser_path("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome")co.auto_port(True)page=ChromiumPage(co)page.get('https://www.gushiwen.cn/user/login.aspx?tab=account&from=')#请求登录网址time.sleep(2)Chaojiying=Chaojiying_Client('超级鹰账号','超级鹰密码','96001')#登录超级鹰img=page.ele('#imgCode')img.get_screenshot('yzm.png')#把图截下来withopen('yzm.png','rb')asf:#二进制读取res=Chaojiying.PostPic(f.read(),1004)#应用超级鹰yzm=res['pic_str']print(yzm)time.sleep(1)zhanghao=page.ele('#email').input('你登录该网址的账号')mimao=page.ele('#pwd').input('你登录该网址的密码')yanzhengma=page.ele('#code').input(yzm)login=page.ele('#btnSubmit').click()🔥 逐段拆解源码(保姆级讲解)
1. 导入模块
fromChaojiyingimportChaojiying_ClientfromDrissionPageimportChromiumPage,ChromiumOptionsimporttimeChaojiying_Client:超级鹰打码核心类,调用打码平台识别验证码ChromiumPage,ChromiumOptions:DrissionPage 浏览器自动化核心,操控 Chrome,定位网页元素、截图time:等待页面加载,防止元素未加载完成报错(很多新手踩坑点)
2. Mac 专属浏览器初始化【重点!很多 Mac 用户直接报错就在这里】--Mac 系统:必须指定 Chrome 完整路径,否则找不到浏览器启动失败
co=ChromiumOptions()co.set_browser_path("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome")co.auto_port(True)page=ChromiumPage(co)Windows 系统简化写法(替换上面 4 行)
page=ChromiumPage()💡踩坑提示:Mac 不同版本 Chrome 安装位置有可能不一样,确认你的 Chrome 路径是否匹配
3. 访问目标登录页面并等待加载
page.get('https://www.gushiwen.cn/user/login.aspx?tab=account&from=')time.sleep(2)page.get():浏览器打开目标登录 urltime.sleep(2):强制等待 2 秒,等待页面 DOM、验证码图片渲染完成
💡 优化拓展:可以改用元素等待(显式等待)替代固定 sleep,稳定性更高,后面踩坑篇讲解
4. 实例化超级鹰客户端
Chaojiying=Chaojiying_Client('账号','密码','96001')⚠️ 重要提醒:替换成你自己的超级鹰账号、密码
5. 定位验证码元素,截图保存本地
img=page.ele('#imgCode')img.get_screenshot('yzm.png')page.ele('#imgCode'):根据 CSS 选择器定位验证码图片元素#imgCodeget_screenshot('yzm.png'):元素截图(重点!只截取验证码图片区域,不是整个页面截图)
💡 踩坑点:如果用整个页面截图,多余背景干扰识别,优先使用元素截图
6. 读取截图,调用超级鹰识别验证码(核心)
withopen('yzm.png','rb')asf:res=Chaojiying.PostPic(f.read(),1004)yzm=res['pic_str']print(yzm)rb:二进制读取图片文件(上传打码平台必须二进制字节流)PostPic(...,1004):题型编码 1004,普通字符验证码识别res['pic_str']:提取识别出来的验证码字符串,打印输出调试
7. 填充账号、密码、验证码,提交登录
zhanghao=page.ele('#email').input('账号')mimao=page.ele('#pwd').input('密码')yanzhengma=page.ele('#code').input(yzm)login=page.ele('#btnSubmit').click()- 依次定位输入框元素,填入账号、密码、识别出的验证码
click():点击登录提交按钮,完成登录自动化
四、调试优化 + 踩坑大全(CSDN 读者最喜欢的章节)
踩坑 1:Mac 启动 Chromium 报错,找不到浏览器
❌ 现象:初始化 ChromiumOptions 后启动失败
✅ 解决:核对 Chrome 完整路径,Mac 系统必须配置set_browser_path
踩坑 2:验证码还没加载完成就截图,识别失败
❌ 现象:截图空白,超级鹰返回识别错误
✅ 解决:增加等待时间,或者使用显式等待,等待 #imgCode 元素加载完成再截图
踩坑 3:识别结果错误,提交登录失败
❌ 现象:超级鹰识别出来的验证码不对,登录校验失败
✅ 解决:
- 检查截图是否完整,有没有裁剪缺失
- 调用
ReportError上报错题,申请返还题分- 增加重试逻辑,识别失败重新刷新验证码,重新截图识别
踩坑 4:元素选择器失效,找不到页面元素
❌ 现象:
page.ele()返回空,程序报错
✅ 解决:F12 重新核对 CSS 选择器,网页改版后选择器会变动,及时更新
踩坑 5:超级鹰题分不足,识别接口报错
❌ 现象:返回 err_no 报错,无法识别验证码
✅ 解决:登录超级鹰后台充值题分,查看账号剩余题分
踩坑 6:Windows 用户照搬 Mac 浏览器初始化代码
❌ 现象:Windows 写死 Chrome 路径,导致启动异常
✅ 解决:Windows 简化,直接page=ChromiumPage()
五、优化升级完整版代码(增加 try except 异常捕获,重试机制,保姆级增强版)
💡 给读者福利,在原版基础上加上 try except 异常捕获,重试逻辑,很多小白需要这个
fromChaojiyingimportChaojiying_ClientfromDrissionPageimportChromiumPage,ChromiumOptionsimporttimedefgushiwen_login(max_retry=3):co=ChromiumOptions()# Mac路径,Windows注释掉下面这两行co.set_browser_path("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome")co.auto_port(True)page=ChromiumPage(co)try:page.get('https://www.gushiwen.cn/user/login.aspx?tab=account&from=')time.sleep(2)chaojiying=Chaojiying_Client('你的账号','你的密码','96001')retry_cnt=0whileretry_cnt<max_retry:img=page.ele('#imgCode')img.get_screenshot('yzm.png')withopen('yzm.png','rb')asf:res=chaojiying.PostPic(f.read(),1004)ifres['err_no']!=0:print(f"识别失败,重试{retry_cnt+1}")retry_cnt+=1time.sleep(1)continueyzm=res['pic_str']print(f"识别验证码:{yzm}")page.ele('#email').input('你的账号')page.ele('#pwd').input('你的密码')page.ele('#code').input(yzm)page.ele('#btnSubmit').click()print("登录提交完成!")breakexceptExceptionase:print(f"程序异常:{e}")finally:# 可选:关闭浏览器# page.quit()passif__name__=="__main__":gushiwen_login()六、拓展思考
1.🤔 思考 1:如何实现自动刷新验证码,识别失败自动刷新重新截图,不用手动干预?
2.🤔 思考 2:如果验证码是干扰线很多的复杂字符,除了调整题型编码,还有哪些优化方案提升识别准确率?
3.🤔 思考 3:如何封装一个通用工具类,统一管理打码调用,方便后续拓展更多类型验证码?
4.🤔 思考 4:多账号批量登录场景,如何管理超级鹰题分消耗,做题分监控?
七、结尾
恭喜你,到这里你已经完整跑通了一套 “超级鹰识别验证码 → 自动登录 → Cookie 持久化 → 免登录” 的闭环。这套思路是通用框架,不只适用于某一类网站,学会了它,你能轻松应对各种需要验证码登录的自动化场景。
留两个思考题给你:
1.如果目标站的验证码是滑块类型,codetype 要换成多少?代码要改哪里?
2.如果 Cookie 被目标站加密存储(不是明文),你的持久化方案要怎么升级?
评论区聊起来,有更好的方案、踩过的坑,欢迎分享。觉得有用就点赞 + 收藏 + 关注,下一篇我会继续深挖
📢重磅下篇预告:滑块缺口验证码自动化实战
✨ 下一篇单独开一篇完整教程,专门讲解滑块验证码(9901 型),使用超级鹰识别缺口坐标,搭配 DrissionPage Actions 模拟鼠标拖动滑块完成验证,完整源码解析,敬请期待!欢迎关注,评论区交流踩坑经历!