1 万能验证码
2 屏蔽验证码
3 机器学习搞定验证码
4 利用市面上付费的接口提取
下面说说付费的使用_超级鹰,需要用到selenium 库webdriver;需要用到图片处理pillow中Image
验证码自动识别分5步
1 调用webdriver创建浏览器并打开登录页面
2 整体截取登录页面(内含验证码部分_因为验证码点击自动刷新故采用静态截图进行识别)
3 识别页面验证码元素所在的位置及尺寸
4 使用第三步的位置及Image方法在完整截图上面进行图片扣取
5 调用超级鹰的付费接口进行截图识别
直接上代码
from selenium import webdriver
from PIL import Image #图片处理库
from china_railway.captcha.chaojiying import Chaojiying_Client #导入接口模块名
import time
#创建谷歌浏览器
browser = webdriver.Chrome()
#访问指定的url
url = " http://www.chaojiying.com/user/login/"
browser.get(url)
#对验证码进行输入分三步
# 第一步 截整个登录页面操作
browser.save_screenshot("login.png")
# 第二步 确定这验证码的位置 (因为一点击就刷新,不能点开页面去取值)并抠图
cap = browser.find_element_by_xpath("/html/body/div[3]/div/div[3]/div[1]/form/div/img") #页面验证码元素
location = cap.location #确定验证码的位置
size = cap.size #确定验证码的尺寸
#四个点 左 上 右 下来确定(跟桌面显示比例相关,如果是125%,那么所有数据均放大1.25倍)
left = location["x"] #前端页面四个点来定位置,左上角为初始点
up = location["y"]
right = left + size['width']#初始左+元素宽度
down = up + size['height']#初始上+元素高度
var = (left,up,right,down)
# 第三步 在完整截图cap,根据定位来抠取验证码并调用接口进行验证码识别
login_cap = Image.open('login.png')
captcha = login_cap.crop(var)
captcha.save('captcha.png')
# 调用超级鹰的接口,提取出来数字并进行send_keys操作
chaojiying = Chaojiying_Client('账户', '密码', '899836') #用户中心>>软件ID 生成一个替换 96001
im = open('captcha.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
res = chaojiying.PostPic(im, 1902) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
browser.find_element_by_xpath("/html/body/div[3]/div/div[3]/div[1]/form/p[3]/input").send_keys(res['pic_str']) #输入接口读取的验证码
browser.find_element_by_xpath("/html/body/div[3]/div/div[3]/div[1]/form/p[4]/input").click() #点击登录按钮
# 跳转需要时间 肉眼瞅瞅没毛病,自动化做断言
time.sleep(5)
browser.close()
接口文档如下,账户需要自行官方申请充值后使用
import requests
from hashlib import md5
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)',
}
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()
if __name__ == '__main__':
chaojiying = Chaojiying_Client('用户名', '密码', '899836')#用户中心>>软件ID 生成一个替换 96001
im = open('yzm.png', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
res = chaojiying.PostPic(im, 1902) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
print(res['pic_str'])