基于requests模块实现Cookie模拟登录

前言

此篇文章中介绍基于 requests 模块实现 Cookie 模拟登录,并以模拟登录cocos中文社区(https://forum.cocos.org/)的个人登录页为例进行讲解。

正文

1、Cookie 和 Session

1.1、Cookie

Cookie :类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session 跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 ;Cookie 可以保持登录信息到用户下次与服务器的会话; 以键 / 值对形式存储。

1.2、Session

Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

1,3、Cookie 和 Session 的区别

  1. Cookie 存储在客户的浏览器上,Session 存储在服务器上。
  2. Cookie 是不安全的,且有失效时间。

2、模拟登录的三种方法

2.1、利用headers参数,将手动抓取的 Cookie 放到 headers 参数中

headers={
        "Cookie":"手动抓取的 Cookie ",
        "User-Agent":""  
   }
   html=request.get(url=url,headers=header).text

2.2、利用 get() 方法中的 cookies 参数

需要先将通过外部浏览器抓取的 cookies 参数 处理为字典

cookies = get_cookies() # get_cookies() :处理字符串形式的cookies为字典类型
html=requests.get(url=url,headers=headers,cookies=cookies)

2.3、利用 requests.session() 类实现模拟登录

我们知道 Cookie 是不安全的,且有失效时间,所以 requests 模块提供了 session 类,来实现客户端和服务端的会话保持。

  1. requests.session() 类实现模拟登录的原理:
  • 浏览器原理:访问需要登录的页面会带着之前登录过的 cookie;
  • 程序原理:同样带着之前登录的 cookie 去访问-由 session 对象完成;
  1. requests.session() 类实现模拟登录的具体步骤:
  • 登录页输入错误的密码抓包,抓到向服务器的哪个地址发送了哪些数据进行的验证;
  • 在网络数据包中找到具体的提交用户名和密码信息的地址,一般为 POST 请求;
  • 将正确的用户名和密码信息 POST 到网络数据包的 url 地址;
  • 模拟浏览器利用 session 对象发送请求先验证登录;
  • 一旦登录成功,可以抓取任何需要登录才能访问的页面。
  1. requests.session() 类实现模拟登录的使用方法:
  • 实例化 session 对象:s=requests.session()
  • 登录网站:由session对象发送get或者post请求,登录对应网站:
res=s.get(url=url,headers=headers)
res=s.post(url=url,headers=headers,data=data)
  • 访问页面:由session对象请求需要登录才能访问的页面
html = s.get(url=url, headers=headers).text

3、模拟登录示例

3.1、利用 headers 参数,将手动抓取的 Cookie 放到 headers 参数中

  1. 通过 F12 - 全部 - summary - 标头 - 常规 -请求网址,获取 url 地址
  2. 再获取 Cookie 参数,直接复制到代码段中
  3. 代码实现:
def login1():
    """
    function:  利用Cookie模拟登录Cocos中文社区:利用headers参数,将手动抓取的Cookie放到headers参数中
          in:  None
         out:  None
      return:  None
      others:  Login Simulation Cocos Chinese Comunity By Cookie
    """
    url = "https://forum.cocos.org/u/xxx/summary"  # 通过网络数据包获取的url地址
    headers = {
        'User-Agent': UserAgent().random,
        'Cookie': 'xxx'
    }  # 填充headers
    html = requests.get(url=url, headers=headers).text  # 通过requests.get() 方法获取响应内容
    print(html)  # 打印响应内容
  1. 程序运行效果如下:

3.2、利用 get() 方法中的 cookies 参数

获取 cookies 参数的方法 与 3.1 方法相同,区别是需要写一个 将字符串形式的 cookies 参数 转化为 字典类型 的函数。

def login2():
    """
    function:  利用Cookie模拟登录Cocos中文社区:get()方法中的cookies参数
          in:  None
         out:  None
      return:  None
      others:  Login Simulation Cocos Chinese Comunity By Cookie
    """
    url = "https://forum.cocos.org/u/xxx/summary"  # 通过网络数据包获取的url地址
    headers = {'User-Agent': UserAgent().random}  # 填充headers
    cookies = get_cookies() #处理字符串形式的cookies为字典类型
    html = requests.get(url=url, headers=headers, cookies=cookies).text  # 通过requests.get() 方法获取响应内容
    print(html)  # 打印响应内容


def get_cookies():
    """
    function:  功能:处理字符串形式的cookies为字典类型
          in:  None
         out:  None
      return:  字典类型的cookies
      others:  Convert String To Dic
    """
    cookies = {}
    cookies_string = 'xxx'
    for kv in cookies_string.split('; '):
        key = kv.split('=')[0]
        value = kv.split('=')[1]
        cookies[key] = value
    return cookies

3.3、利用 requests.session() 类实现模拟登录

  1. 步骤1:实例化session对象
s = requests.session()  # 实例化全局的session对象
  1. 步骤2:登录网站:由session对象发送get或者post请求,登录对应网站

    通过网络数据包获取的表单数据即使网页向服务器提交的用户名和密码
post_url = "https://auth.cocos.com/jsApi/doSignIn"  # 通过F12,网络数据包抓包抓到的验证登录的url地址
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/111.0"}  # 填充headers,有些网站第一次也需要带着cookie参数
    form_data = {
        "username": "xxx",
        "password": "xxx",
        "autoLogin": "true"
    }
    # 1、先登录
    s.post(url=post_url, headers=headers, data=form_data)  # 利用session对象登录,相当于登录成功

注意:在利用 session 对象登录时,url 地址 是验证登录页面的 url 地址!

  1. 步骤3:访问页面:由session对象请求需要登录才能访问的页面
url = "https://forum.cocos.org/u/xxx/summary"  # 通过网络数据包获取的带有个人信息登录的url地址
html = s.get(url=url, headers=headers).text  # 通过requests.get() 方法获取响应内容

注意:在获取对应页面的响应内容时,url 地址 是通过网络数据包获取的带有个人信息登录的 url 地址!