手把手教你用Session破解验证码实现爬虫
首先你要能明白这样一个场景:
第一个请求利用post()方法登陆了某个页面,第二次想获取成功登陆后的页面信息,又用了一次get()方法去请求个人信息页面。这实际上打开了两个浏览器,就是相当于两个完全不同的会话,这当然不能获取个人信息。
那我们改怎么办呢?
Bingo!两个页面使用一样的Cookies就可以!
但不觉得手动配置Cookies很麻烦吗?
那我们就要使用Session对象用来维持同一个会话。
理解了以上的内容,我们就可以开始破解验证码了
原理很简单:
- 对验证码url地址发出请求并保存验证码图片
- 访问保存的验证码图片并手动输入验证码
- 配置表单,使用post()方法发出请求
但是这跟最开始讲述的有什么关系呢?
你可能会这样想的很简单:
get()方法对验证码url发出请求,然后下载保存。post()方法配置好data表单,对登陆url地址发出请求---->>>任务完成
但当你就这么实际操作的时候你会发现仍然请求响应失败!
这是为什么?
因为get()验证码的cookie和post()登陆请求的cookie不一样------>>>.什么意思?
简单的来说就是:你两个页面显示的验证码不是同一个
而session对象你就可以理解成会保存上一次的cookie值
代码简要步骤
#定义一个session对象
browser=requests.session()
#获取验证码图片并保存了cookie
web=browser.get("验证码图片的url地址")
"""
配置表单,设置headers
"""
#登陆页面的请求 为了和验证码cookie一样
down=browser.post("登陆界面的post()地址")
这次我以访问我们学校的教务网系统作为案例进行讲解使用session破解验证码
首先我们来看一下界面:
使用Fiddler抓包模拟登陆,分析一下整个过程响应过程。我们发现显示的教务url地址跟传递post()参数的url地址并不是一个,并且表单里一共有7个参数(具体字段通过它的名字很明显) 我们现在就开始写代码了。
import requests
import time
#首先我们要F12获取验证码图片的url地址
url='http://kdjw.hnust.cn//kdjw/verifycode.servlet'
url2 ='http://kdjw.hnust.cn/kdjw/Logon.do?method=logon'
#定义一个Session对象
browser =requests.session()#
#通过这个对象调用get请求,响应获取cooki并保存验证码图片
valcode=browser.get(url)
fp = open('验证码.jpg', "wb") #以字节流的形式写入并保存
fp.write(valcode.content)
fp.flush()
fp.close()
#等待3秒
time.sleep(3)
#定义的headers
headers={
'Accept': 'text/html, application/xhtml+xml, image/jxr, */*',
'Accept-Language': 'zh-CN',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Accept-Encoding': 'gzip, deflate',
'Connection': 'Keep-Alive',
}
#输入你的学号、密码、验证码
user=input("请输入学号")
password=input("请输入密码")
yanzhengma=input("请输入验证码")
data={'dlfl':'0',"USERNAME":user,"PASSWORD":password,'RANDOMCODE':yanzhengma,'useDogCode':'','x':'37','y':'13'}
#post()请求登陆账号,此时我们以及获取了你登陆账号的cookie
res=browser.post(url2,headers=headers,data=data)
#这是我们学校登陆后查看课表的url地址 拼接上自己的学号
ke='http://kdjw.hnust.cn/kdjw/tkglAction.do?method=goListKbByXs&istsxx=no&xnxqh=2018-2019-1&zc=&xs0101id='+user
#使用登陆的cookie进行访问查看课表信息
html =browser.get(ke)
print(html.content.decode())
欢迎交流学习!如有错误请大方指出,不要吝啬你的点赞喜欢!