上节博客(链接https://blog.csdn.net/MG1723054/article/details/81900983)谈到利用python实现登陆的三种方法,其中利用session登陆网站的方法具有比较不错的效果,不需要考虑cookie的时效性,但是有一个潜在的问题是有些文字验证码用一般的程序很难破解,主要是识别度不高,为了提高识别有多种方法,包含机器学习训练验证码,利用OpenCV中的点降噪或者线降噪,还有就是利用打码平台,将程序接到打码平台让别人解决验证码问题(相当于是一个黑盒,我们只需要传入验证码图片,然后输出验证码字符),网上的打码平台有很多,我选择的是超级鹰打码平台(http://www.chaojiying.com/),这个平台可以通过注册账号,关注微信号送1000题分,可以免费测试。超级鹰打码平台中有python怎么使用该平台的案例。下面是chaojiying.py文件,这个文件在主程序时候调用即可,现在版本chaojiying.py与之前的有些不同。
#!/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()
####chaojingyi.py文件,等下导入到别的程序中
介绍了这么多,下面我们进入正题。我们先点击进入豆瓣登陆首页,打开源代码找到验证码图片。如下图所示。
利用 正则表达式提取出链接地址,这样我们就得到了图片的链接,然后再将图片下载在指定的文件中。代码如下,该段代码相对比较简单
import requests,re
login_url='https://accounts.douban.com/login'
def get_imge_url():
rep=requests.get(login_url,headers={'User-Agent':'Mozilla/5.0'})
res=re.compile('<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>')
imge_url=re.findall(res,rep.text)
return imge_url[0]
def download_imge(url,filename):
byte=requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
with open (filename,'wb') as f:
f.write(byte.content)
再次我们怎么样将图片传入超级鹰平台,根据该网站提供的实例,我们只要这样即可:
chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '超级鹰ID')
im = open(filename, 'rb').read()
yanzhengma=chaojiying.PostPic(im, 1902)['pic_str']
最后,我们需要解决的是怎么样传送表单,于是我们打开开发者模式,勾选preserve log,然后再登陆页面的账号,密码,验证码随便输入字符(先不要输入正确的账号密码和验证码,便于后面的分析),点击登陆,我们在DOC选项中看到一个post请求,然后我们看下面的表单,果然是我们当时输入的账号,密码,和验证码,如下图所示。
前面我们已经解决了验证码问题,现在这表单里面还有一个需要构造的参数,也就是captcha_id,仔细观察该captcha_id键的值我们可以知道,这个就是在验证码图片链接https://www.douban.com/misc/captcha?id=GU3dsxGehVnCmQ5IaWIipDKo:en&size=s
中的数据,我们就利用正则表达式来构造它,这样所有的表单构造全部完成。这也是利用打码平台破解验证码,session登陆豆瓣的全部思路。
下面我们给出完整代码:
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 21 16:18:38 2018
@author: NJUer
"""
import requests,re
from chaojiying import Chaojiying_Client ###导入chaojiying模块中的Chaojiying_Client
login_url='https://accounts.douban.com/login'
def get_imge_url(): ###获取验证码链接
rep=requests.get(login_url,headers={'User-Agent':'Mozilla/5.0'})
res=re.compile('<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>')
imge_url=re.findall(res,rep.text)
return imge_url[0]
def download_imge(url,filename):
byte=requests.get(url,headers={'User-Agent':'Mozilla/5.0'})
with open (filename,'wb') as f:
f.write(byte.content)####下载验证码图片
def post_data(id_string,yanzhengma): ###提交表单
form_data={'source':'index_nav',
'redir:https':'//www.douban.com/',
'form_email':'m18851989116@163.com',
'form_password':'豆瓣账号',
'captcha-solution':'豆瓣密码',###自己注册豆瓣账号密码
'captcha-id':id_string,
'login':'登录',
}
session=requests.session()
session.post(login_url,data=form_data)
infor=session.get('https://www.douban.com/',headers={'User-Agent':'Mozilla/5.0'})
infor.encoding='utf-8'
if '方天画戟吕奉先的帐号'in infor.text : ###测试是否登陆成功,因为我的账号
###名称为‘方天画戟吕奉先’,所以登陆成功必然会有显示
print('登陆成功!')
else :
print('登陆失败!')
print(infor.text[0:10000])
if __name__ == '__main__':
chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '超级鹰ID')###自己注册
url= get_imge_url()
id_string=url.split('=')[1].split("&")[0] ###获取验证码的ID
filename='C:\\Users\\FangWei\\Desktop\\网络爬虫\\chaojiying_Python\\豆瓣.jpg'
download_imge(url,filename)
im = open(filename, 'rb').read()
yanzhengma=chaojiying.PostPic(im, 1902)['pic_str']
post_data(id_string,yanzhengma)
运行部分结果如下:
利用打码平台破解验证码相对于机器学习来说,学习时间短,不需要我们知道怎么去识别,机器学习学习周期长,不易理解,所以使用打码平台是一个不错的选择。
原创不易 如若转载 请注明作者和出处,谢谢!