python爬虫-破解验证码(封装超级鹰实现)
进入超级鹰首页,根据官方提示进行操作,下载python的文档后,把其封装进自己的第三方库中
官方原文档:
#!/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的自带模板库的根目录下,这样就可以实现调用
下面以破解超级鹰登录页面的验证码为例
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运用破解的验证码实现无头浏览器自动化登录的博文。
还没有评论,来说两句吧...