Python / 19 第三方打码平台进行复杂验证码的识别

第三方打码平台进行复杂验证码的识别

上节课我们使用了 Pyesseract 进行了简单的验证码图片识别,但是通过上节课的效果来看 Pyesseract 的效果似乎并不是很好,如果碰到一些复杂的验证码估计就得歇菜了。但是我们在爬虫开发中会遇到的验证码可以说是形形色色,各种各样,几乎都快玩出花来了。

不妨设想一下,如果爬虫遇到了 Pyesseract 无法识别的验证码该怎么办呢?难道爬虫就不写了吗?我觉得老板可能不太愿意啊,所以这节课给你推荐另一种验证码识别方式,那就是 – 第三方打码平台。

俗话说三个臭皮匠还顶个诸葛亮呢,我们在实际开发中遇到解决不了的难题的时候一定不要在那里闷头坐着死扣,一定要善用搜索引擎。编程这个行业发展了这么多年,没准你碰到的问题早就被别人解决了还把解决问题的方法分享了出来呢

本节课学习目标

能够熟练的使用一种第三方打码平台识别验证码。

1. 常见的第三方打码平台

平时常用的打码平台有:超级鹰,云打码,打码兔,联众打码,超人打码,斐斐打码,91打码等。读者可以更加自己的需要自行选择。

2. 打码平台进行打码步骤

使用第三方平台进行打码,通常需要四个步骤。我们这里使用超级鹰打码平台进行示范。

  1. 首先选择一个打码平台进行注册

由于不同平台,注册的流程不一样,这里不再截图演示。注册完成后,如果没有提供免费适用的功能,我们需要充值才能正确的使用接口。每个平台,都会有自己的开发文档,我们按照开发文档的示列进行改写就可以直接使用了。

  1. 需要进行充值

如果只是简单的测试,可以充值较小的金额,由于是第三方平台,无法保证网站是持久可用的,充值须谨慎。

  1. 获取网站的程序ID

充值完成后,我们会获得一个程序ID,把这个ID放入到接口中,方便第三方平台进行校验。

  1. 上传验证码,返回调用结果

3. 打码平台对接例子

接下来我们用一个简单的例子来具体演示一下上面的步骤:

这里,我们随便选择了一个打码平台的接口例子来进行讲解。

关于如何在打码平台上进行注册和查找接口文档,由于打码平台的不稳定性,这里不做推荐,读者可以自行百度,选择适合自己的平台进行注册和使用。在确定打码平台的可靠性的前提下,再进行充值。谨防被骗!

我们接下来通过打码平台验证如下验证码,验证码图片如下:

图片描述

代码如下:


#!/usr/bin/env python
# coding:utf-8

import requests
from hashlib import md5

#客户端类
class My_Client(object):

    #初始化
    def __init__(self, username, password, soft_id):
        self.username = username
        self.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: 题目类型
        """
        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 = My_Client('XXX', 'XXX', 'XXX')	
	im = open('a.jpg', 'rb').read()
	print(chaojiying.PostPic(im, XXX))

上述代码,我们总共有三个方法,分别是初始化,上传图片和错误反馈。初始化主要是初始化一些基本的信息,这些可以在打码平台注册的地方获取。另外,打码平台还会提供一个打码平台提供的识别码SoftId。初始化成功后,我们上传验证码,最后打印出结果。可以看到结果为7261,跟验证码里面的文字一致。

运行结果如下

图片描述

4. 小结

由于打码平台良莠不齐,读者选择打码平台的时候,需要选一些知名的企业,另外,使用打码的平台的时候,需要按照不同平台的规定接口进行调用,不同打码平台的规范是不一样的。