识别图片验证码

关于识别图片验证码为了保证识别效率,所以选择第三方收费平台。毕竟现在的验证码千奇百怪,而现有开源第三方库的识别却又差强人意。

超级鹰

个人使用感觉良好,以下是识别类型及价格体系。值得一提的是关注该平台的微信公众号绑定注册账号会获得1000题分,用来学习应该是够了的。

关于超级鹰的使用可以查看开发者文档:

获取使用方式

具体使用方式:

设置用户名、密码以及识别类型(价格体系中查看)即可。使用的时候传入目标验证码图片即可返回验证码识别内容。

# coding:utf-8

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()


def main1(urlstr):
    chaojiying = Chaojiying_Client('carmack', '****', '96001')
    im = open(urlstr, 'rb').read()
    return chaojiying.PostPic(im, 1902)['pic_str']


if __name__ == '__main__':
    chaojiying = Chaojiying_Client('carmack', '****', '96001')
    im = open('untitled.png', 'rb').read()
    print(chaojiying.PostPic(im, 1902))

图片验证码的识别方式

安装Python处理图片的第三方库

pip install pillow

对整个网页截图

screen_shot = browser.get_screenshot_as_png()
screen_shot = Image.open(BytesIO(screen_shot))

获取验证码坐标(此处极易容易出错,貌似是因为显示器分辨率的不同引起的。经多次验证后,目前的情况是只有在同时设置无头浏览器和打开浏览器窗口大小的时候才能得到正确结果。原理什么的,我也是很迷,反正该方法是我一步一步试出来的(⊙o⊙)…)

根据验证码坐标截取验证码图片(crop方法,此时最好保存照片有助于程序的调试)

将得到的验证码图片作为参数传给超级鹰

成功识别验证码图片

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容