当前位置: 首页 > article >正文

一文5分钟掌握基于JWT的模拟登录爬取实战

文章目录

    • 一、JWT简介
      • 1.1 什么是JWT?
      • 1.2 JWT的结构
      • 1.3 模拟登录流程
      • 1.4 爬取数据
      • 1.5 实战步骤
    • 二、实战示例:基于JWT的模拟登录爬取
      • 2.1 环境准备
      • 2.2 分析登录流程
      • 2.3 编写模拟登录代码
      • 2.4 代码说明
    • 三、处理复杂情况
      • 3.1 动态参数
      • 3.2 多因素认证
      • 3.3 刷新Token
      • 3.4 HTTPS和证书验证
    • 四、注意事项
    • 五、总结

基于JSON Web Token(JWT)的模拟登录爬取在现代Web应用中越来越常见,因为许多网站和应用采用JWT来管理用户认证和会话。本文将介绍JWT的基本原理,并通过一个实战示例展示如何使用Python进行基于JWT的模拟登录爬取。

一、JWT简介

1.1 什么是JWT?

JSON Web Token(JWT)是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT通常用于身份验证和信息交换,具有以下特点:

  • 自包含:JWT包含了所有必要的信息,服务器无需查询数据库即可验证用户。
  • 紧凑:JWT使用Base64编码,体积小,适合在URL或HTTP头部传输。
  • ​防篡改:JWT使用签名机制,确保信息在传输过程中未被篡改。

1.2 JWT的结构

一个JWT通常由三部分组成,每部分之间用点(.)分隔:

header.payload.signature

Header(头部):描述JWT的类型和所使用的签名算法,通常为{“alg”: “HS256”, “typ”: “JWT”}。
Payload(载荷)​ :包含声明(Claims),如用户ID、角色、过期时间等。
Signature(签名)​ :用于验证JWT的完整性和真实性,通常由Header、Payload和一个密钥生成。

1.3 模拟登录流程

首先,你需要通过登录接口获取JWT。
登录接口通常需要用户名和密码,成功登录后会返回一个JWT。
你需要保存这个JWT,并在后续的请求中使用它来进行身份验证。

1.4 爬取数据

使用获取到的JWT,你可以模拟登录状态,访问需要身份验证的页面或接口。
在请求头中添加Authorization: Bearer ,服务器会验证JWT并返回相应的数据。

1.5 实战步骤

步骤1:获取JWT

  • 发送POST请求到登录接口,携带用户名和密码。
  • 解析响应,获取JWT。

步骤2:使用JWT进行身份验证

  • 在后续的请求中,将JWT添加到请求头的Authorization字段中。
  • 发送请求,获取需要身份验证的数据。

步骤3:处理响应

  • 解析响应数据,提取所需信息。
  • 如果需要,可以保存或进一步处理数据。

二、实战示例:基于JWT的模拟登录爬取

下面以一个假设的网站为例,演示如何使用Python进行基于JWT的模拟登录爬取。

2.1 环境准备

确保已安装requests库。如果未安装,可以使用以下命令安装:

pip install requests

2.2 分析登录流程

假设目标网站的登录页面为https://example.com/login
登录接口为https://example.com/api/auth/login,需要提交username和password字段,并在成功登录后返回JWT。

2.3 编写模拟登录代码

import requests# 创建一个会话对象,用于保持Cookies和其他参数
session = requests.Session()# 1. 获取登录页面(有些网站可能需要先访问登录页以获取CSRF令牌等)
login_page_url = 'https://example.com/login'
response = session.get(login_page_url)
if response.status_code != 200:raise Exception("无法访问登录页面")# 如果需要提取CSRF令牌,可以使用BeautifulSoup解析
# from bs4 import BeautifulSoup
# soup = BeautifulSoup(response.text, 'html.parser')
# csrf_token = soup.find('input', {'name': 'csrf_token'})['value']# 2. 准备登录数据
login_data = {'username': 'your_username','password': 'your_password',# 'csrf_token': csrf_token  # 如果需要
}# 3. 提交登录请求
login_url = 'https://example.com/api/auth/login'
response = session.post(login_url, json=login_data)# 4. 检查登录是否成功,并提取JWT
if response.status_code == 200:data = response.json()if 'token' in data:jwt_token = data['token']print(f"登录成功,获取到的JWT: {jwt_token}")else:raise Exception("登录成功但未返回JWT")
else:raise Exception(f"登录失败,状态码: {response.status_code}, 响应: {response.text}")# 5. 使用JWT访问需要认证的API
protected_url = 'https://example.com/api/user/profile'
headers = {'Authorization': f'Bearer {jwt_token}'
}
response = session.get(protected_url, headers=headers)if response.status_code == 200:profile = response.json()print("成功获取用户信息:")print(profile)
else:raise Exception(f"无法访问受保护资源,状态码: {response.status_code}, 响应: {response.text}")

2.4 代码说明

​会话管理:使用requests.Session()创建一个会话对象,可以自动管理Cookies和其他参数,确保登录状态在后续请求中保持。

​获取登录页面:有些网站在访问登录页时会设置必要的Cookies或生成CSRF令牌,因此首先访问登录页。如果不需要CSRF令牌,可以省略相关步骤。

​准备登录数据:构造包含用户名、密码和必要参数(如CSRF令牌)的JSON数据。

​提交登录请求:通过POST请求将登录数据发送到登录接口。注意使用json=login_data参数,requests会自动将字典转换为JSON格式并设置Content-Type: application/json头部。

​提取JWT:登录成功后,服务器通常会在响应中返回JWT,通常位于响应体的token字段中。提取JWT以便后续使用。

​访问受保护资源:在请求头中添加Authorization: Bearer ,以证明身份并访问需要认证的资源。

三、处理复杂情况

在实际应用中,可能会遇到以下复杂情况,需要相应处理:

3.1 动态参数

有些网站在登录过程中会使用动态生成的参数(如时间戳、随机数等),需要在每次请求时动态获取这些参数。

3.2 多因素认证

如果目标网站启用了多因素认证(如短信验证码、邮箱验证等),需要额外处理这些步骤。

3.3 刷新Token

JWT通常有有效期,服务器可能提供刷新Token的接口,用于在Token过期后获取新的Token。

3.4 HTTPS和证书验证

确保在请求时正确处理HTTPS协议,必要时配置SSL证书验证,避免中间人攻击等安全问题。

四、注意事项

​遵守法律法规:在进行爬虫操作时,务必遵守相关法律法规和目标网站的使用条款,避免非法获取或滥用数据。

​请求频率:控制请求频率,避免对目标服务器造成过大压力,防止被封IP。

​异常处理:在实际代码中,应加入异常处理机制,处理网络错误、解析错误等情况,提高代码的健壮性。

​数据存储:对于登录后获取的数据,应根据需求进行合理存储和处理,如保存到数据库或文件中。

​JWT安全性:处理JWT时要注意其安全性,避免泄露敏感信息。妥善管理JWT的存储和传输,防止被窃取或篡改。

五、总结

基于JWT的模拟登录爬取在现代Web应用中越来越普遍。通过理解JWT的基本原理和使用方法,结合Python的requests库,可以高效地实现模拟登录和数据爬取。在实际应用中,需根据具体网站的结构和安全机制,灵活调整策略,确保爬虫的稳定性和可靠性,同时遵守相关法律法规,合法合规地进行数据爬取。

相关文章:

一文5分钟掌握基于JWT的模拟登录爬取实战

文章目录 一、JWT简介1.1 什么是JWT?1.2 JWT的结构1.3 模拟登录流程1.4 爬取数据1.5 实战步骤 二、实战示例:基于JWT的模拟登录爬取2.1 环境准备2.2 分析登录流程2.3 编写模拟登录代码2.4 代码说明 三、处理复杂情况3.1 动态参数3.2 多因素认证3.3 刷新T…...

Idea 和 Pycharm 快捷键

一、快捷键 二、Pycharm 中怎么切换分支 参考如下 如果在界面右下角 没有看到当前所在的分支,如 “Git:master” 3. 有了 4....

fody引用c++的dll合并后提示找不到

fody引用c的dll合并后提示找不到 解决方案&#xff1a; 在 FodyWeavers.xml 文件中添加配置 CreateTemporaryAssemblies‘true’ 官方文档&#xff1a;https://github.com/Fody/Costura <Weavers xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:noN…...

HAL库 IIC写和读函数

IIC写函数&#xff1a;HAL_I2C_Master_Transmit (); IIC读函数&#xff1a;HAL_I2C_Master_Receive ()&#xff1b;写和读函数中的从机的地址最后一位由外部硬件电路控制。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------…...

初识flutter1

为什么使用flutter, 说直白一点,就是移动UI框架, 个人认为优势是: 1.一套代码adnroid 和ios 可以使用, 代码好维护 2.原生用户界面 3.开源、免费的 开发工具&#xff1a; 1.下载 java 包, 根据自己的电脑配置选择 官网下载: https://www.oracle.com/java/technologies/download…...

12字符函数

一、函数strchr与strrchr 注意&#xff1a; 这两个函数的功能&#xff0c;都是在指定的字符串 s 中&#xff0c;试图找到字符 c。strchr() 从左往右找&#xff0c;strrchr() 从右往左找。字符串结束标记 ‘\0’ 被认为是字符串的一部分。 图解&#xff1a; 示例代码&#xff…...

QT6开发高性能企业视频会议-8 使用VSCode+Copilot AI开发

Github Copilot是Github和OpenAI推出的AI编程辅助工具&#xff0c;之前版本的Github Copilot只有简单的代码自动补全&#xff0c;根据注释生成一些代码等辅助功能。 近期Copilot有了一次大的升级&#xff0c;加入了Agent模式&#xff0c;可以实现自然语言对话讨论和最重要的&a…...

矩阵的奇异值(SVD)分解和线性变换

矩阵的奇异值&#xff08;SVD&#xff09;分解和线性变换 SVD定义 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;简称 SVD&#xff09;是一种重要的线性代数工具&#xff0c;能够将任意矩阵 ( A ∈ R m n \mathbf{A} \in \mathbb{R}^{m \times n} A∈Rmn…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_rbtree_sentinel_init

ngx_rbtree_sentinel_init 定义在 src\core\ngx_rbtree.h #define ngx_rbt_black(node) ((node)->color 0) /* a sentinel must be black */#define ngx_rbtree_sentinel_init(node) ngx_rbt_black(node)初始化哨兵节点的颜色 将哨兵节点&#xff08;node&a…...

数据库的sql语句

本篇文章主要用来收集项目开发中&#xff0c;遇到的各种sql语句的编写。 1、根据user表的role_id字段&#xff0c;查询role表。 sql语句&#xff1a;使用JOIN连接两个表 SELECT u.*,r.rolename FROM user u JOIN role r ON u.role_id r.id WHERE u.id 1; 查询结果&#xff1a…...

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth&#xff0c;可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...

Bugku CTF Crypto(二)

目录 这不是md5 贝斯家族 把猪困在猪圈里 黄道十二官&#xff08;宫&#xff09; 抄错的字符 这不是md5 描 述: 666c61677b616537333538376261353662616566357d 分 析&#xff1a;题目提示这不是md5&#xff0c;字符中出现了d&#xff0c;猜测16进制 使用…...

openssl的aes128_ECB加密解密运算实例

aes128算法ECB接口 加密接口 注意事项&#xff1a; EVP_EncryptInit_ex初始化算法EVP_aes_128_ecb()&#xff0c;和密钥&#xff0c;key至少16BEVP_EncryptUpdate加密运算&#xff0c;tmplen输出已加密长度EVP_EncryptFinal_ex结束运算&#xff0c;如果在此仍有加密运算&…...

单片机总结【GPIO/TIM/IIC/SPI/UART】

一、GPIO 1、概念 通用输入输出口&#xff1b;开发者可以根据自己的需求将其配置为输入或输出模式&#xff0c;以实现与外部设备进行数据交互、控制外部设备等功能。简单来说&#xff0c;GPIO 就像是计算机或微控制器与外部世界沟通的 “桥梁”。 2、工作模式 工作模式性质特…...

动态部署Web应用程序与web.xml配置详解

文章目录 前言一、动态部署Web应用程序1.1 什么是动态部署&#xff1f;1.2 动态部署的步骤1.3 动态部署的优势 二、web.xml 配置文件2.1 什么是web.xml&#xff1f;2.2 web.xml 文件的结构2.2.1常见配置&#xff08;1&#xff09; 配置上下文参数(2) 配置Servlet(3)配置过滤器(…...

Rt-thread源码剖析(1)——内核对象

前言 该系列基于rtthread-nano的内核源码&#xff0c;来研究RTOS的底层逻辑&#xff0c;本文介绍RTT的内核对象&#xff0c;对于其他RTOS来说也可供参考&#xff0c;万变不离其宗&#xff0c;大家都是互相借鉴&#xff0c;实现不会差太多。 内核对象容器 首先要明确的一点是什…...

Python 的历史进程

Python&#xff1a;编程世界中的瑞士军刀 在当今数字化飞速发展的时代&#xff0c;编程语言层出不穷&#xff0c;而 Python 无疑是其中一颗耀眼的明珠。它以其简洁优雅的语法、强大的功能以及广泛的应用领域&#xff0c;成为了全球开发者炙手可热的编程语言之一。 Python 是一种…...

十一、大数据治理平台总体功能架构

大数据治理平台的功能架构图中心主题&#xff1a;数据治理 核心重点是建立健全大数据资产管理框架&#xff0c;确保数据质量、安全性、可访问性和合规性。 大数据治理平台总体功能架构图 关键功能领域 1.数据资产平台&#xff08;左侧&#xff09; 此部分主要关注数据资产本身…...

STM32——HAL库开发笔记23(定时器4—输入捕获)(参考来源:b站铁头山羊)

定时器有四个通道&#xff0c;这些通道既可以用来作为输入&#xff0c;又可以作为输出。做输入的时候&#xff0c;可以使用定时器对外部输入的信号的时间参数进行测量&#xff1b;做输出的时候&#xff0c;可以使用定时器向外输出精确定时的方波信号。 一、输入捕获 的基本原理…...

爬虫反爬:CSS位置偏移反爬案例分析与实战案例

文章目录 1. 反爬机制概述2. 反爬原理3. 案例分析4. 破解思路5. 实战样例样例1&#xff1a;使用Python和Selenium破解CSS位置偏移反爬样例2&#xff1a;电商网站商品列表CSS位置偏移反爬破解 6. 总结 1. 反爬机制概述 CSS位置偏移反爬是一种常见的反爬虫技术&#xff0c;通过C…...

libGL.so.1: cannot open shared object file: No such file or directory-linux022

in <module> from PyQt5.QtGui import QPixmap, QFont, QIcon ImportError: libGL.so.1: cannot open shared object file: No such file or directory 这个错误信息表示XXXX 在启动时遇到问题&#xff0c;缺少 libGL.so.1 文件。libGL.so.1 是与 OpenGL 图形库相关的共…...

向量数据库milvus部署

官方文档 Milvus vector database documentationRun Milvus in Docker (Linux) | Milvus DocumentationMilvus vector database documentation 按部署比较简单&#xff0c;这里说一下遇到的问题 一&#xff1a;Docker Compose 方式部署 1、镜像无法拉取,(docker.io被禁) …...

修改`FSL Yocto Project Community BSP`用到的u-boot源码,使其能适配百问网(100ask)的开发板

前言 在博文 https://blog.csdn.net/wenhao_ir/article/details/145547974 中,我们利用官方提供的BSP(FSL Yocto Project Community BSP)构建了写到SD卡中的完整镜像,然后启动后发现存在不少问题,首要的问题就是u-boot不能识别网卡,在这篇博文中,我们就找到FSL Yocto Pro…...

(python)Arrow库使时间处理变得更简单

前言 Arrow库并不是简单的二次开发,而是在datetime的基础上进行了扩展和增强。它通过提供更简洁的API、强大的时区支持、丰富的格式化和解析功能以及人性化的显示,填补了datetime在某些功能上的空白。如果你需要更高效、更人性化的日期时间处理方式,Arrow库是一个不错的选择…...

Pytorch框架06-现有网络模型(修改/使用/保存/加载)

3.9 PyTorch网络模型的修改及使用 PyTorch 提供了多个预训练的网络模型&#xff0c;涵盖了广泛的计算机视觉任务&#xff0c;如图像分类、目标检测、语义分割等。这些预训练模型在 ImageNet 等大型数据集上进行了训练&#xff0c;并可以直接用于迁移学习或微调。 3.9.1 常见的…...

【亲测有效】百度Ueditor富文本编辑器添加插入视频、视频不显示、和插入视频后二次编辑视频标签不显示,显示成img标签,二次保存视频被替换问题,解决方案

【亲测有效】项目使用百度Ueditor富文本编辑器上传视频相关操作问题 1.百度Ueditor富文本编辑器添加插入视频、视频不显示 2.百度Ueditor富文本编辑器插入视频后二次编辑视频标签不显示&#xff0c;在编辑器内显示成img标签&#xff0c;二次保存视频被替换问题 问题1&#xff1…...

MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析

文章目录 1. COUNT() 函数的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的详细对比2.1 COUNT(*) —— 统计所有符合条件的行2.2 COUNT(1) —— 统计所有符合条件的行2.3 COUNT(column) —— 统计某一列非 NULL 的记录数 3. 性能对比3.1 EXPLAIN 分析 4. 哪种方式更好&…...

laravel11设置中文语言包

安装中文语言包 Laravel 11 默认没有内置完整中文语言包&#xff0c;推荐使用第三方维护的完整翻译&#xff1a; # 通过 Composer 安装语言包 composer require laravel-lang/common --dev# 发布中文语言文件到项目 php artisan lang:add zh_CN这会自动将中文语言文件生成到 l…...

二、IDE集成DeepSeek保姆级教学(使用篇)

各位看官老爷好&#xff0c;如果还没有安装DeepSeek请查阅前一篇 一、IDE集成DeepSeek保姆级教学(安装篇) 一、DeepSeek在CodeGPT中使用教学 1.1、Edit Code 编辑代码 选中代码片段 —> 右键 —> CodeGPT —> Edit Code, 输入自然语言可编辑代码&#xff0c;点击S…...

网络七层模型—OSI参考模型详解

网络七层模型&#xff1a;OSI参考模型详解 引言 在网络通信的世界中&#xff0c;OSI&#xff08;Open Systems Interconnection&#xff09;参考模型是一个基础且核心的概念。它由国际标准化组织&#xff08;ISO&#xff09;于1984年提出&#xff0c;旨在为不同厂商的设备和应…...