[Python]-使用Requests模拟登录

在《使用Requests进行HTTP请求与文件上传下载》中介绍了requests库的常用方法,本章介绍如何使用request进行用户登录。

登录说明

一般页面登录都是使用Form实现的,以登录如下页面为例:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
           xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
   <head>
           <title>Spring Security Example </title>
       </head>
   <body>
       <div th:if="${param.error}">
               Invalid username and password.
           </div>
       <div th:if="${param.logout}">
               You have been logged out.
           </div>
       <form th:action="@{/login}" method="post">
               <div><label> User Name : <input type="text" name="username"/> </label></div>
               <div><label> Password: <input type="password" name="password"/> </label></div>
               <div><input type="submit" value="Sign In"/></div>
        </form>
   </body>
</html>

session操作

一般页面登录后,都需要返回session(保存在cookies中)用于后续的验证,可通过LWPCookieJar方便地进行cookies的保存与加载。为例方便cookies操作,使用requests.session(),代替requests进行请求操作。

默认情况下,LWPCookieJar保存与加载时,会忽略掉discard与expired的项,为能正常的保存与加载,需要使用参数ignore_discard=True, ignore_expires=True

data序列化

请求参数中data会根据类型不同进行不同方式的序列化,在models.py的prepare_body中有对data的详细实现。

对于字典格式的data,会序列化为k1=v1&k2=v2格式,并在未设定content_type情况下,设定为application/x-www-form-urlencoded

示例代码

登录流程

在登录成功后,保存session到文件中,以便后续使用:

import requests
import requests.utils
import http.cookiejar as cookiejar

session = requests.session()
session.cookies = cookiejar.LWPCookieJar(filename='./security.cookie')

BaseUrl = 'http://127.0.0.1:7087/study/'

header = {
    'Referer': BaseUrl + "login",
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Chrome/89.0.4389.82'
}


def login(user, psw):
    try:
        data = {
            'username': user,
            'password': psw,
        }

        resp = session.post(url=BaseUrl + 'login', headers=header, data=data)
        print(resp)
        if resp.status_code == requests.codes.ok:
            print('redirect url:', resp.url)
            cookie = requests.utils.dict_from_cookiejar(session.cookies)
            print(cookie)
            session.cookies.save(ignore_discard=True, ignore_expires=True)

            # if canRedirect(BaseUrl):
            #     print("Login success")

    except Exception as ex:
        print(ex)

验证

登录成功即使返回ok,也不一定是真的成果;最准确的方式是尝试登录一个需要验证的页面,若返回成功,则是真正的成功:

def canRedirect(url):
    try:
        # session.cookies.load(ignore_discard=True, ignore_expires=True)
        resp = session.get(url, headers=header)
        print(resp)
        return resp.status_code == requests.codes.ok
    except Exception as ex:
        print(ex)

    return False
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值