【Python_requests学习笔记(十)】基于requests模块实现Cookie模拟登录

news/2024/7/19 9:50:44 标签: python, cookies, session, requests, 爬虫

requestsCookie_0">基于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 参数中

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

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

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

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

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

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

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

    • 登录网站:由session对象发送get或者post请求,登录对应网站:

      python">res=s.get(url=url,headers=headers)
      
      python">res=s.post(url=url,headers=headers,data=data)
      
    • 访问页面:由session对象请求需要登录才能访问的页面

      python">html = s.get(url=url, headers=headers).text
      

3、模拟登录示例

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

  1. 通过 F12 - 全部 - summary - 标头 - 常规 -请求网址,获取 url 地址
    在这里插入图片描述

  2. 再获取 Cookie 参数,直接复制到代码段中
    在这里插入图片描述

  3. 代码实现:

    python">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)  # 打印响应内容
    
  4. 程序运行效果如下:
    在这里插入图片描述

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

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

python">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

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

  1. 步骤1:实例化session对象

    python">s = requests.session()  # 实例化全局的session对象
    
  2. 步骤2:登录网站:由session对象发送get或者post请求,登录对应网站
    在这里插入图片描述
    通过网络数据包获取的表单数据即使网页向服务器提交的用户名和密码

    python">    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 地址!

  3. 步骤3:访问页面:由session对象请求需要登录才能访问的页面

    python">url = "https://forum.cocos.org/u/xxx/summary"  # 通过网络数据包获取的带有个人信息登录的url地址
    html = s.get(url=url, headers=headers).text  # 通过requests.get() 方法获取响应内容
    

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


http://www.niftyadmin.cn/n/180436.html

相关文章

关于 Ansible 中的一些奇技淫巧整理

写在前面 分享一些 Ansible 中日常剧本中不常用但是需要知道的一些知识点博文适合了解 Ansible 的小伙伴,可以用作温习理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意&#xf…

AutoML-H2O

一、 环境依赖 1.安装java环境 mac : brew install java sudo ln -sfn /opt/homebrew/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdkecho export PATH"/opt/homebrew/opt/openjdk/bin:$PATH" >> ~/.zshrcjava 8,11 比较稳…

【Linux】[万字] Linux下的文件操作 及 Linux文件描述符fd 详解

在Linux操作系统中, 文件描述符是一个至关重要的概念. 理解了文件描述符, 其实就可以相当于理解了Linux系统的关于内存文件系统的整个大致框架和逻辑 但是在介绍文件描述符之前, Linux关于文件还存在许多 概念和文件操作 的知识需要介绍一下, 就当作是为解释文件描述符所做的…

centos7安装arm-none-eabi-gcc

centos7安装arm-none-eabi-gcc1 下载arm-none-eabi-gcc软件包1.1 arm-none-eabi-gcc下载链接1.1.1 最新软件下载链接1.1.2 老版本的下载链接2 安装软件包2.1 解压软件包2.2 修改软件包的名称2.3 将arm-none-eabi拷贝到/usr/local目录2.4 打开/etc/profile配置环境变量2.5 sourc…

UniApp + SpringBoot 实现接入支付宝支付功能和退款功能

一、支付宝开放平台设置 注册支付宝支付功能需要个体工商户或企业才可以!需要有营业执照才能去申请哦! 1、登录到控制台 进入支付宝开放平台 控制台 2、开发设置 3、产品绑定APP支付 如果没有绑定APP支付就会报商家订单参数异常,请重新发起…

2023-3-30刷题情况

统计字典序元音字符串的数目 思路 可以缩短问题的规模,将其转换为相同类型的子问题。可以使用动态规划。 状态表示: dp[i][k] 为第 i 个数以第k个字母的字符结尾的元音字符串的数目。状态转移方程: dp[i][k] max⁡j∈[0,k](dp[i−1][j])1\max_{j \in [0,k] }(dp…

MFC timeSetEvent() 定时器的简单使用*

实验的效果 按下定时器开始显示累加数字,再按下暂停,再按下继续.就这么一个简单的功能. 需要一个button和一个静态框,这里就不赘述了.button下的代码: void CtimerDlg::OnBnClickedTimer() {// TODO: Add your control notification handler code hereCtimerApp* app static…

20230322学习笔记

目录 一、并发、并行、串行的区别 二、并发的三个特性 三、并发编程三要素 四、死锁如何避免 五、volatile关键字是如何保证可见性、有序性 六、线程池的底层工作原理 七、java类加载 八、java类加载器有哪些 九、JVM内存模型 十、JVM有哪些垃圾回收算法 总结 一、并发…