Scrapy学习-14-验证码识别

3种实现方案
 
1. 编码实现 tesseract-ocr
  谷歌开源的识别工具,自己实现代码编码,投入精力大,回馈低。且平台验证码更换周期短,编好的代码容易失效

2. 在线打码
  在线平台提供,识别率90%以上
  http://www.yunzhuan.com/

3. 人工打码
  效率低,准确率高
 
这里主要实现第二种,贴上代码
# 在与代码同一个目录下创建一个Images文件夹,放一些测试验证码图片,我们就可以测试了
import json
import requests


class YDMHttp(object):
    apiurl = 'http://api.yundama.com/api.php'
    username = ''
    password = ''
    appid = ''
    appkey = ''

    def __init__(self, username, password, appid, appkey):
        self.username = username
        self.password = password
        self.appid = str(appid)
        self.appkey = appkey

    def balance(self):
        data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey}
        response_data = requests.post(self.apiurl, data=data)
        ret_data = json.loads(response_data.text)
        if ret_data["ret"] == 0:
            print("获取剩余积分", ret_data["balance"])
            return ret_data["balance"]
        else:
            return None

    def login(self):
        data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey}
        response_data = requests.post(self.apiurl, data=data)
        ret_data = json.loads(response_data.text)
        if ret_data["ret"] == 0:
            print("登录成功", ret_data["uid"])
            return ret_data["uid"]
        else:
            return None

    def decode(self, filename, codetype, timeout):
        data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid, 'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)}
        files = {'file': open(filename, 'rb')}
        response_data = requests.post(self.apiurl, files=files, data=data)
        ret_data = json.loads(response_data.text)
        if ret_data["ret"] == 0:
            print("识别成功", ret_data["text"])
            return ret_data["text"]
        else:
            return None


def ydm(file_path):
    username = 'da_ge_da1'
    # 密码
    password = 'da_ge_da'
    # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
    appid = 3129
    # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
    appkey = '40d5ad41c047179fc797631e3b9c3025'
    # 图片文件
    filename = 'image/captcha.jpg'
    # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
    codetype = 5000
    # 超时时间,秒
    timeout = 60
    # 检查
    yundama = YDMHttp(username, password, appid, appkey)
    
    if username == 'username':
        print('请设置好相关参数再测试')
    else:
        # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
        return yundama.decode(file_path, codetype, timeout)


if __name__ == "__main__":
    # 用户名
    username = 'da_ge_da1'
    # 密码
    password = 'da_ge_da'
    # 软件ID,开发者分成必要参数。登录开发者后台【我的软件】获得!
    appid = 3129
    # 软件密钥,开发者分成必要参数。登录开发者后台【我的软件】获得!
    appkey = '40d5ad41c047179fc797631e3b9c3025'
    # 图片文件
    filename = 'image/captcha.jpg'
    # 验证码类型,# 例:1004表示4位字母数字,不同类型收费不同。请准确填写,否则影响识别率。在此查询所有类型 http://www.yundama.com/price.html
    codetype = 5000
    # 超时时间,秒
    timeout = 60
    # 检查
    if (username == 'username'):
        print ('请设置好相关参数再测试')
    else:
        # 初始化
        yundama = YDMHttp(username, password, appid, appkey)

        # 登陆云打码
        uid = yundama.login();
        print('uid: %s' % uid)

        # 登陆云打码
        uid = yundama.login();
        print ('uid: %s' % uid)

        # 查询余额
        balance = yundama.balance();
        print ('balance: %s' % balance)

        # 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果
        text = yundama.decode(filename, codetype, timeout);

 

posted @ 2018-05-22 16:38  前路~  阅读(1289)  评论(0编辑  收藏  举报