Python3爬虫实战:5分钟搞定古诗文网验证码自动登录(超级鹰API详解)

验证码识别一直是爬虫开发者绕不开的难题。最近在帮朋友做一个古诗文自动采集工具时,发现古诗文网的登录验证码识别率一直上不去。经过多次尝试,最终用超级鹰的API实现了95%以上的识别准确率。本文将分享这个快速解决方案,从注册到实现自动登录的全过程,帮你避开我踩过的那些坑。

1. 准备工作:5分钟快速接入超级鹰

1.1 注册与基础配置

首先访问超级鹰官网完成注册,这个过程不到1分钟。注册后注意几个关键信息:

  • 软件ID:在用户中心→软件ID处生成
  • 账户余额:确保有足够的题分(新注册用户会赠送少量测试额度)
  • API文档:重点查看"开发文档"中的Python示例代码

这里有个小技巧:先在价格体系页面(http://www.chaojiying.com/price.html)确认验证码类型。古诗文网使用的是最常见的4位英文数字混合验证码,对应超级鹰的"1902"类型。

1.2 环境准备

确保你的Python环境已安装以下库:

pip install requests Pillow

如果是处理复杂验证码,可能还需要:

pip install opencv-python numpy

2. 核心代码:极简API封装

下面是我优化过的超级鹰客户端封装,比官方示例更简洁实用:

import requests
from hashlib import md5

class CJYClient:
    def __init__(self, username, password, soft_id):
        self.username = username
        self.password = md5(password.encode('utf-8')).hexdigest()
        self.soft_id = soft_id
        self.base_url = "http://upload.chaojiying.net/Upload/"

    def recognize(self, img_bytes, code_type=1902):
        params = {
            'user': self.username,
            'pass2': self.password,
            'softid': self.soft_id,
            'codetype': code_type
        }
        files = {'userfile': ('captcha.jpg', img_bytes)}
        resp = requests.post(self.base_url + 'Processing.php', 
                           data=params, files=files)
        return resp.json()

使用示例:

client = CJYClient('你的用户名', '你的密码', '你的软件ID')
with open('captcha.jpg', 'rb') as f:
    result = client.recognize(f.read())
print(result['pic_str'])  # 输出识别结果

3. 古诗文网登录全流程实现

3.1 获取验证码图片

古诗文网的验证码图片藏在登录页面的特定位置,需要用XPath提取:

import requests
from lxml import html

login_url = 'https://so.gushiwen.cn/user/login.aspx'
session = requests.Session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
}

# 获取登录页面
response = session.get(login_url, headers=headers)
tree = html.fromstring(response.text)

# 提取验证码URL
img_path = tree.xpath('//img[@id="imgCode"]/@src')[0]
img_url = f'https://so.gushiwen.cn{img_path}'

# 下载验证码
img_data = session.get(img_url, headers=headers).content

3.2 自动识别与登录

将验证码识别和登录流程整合:

# 识别验证码
captcha_text = client.recognize(img_data)['pic_str']

# 准备登录参数
login_data = {
    '__VIEWSTATE': tree.xpath('//input[@name="__VIEWSTATE"]/@value')[0],
    '__VIEWSTATEGENERATOR': tree.xpath('//input[@name="__VIEWSTATEGENERATOR"]/@value')[0],
    'email': '你的账号',
    'pwd': '你的密码',
    'code': captcha_text,
    'denglu': '登录'
}

# 提交登录
login_response = session.post(login_url, data=login_data, headers=headers)
if '退出登录' in login_response.text:
    print('登录成功!')
else:
    print('登录失败,验证码可能识别错误')

4. 避坑指南与性能优化

4.1 常见问题排查

问题现象 可能原因 解决方案
返回"无题分" 账户余额不足 充值或检查软件ID配置
识别率低 验证码类型选择错误 确认code_type参数
请求超时 网络问题 增加超时重试机制

4.2 性能优化技巧

  1. 会话保持:使用requests.Session()维持cookie
  2. 错误重试:对识别失败的验证码自动重试
  3. 本地缓存:对反复出现的验证码建立本地映射表

优化后的识别函数示例:

def recognize_with_retry(client, img_data, max_retry=3):
    for i in range(max_retry):
        try:
            result = client.recognize(img_data)
            if result['err_no'] == 0:
                return result['pic_str']
        except Exception as e:
            print(f'识别失败,重试 {i+1}/{max_retry}')
    return None

4.3 成本控制方案

对于大规模应用,可以考虑:

  • 混合识别:简单验证码用本地OCR,复杂验证码再用超级鹰
  • 结果缓存:相同验证码哈希值的结果缓存5分钟
  • 智能调度:根据识别成功率动态调整识别策略
from PIL import Image
import hashlib

def get_image_hash(img_data):
    img = Image.open(io.BytesIO(img_data))
    return hashlib.md5(img.tobytes()).hexdigest()

# 使用前先检查缓存
image_hash = get_image_hash(img_data)
if image_hash in cache:
    return cache[image_hash]

5. 扩展应用:自动化测试与监控

这套方案不仅适用于爬虫,还可用于:

  • 自动化测试:对需要验证码的页面进行自动化测试
  • 监控系统:定时检查网站可访问性
  • 数据采集:大规模数据采集时的自动登录

一个实用的监控示例:

import schedule
import time

def check_website():
    try:
        # 自动登录流程
        if login():
            print(f"{time.ctime()} 网站状态正常")
        else:
            send_alert("登录失败")
    except Exception as e:
        send_alert(f"监控异常: {str(e)}")

# 每30分钟运行一次
schedule.every(30).minutes.do(check_website)

while True:
    schedule.run_pending()
    time.sleep(1)
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐