要求
- 爬取超级鹰网站登录时的验证码图片,并保存在本地。
- 利用超级鹰提供的例程代码对验证码图片进行识别,并将识别结果打印出来。
分析
- 超级鹰是一个验证码识别平台,使用它首先需要注册一个账号,新用户首次注册可能需要充值(可以先充1元或者几毛)。
注册完成后,接着需要生成一个软件ID,ID会在代码中使用到。(用户中心—>软件ID—>生成一个软件ID)
最后在开发文档中找到对应的python文档,下载解压后,会有一个验证码识别的python代码,本文就是利用例程代码对保存的验证码图片进行识别。 - 准备工作做好后,就可以对验证码图片进行保存了。
首先对超级鹰首页的网页源码进行分析,找到验证码图片所在的标签。
然后利用get请求,获取超级鹰网站首页的页面数据,利用xpath解析出验证码图片对应的链接。(xpath路径可以通过下图方法找到)
最后对验证码图片对应的链接再次发出get请求,就可以将图片保存到本地。
- 图片保存成功后,利用刚刚下载好的例程代码对图片进行识别。
if __name__ == '__main__':
chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
im = open('a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print chaojiying.PostPic(im, 1004) #对识别结果进行打印
代码需要修改的地方主要有三行,第一行是自己注册的用户名和密码以及生成的ID;第二行是图片保存的名字;第三行是要进行识别的图片类型(可在超级鹰网站的价格体系中查看)。超级鹰网站登录时的验证码是四位纯英文,所以对应的代码是1004。
程序代码
# -*- coding = utf-8 -*-
# @Time : 2020/12/30 11:11
# @author: 农夫三犭
# @File : 超级鹰验证码识别.py
# @Software:PyCharm
# 将验证码图片下载到本地
import requests
from lxml import etree
from hashlib import md5
# if __name__ == '__main__':
headers = {
'user-agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 86.0.4240.198 Safari /537.36'
}
url = 'https://www.chaojiying.com/'
page_text = requests.get(url=url, headers=headers).text
# 解析验证码图片img中的src属性值
tree = etree.HTML(page_text)
code_img_src = 'https://www.chaojiying.com' + tree.xpath('//div[@role="tabpanel"]/section/form/div[3]/div/img/@src')[0]
img_data = requests.get(url=code_img_src, headers=headers).content
# 将验证码图片保存到本地
with open('./code.jpg', 'wb') as fp:
fp.write(img_data)
# 调用超级鹰示例代码进行验证码图片数据识别
class Chaojiying_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)',
'user-agent': 'Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 86.0.4240.198 Safari /537.36'
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
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)
return r.json()
def ReportError(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)
return r.json()
chaojiying = Chaojiying_Client('****', '*****', '123456') #用户中心>>软件ID 生成一个替换 96001
im = open('code.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 1004))
到此验证码识别完成。
程序中不足之处欢迎大家指出~