Python豆瓣网模拟登陆
1.功能
豆瓣网的模拟登陆(有验证码的情况)
2.工具
Fiddler抓包工具+Google Chrome开发工具(F12)+Sublime Text
3.跳转分析
a)访问豆瓣网https://www.douban.com/,获取cookies
b)通过持久化cookies获取图片验证码token,通过RequestsCookieJar记录cookies,没有使用requests.Session(掌握cookies的实现机制)
c)通过token,去换取验证码图片,保存到本地
d)根据拿到的token(也是captcha-id)和输入的验证码和账户,密码取调用登陆接口
e)通过调用账户信息接口验证,是否登陆成功
4.代码
a)定义cookie对象,为了通过后续的接口验证,因为Http请求是无状态的,上一个请求和下一个请求是独立的,后一个请求要处理前面的数据,则必须重传,这样会导致每次连接的传送数据量大,影响效率,因此,通过写入cookie写入到客户端本地,下一次请求才能知道拿到上一次写入到本地的cookie信息,很多的网站验证都是通过cookie进行前后接口验证,还有很多电子商务网站也是通过cookie进行分析用户的访问的商品,进行商品推荐
import requests
#定义cookie对象
cookiejar = requests.cookies.RequestsCookieJar()
b)
访问豆瓣主页,记录cookie信息
print('******************访问豆瓣主页 start*****************')
print('')
res = requests.get('https://www.douban.com/',verify =False,allow_redirects =False)
print(res.status_code)
print(res.headers)
print(res.cookies)
for key in dict(res.cookies):
cookiejar.set(key,res.cookies[key])
print('')
print('******************访问豆瓣主页 end*****************')
这里可以看到返回的下面控制台输出的结果,响应headers里面有一个Set-Cookie键,可以看到服务端想要写入到本地的cookie信息是bid=lj-klfd-skl1 ,ll=136988这两个值,我们把这两个值记录到cookiejar 对象中,当然,requests.Session的原理也就是把上一次服务端写入的cookie保存起来,以供后续来使用,这里是通过手动记录
c)
通过cookiejar ,取换取图片验证码token和验证码的url地址
#获取图片验证码token
print('******************获取图片验证码token start*****************')
print('')
data = {
}
res = requests.get('https://www.douban.com/j/misc/captcha',data= data,cookies =cookiejar,verify =False,allow_redirects =False)
print(res.text)
print(res.status_code)
print(res.headers)
print(res.cookies)
for key in dict(res.cookies):
cookiejar.set(key,res.cookies[key])
token = res.json()['token']
imgurl = 'https:' + res.json()['url']
print('token:{},url:{}'.format(token,imgurl))
print('')
print('******************获取图片验证码token end*****************')
d)
把图片验证码保存到本地
#根据token获取验证码图片,保存到本地
print('******************根据token获取验证码图片,保存到本地 start*****************')
print('')
res = requests.get(imgurl,cookies = cookiejar,verify =False,allow_redirects =False)
print(res.status_code)
print(res.cookies)
with open('dbimage.jpg','wb') as f:
f.write(res.content)
print('')
print('******************根据token获取验证码图片,保存到本地 end*****************')
e)输入信息,调用登陆接口
#验证用户账户名密码
print('******************验证用户账户名密码 start*****************')
print('')
data = {
'captcha-id':token,
'captcha-solution':input('请输入验证码:'),
'form_email':'form_email',
'form_password':'form_password',
'source':'index_nav',
}
print(data)
res = requests.post('https://www.douban.com/accounts/login',data =data,cookies =cookiejar,verify =False,allow_redirects =False)
print(res.status_code)
print(res.text)
print(res.cookies)
for key in dict(res.cookies):
cookiejar.set(key,res.cookies[key])
print('')
print('******************验证用户账户名密码 end*****************')
f)调用账户信息接口,验证登陆状态是否已登录
#验证登陆账号信息
print('******************验证登陆账号信息 start*****************')
print('')
res = requests.get('https://www.douban.com/accounts/',cookies = cookiejar,verify =False,allow_redirects =False)
print(res.status_code)
print(res.cookies)
print('******************验证登陆账号信息 end*****************')
上一篇: Apache与Nginx优缺点比较