记录一次反爬操作 - ( 简单 )

实现思路

1.参数加密

已知我的参数是 page 和 pageSize,此时我想要对着两个参数进行加密,那么我的选型还是比较多的,这里使用常见的md5进行加密处理。

思路

避免加密参数不变,我们引入一个时间戳来混淆爬虫,这样我们就得到了加密的参数了。
代码参考:

import request from '../utils/request';
import CryptoJS from 'crypto-js';
export const searchUserByTags = (tags: any, page: any, pageSize: any) => {const timestamp = Date.now().toString();const sign = CryptoJS.MD5(page + pageSize + timestamp + "xiaocaidan").toString();return request.post("/user/search", {tags: tags,page: page,pageSize: pageSize,time: timestamp,sign: sign});
}

优化,我们可以将tags进行转换,使用hash操作,得到一个新的加密参数,然后进行拼接,得到一个最终效果的参数
如: sign + '|' + time + '|' + hash(tags)

2.代码混淆

得到上方的的加密代码之后我们可以做一个js混淆,让爬虫解析前端代码困难起来。
js混淆工具

混淆前的代码
    const timestamp = Date.now().toString();const sign = CryptoJS.MD5(page + pageSize + timestamp + "xiaocaidan").toString();return request.post("/user/search", {tags: tags,page: page,pageSize: pageSize,time: timestamp,sign: sign});
混淆后的代码
function _0x5670(_0x4239f6, _0x1c06ce) {const _0x2507cf = _0x2507(); return _0x5670 = function (_0x567057, _0x3c9f41) { _0x567057 = _0x567057 - 0x1a1; let _0x39c382 = _0x2507cf[_0x567057]; return _0x39c382; }, _0x5670(_0x4239f6, _0x1c06ce);}const _0x99028a = _0x5670;(function (_0x123360, _0xd0bda3) {const _0x89478b = _0x5670, _0x5256f6 = _0x123360();while (!![]) {try {const _0x199e10 = parseInt(_0x89478b(0x1a2)) / 0x1 * (-parseInt(_0x89478b(0x1a4)) / 0x2) + parseInt(_0x89478b(0x1a5)) / 0x3 + -parseInt(_0x89478b(0x1ab)) / 0x4 * (parseInt(_0x89478b(0x1af)) / 0x5) + parseInt(_0x89478b(0x1a3)) / 0x6 * (-parseInt(_0x89478b(0x1a9)) / 0x7) + parseInt(_0x89478b(0x1a6)) / 0x8 + parseInt(_0x89478b(0x1a8)) / 0x9 * (parseInt(_0x89478b(0x1a1)) / 0xa) + -parseInt(_0x89478b(0x1ae)) / 0xb; if (_0x199e10 === _0xd0bda3) break; else _0x5256f6['push'](_0x5256f6['shift']());} catch (_0x4c629a) { _0x5256f6['push'](_0x5256f6['shift']()); }}}(_0x2507, 0x9dcd3)); const timestamp = Date['now']()[_0x99028a(0x1ad)](), sign = CryptoJS[_0x99028a(0x1ac)](page + pageSize + timestamp + _0x99028a(0x1a7))[_0x99028a(0x1ad)](); function _0x2507() { const _0x35df2c = ['MD5', 'toString', '1339305ECXPIG', '3365ERShus', '1270gpPtfm', '110645cBxblt', '6RZquIb', '4MjMiyF', '87582bFxmbr', '8275472fserRH', 'xiaocaidan', '70794rMDivZ', '7083769lzcyvp', '/user/search', '364WoWysM']; _0x2507 = function () { return _0x35df2c; }; return _0x2507(); } return request['post'](_0x99028a(0x1aa), { 'tags': tags, 'page': page, 'pageSize': pageSize, 'time': timestamp, 'sign': sign });
接口限流

使用Redisson中的RRateLimiter工具进行操作

工具类:
package com.caidan.HuoBanSystem.utils;import com.caidan.HuoBanSystem.exception.BaseException;
import jakarta.annotation.Resource;
import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;/*** @项目名 BIProject* @描述 使用redis进行限流操作* @作者 wzy* @时间 2024/5/28 18:46*/
//  注册一下bean
//  写成一个工具类 便于后续使用
@Component
public class RedisLimitManager {@Resourceprivate RedissonClient redissonClient;//    定义限流内容public void doRateLimit(String key,String message) {
//      设置限流器RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);// 设置限流器的速率:每秒产生 2 个令牌,允许突发 1 个令牌rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS);
//      当一个操作来的时候,请求一个令牌boolean canOp = rateLimiter.tryAcquire(1);if(!canOp){throw new BaseException(message);}}
}

以上就是我针对这个接口的加密方式,也是心血来潮,想要实现一个,毕竟写了这么多爬虫文章了,也应该介绍下反爬了。
如果大家有比较好的策略,可以评论区留言交流一下。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ValueError: invalid literal for int() with base 10: ‘a‘

ValueError: invalid literal for int() with base 10: ‘a‘ 目录 ValueError: invalid literal for int() with base 10: ‘a‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰&#xff…

基于web3区块链的名酒资产数字化、个人闲置资产收藏系统,实现联盟链、NFT数据上链、智能合约开发

系统背景: 国内有众多历史悠久却极具收藏价值的名酒品类,但是传统名酒投资存在着保真、流通和收藏三大痛点,极大影响了名酒产业的发展。基于区块链的分布式、不可篡改、可追溯、透明性、多方维护、交叉验证等特性,数据权属可以被有…

【Linux】软连接|硬链接|当前路径(.)|上级路径(..)|硬链接不能链接目录

目录 前言 软连接 ​编辑 删除源文件 快捷应用 总结 硬链接 硬链接为何不能链接目录 为什么软连接可以 软硬链接区别 当前路径(.)和上级路径(..) ​编辑 前言 在 Linux 中,文件的存储位置和数据(属性内容)是由 inode 号来唯一标…

错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配

这个问题实际上网上都有解法,但是可能没有那么的清楚,大家在各种问,我既然搞定了,就分享给大家吧网上解法: 开发调试需要另外创建开发证书和描述文件,描述文件同时绑定开发设备解读: 实际上这句…

electron 主进程和渲染进程

最近在整理electron 相关的项目问题,对自己来说也是温故知新,也希望能对小伙伴们有所帮助,大家共同努力共同进步。加油!!!! 虽然最近一年前端大环境不好,但是大家还是要加油鸭&#…

SmartInitializingSingleton和InitializingBean的区别

SmartInitializingSingleton:接口里面就一个方法afterSingletonsInstantiated,它是spring容器将所有bean都初始化完成之后,才会去调用,要求实现它接口的bean必须是单例的。 应用场景:可以在服务启动之后去处理一些逻辑…

科普文:从源码解读5种Redis基本数据类型

键值对字符串 char* 与 SDS char* 的不足: 操作效率低:获取长度需遍历,O(N)复杂度 二进制不安全:无法存储包含 \0 的数据 SDS 的优势: 操作效率高:获取长度无需遍历,O(1)复杂度&#xff08…

60个常见的 Linux 指令

常见60个Linux指令 1.ssh 登录到计算机主机2.ls 列出目录内容3.pwd 当前终端会话所在的完整路径4.cd 切换当前工作目录5.touch 创建空文件或更新文件的时间戳6.echo 终端输出文本或变量值7.nano 在终端中编辑文件8.vim 文本编辑器9.cat 查看、连接和创建文件10.shred 安全删除敏…

XPathParser类

XPathParser类是mybatis对 javax.xml.xpath.XPath的包装类。 接下来我们来看下XPathParser类的结构 1、属性 // 存放读取到的整个XML文档private final Document document;// 是否开启验证private boolean validation;// 自定义的DTD约束文件实体解析器,与valida…

科研绘图系列:R语言山脊图(Ridgeline Chart)

介绍 山脊图(Ridge Chart)是一种用于展示数据分布和比较不同类别或组之间差异的数据可视化技术。它通常用于展示多个维度或变量之间的关系,以及它们在不同组中的分布情况。山脊图的特点: 多变量展示:山脊图可以同时展示多个变量的分布情况,允许用户比较不同变量之间的关…

FastAPI(七十二)实战开发《在线课程学习系统》接口开发-- 留言列表开发

源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前我们分享了FastAPI(七十一)实战开发《在线课程学习系统》接口开发-- 查看留言,这次我们分享留言列表开发。 获…

i2c中结构体 数据传输 i2c Tools使用

I2C中重要结构体 在I2C(Inter-Integrated Circuit)通信中,涉及的主要结构体通常用于描述设备、消息和传输的配置。以下是一些常见的I2C结构体及其作用: i2c_adapter: 这是一个代表I2C总线适配器的结构体。它包含与该I2C总线相关的…

Hive3:Centos7环境部署Hive服务

一、安装说明 1、Hadoop集群情况 3台机器:4G2C、2G2C、2G2C 安装教程:Centos7环境安装Hadoop集群 2、安装MySQL,用于存储Hive的元数据 在102机器上安装MySQL 安装MySQL使用服务器的root账号 3、最后安装Hive 安装hive过程使用服务器的atgu…

dpdk编译安装以及接收udp报文(基于ubuntu)

目录 1、编译 2、设置运行环境 3、使用dpdk接收udp报文 3.1、设置发送端arp信息 3.2、测试 3.3、代码 4、其他 1、编译 代码下载: DPDK 下载版本:DPDK 19.08.2 export RTE_SDK/root/dpdk-stable-19.08.2/ export RTE_TARGETx86_64-native-li…

STM32简介

1.STM32的三个重要特征 32位微控制器,也称作MCU。 由ST(意法半导体)公司开发。 以ARM-Cortex-M为核心。 2.STM32的优点 3.ARM ARM是RISC精简指令集的代表,很多移动设备都是基于ARM架构的。ARM自2004年以后放弃使用数字命名法…

Fantastic-admin:Vue 中后台管理系统

Fantastic-admin:Vue 中后台管理系统 在当今的前端开发世界里,fantastic-admin 作为一款功能强大的 Vue 中后台管理系统框架,简直是开发者的福音。本文将介绍 fantastic-admin 的基本信息、特点,以及如何快速上手和使用。 项目简介…

快速搞定分布式RabbitMQ---RabbitMQ进阶与实战

本篇内容是本人精心整理;主要讲述RabbitMQ的核心特性;RabbitMQ的环境搭建与控制台的详解;RabbitMQ的核心API;RabbitMQ的高级特性;RabbitMQ集群的搭建;还会做RabbitMQ和Springboot的整合;内容会比较多&#…

内存泄漏详解

文章目录 什么是内存泄漏内存泄漏的原因排查及解决内存泄漏避免内存泄漏及时释放资源设置合理的变量作用域及时清理不需要的对象避免无限增长避免内部类持有外部类引用使用弱引用 什么是内存泄漏 内存泄漏是指不使用的对象持续占有内存使得内存得不到释放,从而造成…

AI绘画进阶工具 ComfyUI 新版来啦!操作界面详解!取消悬浮面板,自带工作流管理功能!(附安装包)

大家好,我是画画的小强 在 7 月初的一次更新中,ComfyUI 官方推出了 Beta 版 UI,取消了原本的悬浮面板,还新增了工作流管理功能,整体使用体验比之前好了很多。今天就为大家详细介绍一些新版 UI 的特点和用法。 一、启…

HDBaseT远距离无压缩传输系统源头厂家

HDBaseT双绞线延长器是一款集成HDBaseT的远距离高清信号无压缩、无延时传输器,HDMI信号从接收端输出, 信号分辨率高达4Kx2K可以通过单根CAT5/CAT6网线将信号长距离传输高清无压缩音视频信号, 采用单根网线最远可传输70/100米, …