Python爬虫之验证码识别

要求

  1. 爬取超级鹰网站登录时的验证码图片,并保存在本地。
  2. 利用超级鹰提供的例程代码对验证码图片进行识别,并将识别结果打印出来。

分析

  1. 超级鹰是一个验证码识别平台,使用它首先需要注册一个账号,新用户首次注册可能需要充值(可以先充1元或者几毛)。
    注册完成后,接着需要生成一个软件ID,ID会在代码中使用到。(用户中心—>软件ID—>生成一个软件ID)
    最后在开发文档中找到对应的python文档,下载解压后,会有一个验证码识别的python代码,本文就是利用例程代码对保存的验证码图片进行识别。
  2. 准备工作做好后,就可以对验证码图片进行保存了。
    首先对超级鹰首页的网页源码进行分析,找到验证码图片所在的标签。
    在这里插入图片描述
    然后利用get请求,获取超级鹰网站首页的页面数据,利用xpath解析出验证码图片对应的链接。(xpath路径可以通过下图方法找到)
    在这里插入图片描述最后对验证码图片对应的链接再次发出get请求,就可以将图片保存到本地。
  3. 图片保存成功后,利用刚刚下载好的例程代码对图片进行识别。
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))

到此验证码识别完成。
程序中不足之处欢迎大家指出~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农夫三犭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值