一 目标站点分析

#一:实验前准备:
    浏览器用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

相关文章:

  • 2021-09-22
  • 2021-10-24
  • 2021-07-30
  • 2021-11-21
  • 2021-04-20
  • 2022-12-23
  • 2022-01-18
  • 2021-11-20
猜你喜欢
  • 2021-10-29
  • 2022-12-23
  • 2021-05-24
  • 2021-10-22
  • 2022-12-23
  • 2021-08-27
  • 2021-10-10
相关资源
相似解决方案