Python爬虫——基于JWT的模拟登录爬取实战

news2024/11/16 6:22:43

基于JWT的模拟登录爬取实战

JWT(JSON Web Token)主要由三部分组成:

  1. Header:包含了Token的类型(“typ”)和签名算法(“alg”)信息。通常情况下,这个部分会指定为{"alg": "HS256", "typ": "JWT"},表示使用HMAC SHA-256算法进行签名。
  2. Payload:包含了要传输的信息,也称为声明(claims)。其中可以包含注册声明(registered claims)、公共声明(public claims)和私有声明(private claims),例如用户ID、姓名等信息。一些注册声明包括iss(issuer)、sub(subject)、aud(audience)、exp(expiration time)、nbf(not before time)等。
  3. Signature:对Header和Payload进行签名后生成的结果,以确保JWT的完整性和真实性。签名通常使用Base64编码的Header和Payload,并结合一个密钥使用指定的算法进行计算得到。

JWT的三个部分都是使用Base64 URL编码的,并且它们之间通过句点(.)来分隔。最终生成的JWT字符串就是由这三部分组成的。.JWT的格式是明文的,因此不应将敏感数据直接存储在JWT中,特别是不要在Payload中存储敏感信息,因为Payload中的内容可以被Base64解码。敏感信息应该通过加密或其他安全手段进行处理。

  1. 案例介绍

案例网站是https://login3.scrape.center/,访问这个网站,同样会打开一个登录页面,如图所示。

Screenshot 2024-04-03 at 20.12.51

用户名和密码都是admin,输入后点击登录按钮会跳转到首页,证明登录成功。

  1. 模拟登录

基于JWT的网站通常采用的是前后端分离式,前后端的数据传输依赖于Ajax,登录验证依赖于JWT这个本身就是token的值,如果JWT经验证是有效的,服务器就会返回相应的数据。打开开发者工具,执行登录操作,看一下登录过程中产生的请求,如图所示:

Screenshot 2024-04-03 at 20.58.59

Screenshot 2024-04-03 at 21.02.49

从上图中可以看出,登录时的请求URL为https://login3.scrape.center/api/login,是通过Ajax请求的。请求体是JSON格式的数据,而不是表单数据,返回状态码为200.然后看一下返回结果是怎样的,如下图所示:

Screenshot 2024-04-03 at 21.07.09

从上图中看出,返回结果也是JSON格式的数据,包含一个token字段,其内容为:

 "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzEyMTkyMDY1LCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNzEyMTQ4ODY1fQ.-SIR4TI_nqkyfKoV7OudZeMnIGz09D4CxS6H8ANOAJM"

由“."把整个字符串分为三段。有了这个JWT,怎么获取后续的数据呢?翻下一页,看看后续的请求内容,如下图所示:

Screenshot 2024-04-03 at 21.13.22

从上图中可看出,在后续发出的用于获取数据的Ajax请求中,请求头里多了一个Authorization字段,其内容为jwt加上刚才图中token字段的内容,返回结果也是JSON格式数据,如图所示:

Screenshot 2024-04-03 at 21.17.32

可以看出,返回结果正是网站首页显示的内容,这也是我们应该模拟爬取的内容。那么现在,模拟登录的整个思路就有了,其实就是如下两个步骤:

  • 模拟登录请求,带上必要的登录信息,获取返回的JWT;
  • 之后发送请求时,在请求头里面加上Authorization字段,值就是JWT对应的内容。

实现代码如下:

import requests
from urllib.parse import urljoin

BASE_URL = '<https://login3.scrape.center/>'
LOGIN_URL = urljoin(BASE_URL, '/api/login')
INDEX_URL = urljoin(BASE_URL, '/api/book')
USERNAME = 'admin'
PASSWORD = 'admin'

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

data = response_login.json()
print('Response JSON', data)
jwt = data.get('token')
print('JWT', jwt)

headers = {
    'Authorization': f'jwt {jwt}'
}
response_index = requests.get(INDEX_URL, params={'limit': 18, 'offset': 0}, headers=headers)
print('Response Status', response_index.status_code)
print('Response URL', response_index.url)
print('Response Data', response_index.json())

这里我们先定义了登录接口和获取数据的接口,分别是LOGIN_URL和INDEX_URL,接着调用requests的post方法进行了模拟登录。由于这里提交的数据是JSON格式,所以使用json参数来传递。接着获取并打印出返回结果中包含的JWT。然后构造请求头,设置Authorization字段并传入刚获取的JWT,这样就能成功获取数据了。

运行结果如下:

Response JSON {'token': 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzEyMTk0MTMxLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNzEyMTUwOTMxfQ.jJNKrqLFxjmedcf333nO9E1XFNXpL-Ab8dF6zP_JUOQ'}
JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNzEyMTk0MTMxLCJlbWFpbCI6ImFkbWluQGFkbWluLmNvbSIsIm9yaWdfaWF0IjoxNzEyMTUwOTMxfQ.jJNKrqLFxjmedcf333nO9E1XFNXpL-Ab8dF6zP_JUOQ
Response Status 200
Response URL <https://login3.scrape.center/api/book/?limit=18&offset=0>
Response Data {'count': 9200, 'results': [{'id': '34473697', 'name': 'R数据科学实战:工具详解与案例分析','authors': ['刘健', '邬书豪'], 'cover': None, 'score': '8.9'}, {'id': '34790654', 'name': 'Greenplum:从大数据战略到实现', 'authors': ['冯雷', '姚延栋','高小明', '杨瑜'], 'cover': None, 'score': '8.9'},{'id': '34893933', 'name': '江湖外史(2019精装版)','authors': ['王怜花'], 'cover': '<https://cdn.scrape.center/book/s33523792.jpg>', 'score': '8.3'}, {'id': '17707842', 'name': None, 'authors': None, 'cover': None, 'score': None}, {'id': '27080632', 'name': 'Streaming Systems', 'authors': ['Tyler Akidau', 'Slava Chernyak', 'Reuven Lax'], 'cover': None, 'score': ' 8.9 '}, {'id': '1046276', 'name': '温暖和百感交集的旅程', 'authors': ['\\n            余华', '余华作品系列'], 'cover': '<https://cdn.scrape.center/book/s1120387.jpg>', 'score': '8.1'}, {'id': '25862578', 'name': '解忧杂货店', 'authors': ['\\n                [日]\\n            东野圭吾', '新经典文化', '新经典文库·东野圭吾作品'], 'cover': '<https://cdn.scrape.center/book/s27264181.jpg>', 'score': '8.5'}, {'id': '10554308', 'name': '白夜行', 'authors': ['[日] 东野圭吾'], 'cover': '<https://cdn.scrape.center/book/s24514468.jpg>', 'score': '9.2'}, {'id': '4913064', 'name': '活着', 'authors': ['余华'], 'cover': '<https://cdn.scrape.center/book/s29053580.jpg>', 'score': '9.4'}, {'id': '6015822', 'name': '在细雨中呼喊', 'authors': ['\\n            余华', '余华作品(2008版)'], 'cover': '<https://cdn.scrape.center/book/s6309302.jpg>', 'score': '8.5'}, {'id': '10594787', 'name': '霍乱时期的爱情', 'authors': ['[哥伦比亚] 加西亚·马尔克斯'], 'cover': '<https://cdn.scrape.center/book/s11284102.jpg>', 'score': '9.0'}, {'id': '27064488', 'name': '活着', 'authors': ['余华'], 'cover': '<https://cdn.scrape.center/book/s29652928.jpg>', 'score': '9.4'}, {'id': '1974038', 'name': '南腔北调集', 'authors': ['鲁迅'], 'cover': '<https://cdn.scrape.center/book/s2126995.jpg>', 'score': '8.6'}, {'id': '1491325', 'name': '皮皮鲁和梦中人', 'authors': ['\\n            郑渊洁', '皮皮鲁总动员'], 'cover': '<https://cdn.scrape.center/book/s26739368.jpg>', 'score': '8.7'}, {'id': '6082808', 'name': '百年孤独', 'authors': ['\\n                [哥伦比亚]\\n            加西亚·马尔克斯', '新经典文化', '\\n            范晔', '新经典文库:加西亚·马尔克斯作品'], 'cover': '<https://cdn.scrape.center/book/s6384944.jpg>', 'score': '9.2'}, {'id': '34672176', 'name': '呼吸', 'authors': ['[美] 特德·姜'], 'cover': '<https://cdn.scrape.center/book/s33519539.jpg>', 'score': '8.6'}, {'id': '34434309', 'name': '82年生的金智英', 'authors': ['[韩]赵南柱'], 'cover': '<https://cdn.scrape.center/book/s33463759.jpg>', 'score': '7.9'}, {'id': '1200840', 'name': '平凡的世界(全三部)', 'authors': ['\\n            路遥', '茅盾文学奖获奖作品全集'], 'cover': '<https://cdn.scrape.center/book/s1144911.jpg>', 'score': '9.0'}]}

模拟登录成功!

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

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

相关文章

ChatGPT 之创造力与沟通的演化

原文&#xff1a;ChatGPT … The Evolution of Creativity and Communication 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者注 亲爱的读者&#xff0c; ChatGPT&#xff0c;一位 AI 专家和一位律师走进了一家酒吧。酒保看着他们说&#xff1a;“这是什么&…

企业邮箱给谷歌Gmail报错550-5.7.25解决方案

企业邮箱给谷歌Gmail报错550-5.7.25解决方案 问题表现 今天接到同事报告企业邮箱发送报错的问题&#xff0c;具体问题表现如下&#xff1a; 我司内部邮箱 xxXXX.com 邮箱给国内的163和新浪和企业内部发送邮件可以成功给Hotmail发送邮件&#xff0c;成功。给Gmail发送邮件&am…

java计算机网络(一)-- url,tcp,udp,socket

网络编程&#xff1a; 计算机网络 计算机网络指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 网络协议…

前端工程师————CSS学习

选择器分类 选择器分为基础选择器和复合选择器 基础选择器包括&#xff1a;标签选择器&#xff0c;类选择器&#xff0c;id选择器&#xff0c;通配符选择器标签选择器 类选择器 语法&#xff1a;.类名{属性1&#xff1a; 属性值&#xff1b;} 类名可以随便起 多类名使用方式&am…

华为openEuler-22.03-LTS-SP3配置yum源

先有华为后有天&#xff0c;遥遥领先&#xff01; 1 确定使用的OS版本 # cat /etc/os-release NAME"openEuler" VERSION"22.03 (LTS-SP3)" ID"openEuler" VERSION_ID"22.03" PRETTY_NAME"openEuler 22.03 (LTS-SP3)" ANSI…

深度解析大语言模型中的词向量

在学习完语言模型中的编码器与解码器知识后&#xff0c;让我们继续深入学习大语言模型中一个非常关键的技术&#xff1a;词向量表示&#xff0c;以及如何通过Transformer模型实现对next token的预测。 1、词向量 要了解语言模型的工作原理&#xff0c;首先需要了解它们如何表示…

VSCode美化

今天有空收拾了一下VSCode&#xff0c;页面如下&#xff0c;个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多&#xff0c;有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网&#xff1a;Maple-Font 我只安装了下图两个字体&#xff0c;使…

UE4_普通贴图制作法线Normal材质

UE4 普通贴图制作法线Normal材质 2021-07-02 10:46 导入一张普通贴图&#xff1a; 搜索节点&#xff1a;NormalFromHeightmap 搜索节点&#xff1a;TextureObjectparameter&#xff0c;并修改成导入的普通贴图&#xff0c;连接至HeightMap中 创建参数normal&#xff0c;连接…

32. UE5 RPG使用增强输入激活GameplayAbility(二)

在上一篇文章中&#xff0c;我们实现了Tag和InputAction的数据对应&#xff0c;后面&#xff0c;我们会通过InputAction触发对应的Tag&#xff0c;然后在GameplayAbility身上设置对应的Tag&#xff0c;然后通过Tag遍历角色身上的所有应用的技能去激活。为了实现这个功能&#x…

数据结构进阶篇 之 【交换排序】(冒泡排序,快速排序递归、非递归实现)

当你觉的自己不行时&#xff0c;你就走到斑马线上&#xff0c;这样你就会成为一个行人 一、交换排序 1.冒泡排序 BubbleSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 冒泡排序的特性总结 2.快速排序 QuickSort 2.1 基本思想 2.2 递归实现 2.2.1 hoare版 2.2.2 …

蓝桥杯真题:递增序列

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main {public static int is1(char ch[][],int m,int n){int ans0;for (int i0;i<m;i){for (int j0;j<n;j){int add1;while(jadd<n){if(ch[i][j]<ch[i][jadd]) ans; //横…

MySQL - 基础二

6、表的增删改查 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 6.1、Create 语法&#xff1a; INSERT [INTO] table_name[(column [, column] ...)]VALUES (value_list) [, (value_list)] ...value_list: v…

JAVA学习笔记22(面向对象三大特征)

1.面向对象三大特征 ​ *封装、继承和多态 1.1 封装 ​ 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作*[方法**]封装在一起&#xff0c;数据被保护在内部&#xff0c;程序的其它部分只有通过被授权的操作[方法]&#xff0c;方能对数据进行操作 ​ 1.封装的理…

椋鸟数据结构笔记#6:堆及其实现

文章目录 堆的概念堆的实现由数组调整为堆堆向下调整算法通过向下调整算法构建堆 从空堆开始插入节点堆向上调整算法通过向上调整算法构建堆 删除堆顶的元素实现代码 堆的作用 萌新的学习笔记&#xff0c;写错了恳请斧正。 堆的概念 如果有一个关键码的集合 K { k 0 , k 1 , …

基于java的电影院售票网站

开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclip…

Doris实践——同程数科实时数仓建设

目录 前言 一、早期架构演进 二、Doris和Clickhouse选型对比 三、新一代统一实时数据仓库 四、基于Doris的一站式数据平台 4.1 一键生成任务脚本提升任务开发效率 4.2 自动调度监控保障任务正常运行 4.3 安全便捷的可视化查询分析 4.4 完备智能的集群监控 五、收益与…

网络与并发编程(一)

并发编程介绍_串行_并行_并发的区别 串行、并行与并发的区别 串行(serial)&#xff1a;一个CPU上&#xff0c;按顺序完成多个任务并行(parallelism)&#xff1a;指的是任务数小于等于cpu核数&#xff0c;即任务真的是一起执行的并发(concurrency)&#xff1a;一个CPU采用时间…

Java 变得越来越像 Rust?

随着编程技术的增强和复杂性的提升&#xff0c;许多编程语言也纷纷效仿&#xff0c;Java 也不例外。 另一边&#xff0c;尽管社区内部问题重重&#xff0c;但 Rust 仍逐年获得开发人员的喜爱。这背后都是有原因的&#xff1a;Rust 的编译器让开发人员避免了各种问题。编译器对…

Spring的BeanFactory和FactoryBean有什么区别?

两者的区别 BeanFactory定义了ioc容器的最基本形式,并提供了ioc容器应遵守的的最基本的接口,也就是Spring ioc所遵守的最底层和最基本的编程规范,它只是个接口,并不是ioc容器的具体实现。它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。再来说说…

jvisualvm 使用教程

之前看过 jvisualvm&#xff0c;但是那个时候对 JVM 并不是很熟悉&#xff0c;后面看了下八股文&#xff0c;看了下 JVM 的相关知识之后&#xff0c;发现多了解点 JVM 的东西&#xff0c;对我们 CRUD 其实是有指导意义的&#xff0c;就比如我们通常会 new 一堆的没有用到的对象…