一 目标站点分析
#一:实验前准备:
浏览器用Chrome
用Ctrl+Shift+Delete清除浏览器缓存的Cookie
打开network准备抓包,点击Preserve log保留所有日志
#二:拉勾网验证流程:
1、请求登录页面:
请求url为:https://passport.lagou.com/login/login.html
请求头并没有什么内容,带上简单的Host,User-Agent把自己伪装成浏览器即可
响应头里包含有效的cookie信息
Set-Cookie:JSESSIONID=ABAAABAAADGAACFC0077EDC55EEC248392A667B221CE7AB; Path=/; HttpOnly
Set-Cookie:user_trace_token=20171104165207-d69fee97-d5d1-4a06-a406-e41989257b25;
页面内容里包含有用的:
X-Anit-Forge-Code
X-Anit-Forge-Token
ps:可以从login.html的head标签里发现拉钩程序员的注释:为了防止重复提交请求与表单,正是这条注释为老娘提供了干它的灵感,可见有时候爱加注释并不是什么好事
2、提交用户名密码
请求url为:https://passport.lagou.com/login/login.json
请求头里需要携带:
JESSIONID
'X-Anit-Forge-Code': X_Anti_Forge_Code, #从login.html页面内容中找
'X-Anit-Forge-Token': X_Anti_Forge_Token, #从login.html页面内容中找
'X-Requested-With': 'XMLHttpRequest',
请求体内data:
用户名密码
ps:用户名为明文,密码为密文,可以输错用户名,输对密码,然后在form data内获取正确的密文密码
Cookies:
JSESSIONID
user_trace_token
3、请求授权(上一步登录成功后,并没有被授权),拿到重定向的url
请求url为:https://passport.lagou.com/grantServiceTicket/grant.html
请求头:
host
user-agent
注意:授权成功后会重定向,如果重定向成功就完成登录了
4、请求重定向的url,拿到最终的登录session
老娘实现了两个版本,第一个版本完全用requests模拟浏览器的行为,但一些请求头与cookie的处理太繁琐了
于是老娘采用了第二个版本,直接用requests.session()去做
二 分析验证策略完成登录
![]()
import requests,re
session = requests.Session()
#步骤一、首先登陆login.html,获取cookie
r1 = session.get('https://passport.lagou.com/login/login.html', headers={'Host': "passport.lagou.com",'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'})
X_Anti_Forge_Token = re.findall(r"window.X_Anti_Forge_Token = '(.*)';",r1.text)[0]
X_Anti_Forge_Code = re.findall(r"window.X_Anti_Forge_Code = '(.*)';",r1.text)[0]
#步骤二、用户登陆,携带上一次的cookie,后台对cookie中的 jsessionid 进行授权
r3 = session.post(
url='https://passport.lagou.com/login/login.json',
data={
'isValidate': True,
# 'username': '424662508@qq.com',
# 'password': '4c4c83b3adf174b9c22af4a179dddb63',
'username':'18611453110',
'password':'bff642652c0c9e766b40e1a6f3305274', #对应明文alex3714
'request_form_verifyCode': '',
'submit': '',
},
headers={
'X-Anit-Forge-Code': X_Anti_Forge_Code,
'X-Anit-Forge-Token': X_Anti_Forge_Token,
'X-Requested-With': 'XMLHttpRequest',
"Referer": "https://passport.lagou.com/login/login.html",
"Host": "passport.lagou.com",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
},
)
print(r3.text)
# print(r3.headers)
#步骤三:进行授权
r4 = session.get('https://passport.lagou.com/grantServiceTicket/grant.html',
allow_redirects=False,
headers={'Host': "passport.lagou.com",'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'})
# print(r4.headers)
location=r4.headers['Location']
# print(location)
#步骤四:请求重定向的地址,拿到最终的登录session
r5= session.get(location,
allow_redirects=True,
headers={
'Host': "www.lagou.com",
'Referer':'https://passport.lagou.com/login/login.html?',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36'})
# print(r5.headers)
#步骤五:验证登录
print('林海峰' in r5.text) #r5.text是重定向后的页面
r5=session.get('https://www.lagou.com') #基于已经拿到的session再登录就无需输入账号密码了
print('林海峰' in r5.text)
r5=session.get('https://www.lagou.com') #基于已经拿到的session再登录就无需输入账号密码了
print('林海峰' in r5.text)
View Code