基于Session和Cookie的模拟登录实战

news2024/9/21 12:29:04

准备工作

安装好 requests 库, 并掌握基本用法

安装 Selenium 库, 并掌握基本用法

案例介绍

用到的网站: https://login2.scrape.center/

用户名和密码: admin 点击登录

这个网站是基于传统的 MVC 模式开发的,比较适合基于 Session 加 Cookie 的模拟登录

模拟登录

回到登录界面,打开开发者模式(F12), 勾选日志,进入到Network 然后在登录框输入账号密码点击登录

在登录的瞬间,浏览器发起了一个 POST 请求, 目标 URL 是 

https://login2.scrape.center/login

并通过表单提交的方式提交了登录信息,其中包括 username 和 password 两个字段,返回的状态码是 302 , Response 的 location 字段为根页面, 同时 Response Headers 还包含了 set-Cookie 字段,其中设置了 sessionID

由此我们可以想到,要实现模拟登录, 只需要模拟这个 POST 请求就好了

每次发出的请求都是独立互不干扰的, 例如第一次调用 POST 方法模拟登录网站,紧接着调用 get 方法请求主页面,这两个请求是完全独立的, 第一次请求到的 Cookie 不能传递给第二次请求因此常规的顺序调用无法达到模拟登录的效果

import requests
from urllib.parse import urljoin

BASE_URL = 'https://login2.scrape.center/'
LOGIN_URL = urljoin(BASE_URL, '/login')
INDEX_URL = urljoin(BASE_URL, '/page/1')
USERNAME = 'admin'
PASSWORD = 'admin'

response_login = requests.post(LOGIN_URL, data={
    'username': USERNAME,
    'password': PASSWORD
})

response_index = requests.get(INDEX_URL)
print('Response Status', response_index.status_code)
print('Response URL', response_index.url)

Response Status 200
Response URL https://login2.scrape.center/login?next=/page/1

这里我们先定义了 3 个URL ,用户名和密码, 然后调用 requests 库的 post 方法请求了登录页面进行模拟登录, 紧接着调用 get 方法请求网站首页来获取网站内容, 然后把响应内容中的 URL 打印出来。 如果模拟登录成功,那么打印出来的 URL 则是登录后页面的 URL ,如果不成功则是 登录界面的 URL , 这里可以看到是 登录界面的URL,表示模拟登录失败

模拟登录的关键在于两次发送的 Cookie 相同, 我们可以把第一次登录后的 Cookie 保存下来,在第二次请求的时候加上,就可以了

import requests
from urllib.parse import urljoin

BASE_URL = 'https://login2.scrape.center/'
LOGIN_URL = urljoin(BASE_URL, '/login')
INDEX_URL = urljoin(BASE_URL, '/page/1')
USERNAME = 'admin'
PASSWORD = 'admin'

response_login = requests.post(LOGIN_URL, data={
    'username': USERNAME,
    'password': PASSWORD
}, allow_redirects=False)

cookies = response_login.cookies
print('cookies', cookies)

response_index = requests.get(INDEX_URL, cookies=cookies)
print('Response Status', response_index.status_code)
print('Response URL', response_index.url)

Response Status 200
Response URL https://login2.scrape.center/page/1

由于 requests 具有自动处理重定向的能力,所以在模拟登录的过程要加上 allow_redirects 参数并设置为 False , 使 requests 不自动处理重定向。 这里将登录之后服务器返回的响应内容赋值为 reponse_login 变量, 然后调用 response_login 的 cookies 属性就可以获取网站的 Cookie 信息,由于 requests 自动不帮我们解析了响应头中的 Set-Cookie 字段并设置了 Cookie , 因此不需要我们手动再去解析

接着调用, requests 的 get 方法请求网站,与之前不同的是,这里 get 方法增加了一个参数 cookies , 传入的值是第一次模拟登录后获取的 Coolie , 这样第二次登录就携带了第一次模拟登录获取的 Cookie 信息, 之后网站会根据里面的 SessionID 信息找到同一个 Session , 并校验出当前发出请求的用户已处于登录状态, 然后返回正确结果

不过可以看出这种方式相对繁琐,每次都要传递 Cookie ,我们也可以借助 requests 内置的 Session  对象帮我们自动处理 Cookie , 使用 Session 对象之后, requests 会自动保存每次请求后设置的 Cookie , 并在下次请求时带上它

import requests
import time
from urllib.parse import urljoin
from selenium import webdriver
from selenium.webdriver.common.by import By


BASE_URL = 'https://login2.scrape.center/'
LOGIN_URL = urljoin(BASE_URL, '/login')
INDEX_URL = urljoin(BASE_URL, '/page/1')
USERNAME = 'admin'
PASSWORD = 'admin'

browser = webdriver.Chrome()
browser.get(BASE_URL)
browser.find_element(by=By.CSS_SELECTOR, value='input[name="username"]').send_keys(USERNAME)
browser.find_element(by=By.CSS_SELECTOR, value='input[name="password"]').send_keys(PASSWORD)
browser.find_element(by=By.CSS_SELECTOR, value='input[type="submit"]').click()
time.sleep(5)
# 从浏览器中获取 Cookie 信息
cookies = browser.get_cookies()
print('cookies:', cookies)
browser.close()

session = requests.Session()
for cookie in cookies:
    session.cookies.set(cookie['name'], cookie['value'])

response_index = session.get(INDEX_URL)
print('Response Status', response_index.status_code)
print('Response URL', response_index.url)

cookies: [{'domain': 'login2.scrape.center', 'expiry': 1724126750, 'httpOnly': True, 'name': 'sessionid', 'path': '/', 'sameSite': 'Lax', 'secure': False, 'value': 'jltw05oimowc740toy45e2qzpimgy8rt'}]
Response Status 200
Response URL https://login2.scrape.center/page/1

可以看到这里声明了一个 Session 对象,然后每次发出请求的时候直接调用 Session 对象的post 或 get 方法就好了, 使我们无需在关心 Cookie 的处理和传递问题

这种是比较简单的网站,如果遇到登录比较麻烦的网站。例如 带有验证码, 加密参数的网站,直接使用 requests 并不能很好的处理模拟登录,这时我们可以利用 类似 Selenium 模拟浏览器操作, 进而实现模拟登录,然后获取登录后成功后的 Cookie , 在把获取的 Cookie 交由 requests 等爬取

这里我们先使用 Selenium 打开浏览器, 然后访问登录页面, 模拟输入用户信息,并点击登录按钮。 浏览器会提示登录成功,并跳转到主页面

这时,调用 get_cookies 方法便能获取当前浏览器所有 Cookie 信息,这就是模拟登录之后的信息,用它就能访问其他信息了

之后,我们声明了一个 Session 对象,赋值给 session 变量, 然后遍历刚才获取的所有cookie 信息,将每个 Cookie 信息依次设置到 session 的 cookies 属性上, 随后拿这个 session 请求网站首页,就能够获取想要的信息了,而不会跳转到登录页面了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1984698.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DM 数据迁移工具

1.1.概述 DM 数据迁移工具 DM DTS 提供了主流大型数据库迁移到 DM、DM 到 DM、文件迁移到 DM 以及 DM 迁移到文件等功能。 得益于 DM 数据库对目前主流大型关系型数据库系统有着业界领先的兼容性,在存储层面、语法层面、接口层面和它们保持高度兼容,借…

为什么企业需要进行能源体系认证?

通过能源体系认证,企业可以向公众和利益相关方展示其在节能减排方面的承诺和成就。这不仅提升了企业的社会责任形象,还增强了品牌的信誉度。在当今消费者更加关注环境问题的背景下,绿色企业形象有助于赢得市场和客户的认可与信任。 能源体系认…

江协科技51单片机学习- p33 PWM呼吸灯和直流驱动电机调速

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

《python语言程序设计》2018版第6章第34题正多边形的面积 重写3.5题返回正多边形的面积

def area(n, side):n eval(input("Enter the number of sides: ")) # 多边形的边数side eval(input("Enter the side: ")) # 多边形的长度area_num (n * pow(side, 2)) / (4 * math.tan(math.pi / n))print("The area of the pentagon is {:>…

t-分布随机邻域嵌入和多维尺度分析

t-分布随机邻域嵌入 (t-Distributed Stochastic Neighbor Embedding, t-SNE) t-SNE 是一种非线性降维方法,主要用于高维数据的可视化。它能够将高维数据映射到低维空间,同时保留数据的局部结构。 原理 t-SNE 通过将高维空间中的相似度分布与低维空间中…

KVM——安装桌面版本Rocky_linux9.4

安装桌面版本Rocky_linux9.4 一些配置见图

超级会员卡积分商城小程序多功能源码系统 带完整的安装代码包以及部署教程

源码系统概述 超级会员卡积分商城小程序多功能源码系统是一款集合了多种功能于一体的会员积分商城小程序源码系统。该系统采用先进的技术架构,支持多门店统一管理,提供丰富的会员信息和商品管理服务,支持多种支付方式和营销活动,同…

【css】3d柱状图-vue组件版

创建一个响应式圆柱形进度条组件 在现代网页设计中,圆柱形进度条是一种非常流行的视觉元素,用于展示数据的进度或状态。本文将介绍如何使用Vue.js和LESS创建一个响应式的圆柱形进度条组件。 组件结构 我们的组件由两部分组成:一个圆柱形的…

【密码学】聚合签名

聚合签名是一种高级的数字签名技术,这种技术在多种场景下都非常有用,特别是在区块链、多方计算、分布式系统等领域中。下面让我来对它的基本概念、主要类型、实现步骤等来进行介绍。 一、聚合签名的基本概念 聚合签名到底是什么?有那么多数字…

四个开源的模拟人类记忆开源库

✨ 1: Memary Memary 是一个模拟人类记忆、增强AI代理的开源Python库。 Memary 是一个模拟人类记忆来提升人工智能代理性能的工具。其核心是通过集成多个模型(如本地运行的 Llama 和 GPT 模型)以及使用知识图谱、记忆流和实体知识存储来推进 AI 代理的…

前端(HTML + CSS)学成在线项目(仿)

头部区域 banner区域 精品推荐区域,这三个区域都是版心居中 头部区域分为:logo 导航 搜索 用户四个小块 鼠标悬停 :hover效果 banner区域分为:左侧导航 背景图 右侧课程表 鼠标悬停 :hover效果 精品推荐区域 鼠标悬停 :hover效果 精…

基于MATLAB车牌图像识别的设计与实现

摘 要 车牌图像识别系统是现代智能交通管理的重要组成部分之一。车牌识别系统使车辆管理更智能化,数字化,有效提升了交通管理的方便性和有效性。 车牌识别系统主要包括了图像采集、图像预处理、车牌定位、字符分割、字符识别等五大核心部分。本文主要介绍…

顺序表-数据结构

一、结构定义 顺序表是通常是数组&#xff0c;要求数据连续存储。顺序表又分为定长顺序表和变长顺序表&#xff0c;本文实现后者。 1、头文件 #include <stdio.h> #include <stdlib.h> 2、定长顺序表 #define MAX 100 定长顺序表结构 typedef struct SqList {…

五种创建springBoot项目的方法(本质上是三种)

文章目录 1. 使用https://start.aliyun.com/的服务器URL2. 使用https://start.spring.io/3. https://start.spring.io/使用官网4. 使用https://start.aliyun.com/5. 使用maven构建springboot项目5.1 点击maven&#xff0c;什么也不选&#xff0c;点击下一步5.2 修改名称和组ID&…

c语言第十天笔记

函数的概述 函数&#xff1a; 实现一定功能的&#xff0c;独立的代码模块。我们的函数一定是先定义&#xff0c;后使用。 使用函数的优势&#xff1a; 1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数&#xff0c;减少代码量。 2. 借助函数可以…

《学会 SpringMVC 系列 · 参数解析器 ArgumentResolvers》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

HQChart实战教程76-自定义Y轴刻度线

HQChart实战教程76-自定义Y轴刻度线 Y轴刻度线效果图HQChart插件源码地址步骤1. 注册事件2.回调事件eventdataobj数据说明完整实例源码Y轴刻度线 在K线图上,通过绘制一些特殊的刻度线来标识状态。我们可以通过SetOption里面设置,也可以通过回调函数动态设置。本教程是使用回…

微服务之SpringAMQP详解

目录 前言 1. 概述 2. Basic Queue简单队列模型 2.1 消息发送 2.2 消息接收 2.3 总结 3. WorkQueue模型 3.1 消息发送 3.2 消息接收 3.3 测试 3.4 消费预取限制 3.5 总结 4. 发布、订阅 5. Fanout 5.1 声明队列和交换机 5.2 消息发送 5.3 消息接收 5.4 测试 5…

SpringBoot集成阿里百炼大模型(初始demo) 原子的学习日记Day01

文章目录 概要下一章SpringBoot集成阿里百炼大模型&#xff08;多轮对话&#xff09; 原子的学习日记Day02 整体架构流程技术名词解释集成步骤1&#xff0c;选择大模型以及获取自己的api-key&#xff08;前面还有一步开通服务就没有展示啦&#xff01;&#xff09;2&#xff0c…

遗传算法与深度学习实战——生命模拟与进化论

遗传算法与深度学习实战——生命模拟与进化论 0. 前言1. 模拟进化1.1 代码实现1.2 代码改进 2. 达尔文进化论3. 自然选择和适者生存3.1 适者生存3.2 进化计算中的生物学 小结系列链接 0. 前言 生命模拟通过计算机模拟生物体的基本特征、遗传机制、环境互动等&#xff0c;试图模…