python爬虫-破解验证码(封装超级鹰实现)

进入超级鹰首页,根据官方提示进行操作,下载python的文档后,把其封装进自己的第三方库中
python爬虫-破解验证码(封装超级鹰实现)_第1张图片
官方原文档:

#!/usr/bin/env python
# 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()


if __name__ == '__main__':
	chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
	im = open('a.jpg', 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
	print chaojiying.PostPic(im, 1902)												#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()


封装后文档(我是把他封装入我的第三方库yh)

#!/usr/bin/env python
# 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()


# 在这里调用的时候把相应的信息放进去(账号密码软件id,就不用重复的放了)
# 留两个参数使其调用更加灵活
# code_path是验证码的图片的路径
# code_type是验证码的类型
def get_code(code_path, code_type):
	chaojiying = Chaojiying_Client('超级鹰用户名', '超级鹰用户名的密码', '96001')	#用户中心>>软件ID 生成一个替换 96001
	im = open(code_path, 'rb').read()													#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
	return chaojiying.PostPic(im, code_type)												#1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加())


把这些代码放进自己的库中,或者直接把这个文件保存放在全局变量的路径下,我这里是直接放在python的自带模板库的根目录下,这样就可以实现调用

python爬虫-破解验证码(封装超级鹰实现)_第2张图片下面以破解超级鹰登录页面的验证码为例

import yh  # 引入个人的库
from lxml import etree  # 解析数据
import requests  # 发送请求

url = 'http://www.chaojiying.com/user/login/'  # 随便找一个有验证码的页面就行了,只是用于实验
headers = {
     
    'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0',
}  # UA伪装
page = requests.get(url=url, headers=headers).text  # 获取文本格式的响应
tree = etree.HTML(page)  # 解析数据
# 这里的xpath路径可以直接点开F12后,复制粘贴
code_img_src = 'http://www.chaojiying.com' + tree.xpath('/html/body/div[3]/div/div[3]/div[1]/form/div/img/@src')[
    0]  # 取到图片的链接
print(code_img_src)  # 打印图片链接
code_img_data = requests.get(url=code_img_src, headers=headers).content  # 下载图片,以二进制形式
with open('./code.jpg', 'wb') as fp:
    fp.write(code_img_data)  # 存图片
code = yh.get_code('./code.jpg', '1004')  # 调用第三方库里面的函数进行解析
print(code)  # 打印实验结果

实验结果
在这里插入图片描述

{‘err_no’: 0, ‘err_str’: ‘OK’, ‘pic_id’: ‘9134016265782900038’, ‘pic_str’: ‘MSDX’, ‘md5’: ‘fda3f65efc662d190921d8a87251b040’}

此文讲了如何破解验证码,后面会写一篇seleium运用破解的验证码实现无头浏览器自动化登录的博文。

你可能感兴趣的:(python,python,xpath)