如何使用python-anticaptcha库识别动态链接的图片验证码
验证码识别问题解决方案
核心原因
你当前遇到的问题本质是会话未共享:目标网站通过Cookie关联用户会话,你单独下载验证码图片的请求,和后续提交验证码的请求属于两个独立会话,所以网站会给每次新请求生成全新的验证码,你识别的旧验证码自然无法通过校验。
解决步骤
- 使用统一的会话实例处理所有和目标站点的交互,全程共享Cookie,保证获取验证码和提交验证码是同一个会话
- 不需要把验证码图片存储到本地再读取,直接将同一会话下载到的二进制图片内容转换成类文件对象传给识别服务,避免不必要的IO操作
- 识别得到验证码文本后,直接用同一个会话提交到目标站点的业务接口
可运行示例代码
import requests from io import BytesIO from python_anticaptcha import AnticaptchaClient, ImageToTextTask # 配置项 ANTICAPTCHA_API_KEY = '替换成你自己的API密钥' CAPTCHA_LINK = 'https://reg.nid-moi.gov.iq/captcha/default?5wyju6xn' # 替换为目标站点实际提交验证码的接口地址 BUSINESS_SUBMIT_URL = '目标站点提交验证码的接口' # 初始化全局会话,自动维护Cookie,所有请求都用这个session发起 req_session = requests.Session() # 可选配置:添加UA头伪装正常浏览器请求,降低被反爬拦截的概率 req_session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36" }) if __name__ == '__main__': # 同一会话下载验证码 captcha_response = req_session.get(CAPTCHA_LINK, timeout=15) captcha_response.raise_for_status() # 直接转换为类文件对象,不需要存本地 captcha_file_obj = BytesIO(captcha_response.content) # 调用验证码识别服务 anticaptcha_client = AnticaptchaClient(ANTICAPTCHA_API_KEY) task = ImageToTextTask(captcha_file_obj) job = anticaptcha_client.createTask(task) job.join() recognized_text = job.get_captcha_text() print(f"识别结果:{recognized_text}") # 同一会话提交验证码和业务参数 submit_payload = { # 补充其他需要提交的业务字段 "captcha": recognized_text } submit_response = req_session.post(BUSINESS_SUBMIT_URL, data=submit_payload, timeout=15) print(submit_response.text)
可选优化点
- 可以对下载的验证码图片做预处理,比如灰度化、去噪、二值化,进一步提高识别准确率
- 可以在创建ImageToTextTask时指定验证码的字符类型、长度等参数,减少识别错误
- 控制请求频率,避免触发站点的频率限制规则
内容的提问来源于stack exchange,提问作者sopovi loind
相关产品推荐
相关产品推荐

