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

news2024/12/28 21:26:57

本篇博客我们实现响应加密,由于本案例是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.coloradmin.cn/o/137301.html

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

相关文章

Es之mapping

1)、字段类型 2)、映射 Mapping(映射) Mapping 是用来定义一个文档(document),以及它所包含的属性(field)是如何存储和 索引的。比如,使用 mapping 来定义…

深入解析Linux虚拟化KVM-Qemu分析之KVM源码

说明: KVM版本:5.9.1QEMU版本:5.0.0工具:Source Insight 3.5, Visio 1. 概述 从本文开始将开始source code的系列分析了;KVM作为内核模块,可以认为是一个中间层,向上对接用户的控制…

idea中热部署插件JRebel的激活方式

idea中热部署插件JRebel的激活方式 一、打开jrebel 激活面板,如图: 二、选中Team URL(connect to online licensing service) 1、在上面的框中输入激活的url地址 http://127.0.0.1:8888/132d042c-3b1a-4c45-9044-b7897c3de7882…

遗传算法改进(IGA)+python代码实现

遗传算法改进(IGA)python代码实现一、变异概率的改进(1)单点变异(2)多点变异(3)选择性的突变概率二、交叉概率的改进三、适应度函数的改进(1)sigmoid函数&…

PGL 系列(六)node2vec

node2vec DeepWalk存在的问题是比较简单直接,而图结构往往是一个复杂结构,需要考虑很多因素,在深度优先搜索方法之外,还有广度优先搜索,结合以上两种方式可以更好的探索图模型,即node2vec。

华为交换机配置

文章目录网络规划与设计机房连线图PON网络配置网络规划与设计 OLT: 网络光线路终端(Optical Line Terminal) ONU分为两种 MDU(Multi-DwellingUnit,多住户单元) MDU主要应用于FTTB应用类型下的多个住宅用户的接入,一般具有至少4个…

【JDK工具】jinfo、jps、jstack、jstat、jmap

目录一、前言二、关键工具2.1 jps 显示所有JAVA进程信息1. 参数信息2. 常用命令2.2 jinfo 查看虚拟机配置参数信息1. 查看虚拟机参数 jinfo -flags pid2. 查看虚拟机指定参数 jinfo -flag 具体参数 pid3. 查看环境变量 jinfo -sysprops pid4. 参数列表2.3 jstack1. 能排查哪些问…

springboot整合之Validated参数校验

特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能操作会略有不同,不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整…

JVM面试大总结

一、汇总 JVM是运行在操作系统之上的,它与硬件没有直接的交互。先说一下JVM的内存区域,当函数开始运行时,JVM拿到自己的内存将自己的内存区域进行了分割,分为五块区域:线程共享的有堆、方法区,线程私有的有…

Hadoop MapReduce 介绍

Hadoop MapReduceMapReduce核心思想设计构思什么是MapReduceMapReduce的特点MapReduce的不足(局限性)MapReduce组成Hadoop MapReduce实现流程map阶段执行过程Reduce阶段执行过程Shuffle机制Map端ShuffleReducer端的shuffleMapReduce核心思想 MapReduce的…

基于MVC的在线购物系统

摘 要本毕业设计的内容是设计并且实现一个基于net语言的在线购物系统。它是在Windows下,以SQL Server为数据库开发平台,Tomcat网络信息服务作为应用服务器。在线购物系统的功能已基本实现,主要包括首页、个人中心、会员用户管理、商品分类管理…

Mac操作系统配置Git

下载Git mac在安装git时,一般只需要一行指令brew install git 验证Git 在我们安装过Git之后,我们可以输入git --version进行验证。如果我们成功进行了安装之后,我们可以看到下图这样的结果。 配置Gitee 生成密钥对 首先我们通过cd ~/.…

Allegro174版本新功能介绍之Symphony模式下放置器件

Allegro174版本新功能介绍之Symphony模式下放置器件 Allegro在172版本在Symphony模式下,是无法放置器件的,如下图 只有一个Swap的选项 在升级到了174版本的时候,Symphony模式是同样支持放器件的 具体介绍如下 任意打开一个174版本的PCB,选择Start Symphony Server

反射方程的分解、预计算BRDF

反射方程 仔细研究反射方程可以发现BRDF的漫反射kd和镜面反射ks是相互独立的,所以可以将方程分解为两部分: 通过分别积分两部分再求即可得到最终的反射结果。 漫反射部分 仔细观察漫反射积分,我们发现漫反射兰伯特项是一个常数项(…

Hadoop YARN

Hadoop YARNYARN的组成YARN3大件的作用MR提交计算程序的过程Scheduler调度策略FIFO Scheduler(先进先出调度)Capacity Scheduler(容量调度)Fair Scheduler(公平调度)Hadoop YARN是一个是一个通用资源管理系统和调度平台&#xff0…

Ambire Wallet 2022 年度回顾

在推出的第一年,Ambire Wallet 确立了自己作为 EVM 领域顶级智能合约钱包解决方案之一的地位:拥有近 10 万个账户,它通过其 NPM sig lib 和多样化的沟通努力为类别应用扫清了道路。 回顾过去一年我们最大的亮点 是的,朋友们&#…

vue路由的介绍和使用(包括前端导航、导航守卫)

文章目录路由基本使用实现简易的前端路由安装和配置vue-router路由安装vue-router包创建路由模块导入并挂载路由模块声明路由链接和占位符使用router-link替代a连接redirect重定向嵌套路由声明子级路由链接和占位符声明嵌套路由的规则动态路由动态路由匹配(基本用法)需求:在Mov…

Java源码篇之容器类——HashMap

以下是基于jdk17 Java源码篇之容器类——HashMapconstructorput()hash()putVal()resize()treeifyBin()treeify()tieBreakOrder()balanceInsertion()moveRootToFront()checkInvariants()constructor // 无参构造 public HashMap() {this.loadFactor DEFAULT_LOAD_FACTOR; // a…

多线程并发检测触发器触发算法优化,附详细代码 - 定时执行专家

目录 ◆ V6.5版之前的并行检测方案 ◆ V6.5版之前的并行检测方案存在的问题 ◆ V6.5版本的并行检测方案 ◆ 定时执行专家 - 简介 ◆ 定时执行专家 - 最新版下载 一些用户说任务数量可能达到200个,让我比较惊讶,这个软件的设计之初并没有考虑这么多的…

MySQL调优-SQL底层执行原理

目录 MySQL调优-SQL底层执行原理 MySQL内部组件结构 Server层 Store层 连接器 客户端连接mysql数据库 创建新用户并且修改用户密码: show processlist 查看用户状态 客户端自动断开时间 长连接和短连接 查询缓存 常见的一些命令操作 大多数情况查询缓存…