19. 网站响应数据加一个简单的密,就能挡住80%的爬虫,你信吗?

news/2024/11/9 0:36:53/

本篇博客我们实现响应加密,由于本案例是JS逆向阶段的第一个案例,所以采用最基础加密手段。
爬虫训练场源码同步仓库为 GitCode
项目采集测试地址:爬虫训练场

爬虫训练场

    • 框架搭建
    • Python Flask 端 Base64加密
    • 前台解密字符串+渲染数据

框架搭建

本次要实现的案例需要用到数据加密,所以采用 API 接口形式进行数据响应,数据使用之前采集到的学校数据。

app/school/index.py 文件中新建视图函数,示例代码如下所示。

@s.route('ajax_list')
def ajax_list():page = 1  # 初始化第一页数据pagination = pagination_object(page)return render_template('school/encry_ajax_list.html', pagination=pagination)

同步将 school/encry_ajax_list.html 建立出来,页面内容可完全参考 school/ajax_list.html 文件。

此时,本案例需要的文件都已经创建完毕,下面实现加密与解密部分。

Python Flask 端 Base64加密

本案例选择最简单的可逆加密 Base64 进行实现,具体代码如下所示。

# 加密 API
@s.route('encry_api')
def encry_api():page = int(request.args.get("page", 1))pagination = pagination_object(page)data_bytes = json.dumps(pagination["data_list"]).encode()encoded_data = base64.b64encode(data_bytes)print(encoded_data)return jsonify(pagination)

上述代码使用了 base64.b64encode(data_bytes) 函数进行 base64 编码,在使用前需要导入 base64 模块,该函数接受一个字节字符串并返回一个字节字符串。
由于我们 pagination["data_list"] 中获取的是列表类型数据,所以还需要导入 json 模块,先将对象转换为字节字符串,然后在进行加密操作。

最后将加密后的内容,重新赋值到 pagination["data_list"] 中,即完成 API 接口部分逻辑。

# 加密 API
@s.route('encry_api')
def encry_api():page = int(request.args.get("page", 1))pagination = pagination_object(page)data_bytes = json.dumps(pagination["data_list"]).encode()# 重新赋值到 pagination 对象中,注意将字节字符串转换为普通字符串pagination["data_list"] = base64.b64encode(data_bytes).decode("utf-8")return jsonify(pagination)

再次运行代码,通过开发者工具,可以查看 API 返回数据。

19. 网站响应数据加一个简单的密,就能挡住80%的爬虫,你信吗?

前台解密字符串+渲染数据

加密之后的数据从后台传递到前台,我们需要将其解密之后,才可以进行数据渲染。

由于已知后台是采用的 Base64 编码,所以只需要用 JS 进行解码即可。

在 JavaScript 中,你可以使用 atob() 函数将 base64 编码的字符串解码为原始字符串。例如:

const encoded = '待解码字符串';
const decoded = atob(encoded);
console.log(decoded);  

在浏览器中,你还可以使用 window.btoa() 函数对字符串进行 base64 编码,使用方法与 atob() 函数类似,本案例中解码位置代码如下。

function render_data(response){data_list = response["data_list"];// base64 解码const decoded = atob(data_list);console.log(decoded);  

解码之后的数据输出。

19. 网站响应数据加一个简单的密,就能挡住80%的爬虫,你信吗?

拿到该数据之后,就可以将其应用到 JS 迭代渲染中,查看格式是否正确,经过测试,发现转码之后的数据依旧是字符串类型,所以还需要将其进行格式化,在 JavaScript 中,可以使用 JSON.parse() 函数将字符串转换为 JSON 对象。例如:

const data = '{"name": "橡皮擦", "age": 18}';
const obj = JSON.parse(data);
console.log(obj);  

JSON.parse() 函数只能用于解析标准的 JSON 格式字符串。如果字符串的格式不正确,会抛出一个 SyntaxError 错误。

JSON.parse() 函数添加到我们的案例中,完成最后效果。

本案例到此结束,已更新到 爬虫训练场 欢迎大家访问学习。
项目同步到代码仓库 https://gitcode.net/hihell/spider_playground

📢📢📢📢📢📢
💗 你正在阅读 【梦想橡皮擦】 的博客
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中指正吧
📆 橡皮擦的第 816 篇原创博客

从订购之日起,案例 5 年内保证更新

  • ⭐️ Python 爬虫 120,点击订购 ⭐️
  • ⭐️ 爬虫 100 例教程,点击订购 ⭐️

http://www.ppmy.cn/news/8988.html

相关文章

【论文阅读】《知识图谱可解释推理研究综述》阅读(一)

声明:仅学习使用。 仅作为个人阅读笔记~ 目录 1. 文章来源2. 主要内容3. 可解释性知识推理 的由来4. 事前可解释推理4.1 全局可解释的推理4.2 局部可解释的推理1. 文章来源 比起上一篇paper是2017年,这一篇是2022年年底的,没错,就在前两天还是2022年呢哈! 祝大家新年快…

C++进阶 map和set

作者:小萌新 专栏:C进阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:简单介绍C中map和set容器 map和set关联式容器树形结构与哈希结构键值对setset的介绍set的定义方式方式一: 构造一个某类型的…

常见的web容器技术选型

前言我们平时部署项目会使用很多的web容器来部署,比如常见的tomcat,jetty等但是这些不同的web容器的适用场景是怎么样的,我们在选择哪种容器需要考虑哪些因素呢?web容器,也称为servlet容器,是web服务器的一…

Java测试框架——JUnit详解(45)

文章目录前言何为JUnit?官方资料JUnit4常用注解和断言代码测试搭建一个JUnit测试环境生命周期忽略测试断言测试异常测试测试时间套件测试JUnit5JUnit5对比JUnit4的好处导包的改变注解的改变扩展JUnit新功能:参考文章JUnit是Java编程语言的单元测试框架&a…

5G边缘计算网关助力5G工业物联网智能化建设

5G边缘计算,凭借高带宽、高可靠、低时延、移动性等特性,推动工业生产物联网发展趋势,实现工业更快、更精准通信及数据共享。边缘计算网关下5G工业物联网远程感知生产一线,工控数字化、自动化、智能化,降低人物力资源成…

代码随想录算法训练营No6 |LeetCode 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表理论基础 242.有效的字母异位词 题目描述:给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 解法1 :用dict来…

AcWing 数学知识

质数 模板&#xff1a; // 试除法判断质数 bool is_prime(int x) {if (x < 2) return false;//只需枚举一部分 使得 i< x / i, 时间复杂度为√nfor (int i 2; i < x / i; i )if (x % i 0)return false;return true; }// 试除法分解质因数 void divide(int n) {fo…

戴尔灵越14电脑U盘重装系统方法分享

戴尔灵越14电脑U盘重装系统方法分享。一些用户的戴尔灵越14电脑在进行了系统升级之后&#xff0c;出现了系统不兼容的情况&#xff0c;导致自己的电脑桌面出现了蓝屏的情况。那么这个情况下我们怎么去将系统进行重装呢&#xff1f;一起来看看U盘重装系统的方法吧。 准备工作&am…