如何实现简单的ip反爬

在之前的博客中,我有分享过如何进行ip池的代理,下面分享反爬技术之一的ip反爬

用nodejs的koa简单演示一下

复制代码
import Koa from "koa"
import Router from "koa-router"
const app: Koa = new Koa();


const router: Router = new Router();

// 假设这里是ip请求的数据池
interface IpDataType {
    startTiem: number, // 第一次访问的时间
    requestTimes: number, // 10分钟之内访问的次数
}

let ipMap: { [key: string]: IpDataType } = {};

router.get('/testip', (ctx: Koa.Context, next) => {
    // 获取ip
    let ip: string = ctx.request.ip;
    let now: number = new Date().getTime();
    // 判断ip有没有请求过
    if (!ipMap[ip]) {
        ipMap[ip] = {
            startTiem: now,
            requestTimes: 1,
        }
    } else {
        ipMap[ip].requestTimes++;
    }
    // 判断10分钟之内有没有超过请求100次,如果有就直接屏蔽
    if (now - ipMap[ip].startTiem <= 10 * 60 * 1000 && ipMap[ip].requestTimes >= 100) {
        ctx.body = "ip已超过请求次数"
        return;
    }
    // 保底逻辑,如果距离上次请求的时间超过10分钟则重置数据,以防错封
    if (now - ipMap[ip].requestTimes <= 10 * 60) {
        ipMap[ip] = {
            startTiem: now,
            requestTimes: 1,
        }
    }
    ctx.body = "成功"
});

app.use(router.routes())
app.listen(3000, "0.0.0.0")

ip数据池

复制代码
// 假设这里是ip请求的数据池
interface IpDataType {
    startTiem: number, // 第一次访问的时间
    requestTimes: number, // 10分钟之内访问的次数
}

let ipMap: { [key: string]: IpDataType } = {};

这个是用来存储已经请求过的ip数据,用来做后续的判断

这里是简单用变量来代表ip请求数据池,一般大项目的ip请求数据池都是放在redis或者mysql中的

反爬原理

复制代码
// 获取ip
    let ip: string = ctx.request.ip;
    let now: number = new Date().getTime();
    // 判断ip有没有请求过
    if (!ipMap[ip]) {
        ipMap[ip] = {
            startTiem: now,
            requestTimes: 1,
        }
    } else {
        ipMap[ip].requestTimes++;
    }
    // 判断10分钟之内有没有超过请求100次,如果有就直接屏蔽
    if (now - ipMap[ip].startTiem <= 10 * 60 * 1000 && ipMap[ip].requestTimes >= 100) {
        ctx.body = "ip已超过请求次数"
        return;
    }

这里的反爬原理是,一定时间内,访问次数超过一定数量之后就进行禁止请求了,因为很多爬虫程序都是并发爬取的,而正常用户是达不到这么高的请求数量的,所以这个是策略之一

python演示爬虫过程

复制代码
def requestIp():
    for i in range(1000):
        try:
            data = requests.get("http://192.168.3.5:3000/testip");
            print(data.text)
        except Exception as e:
            print("请求报错:" + str(e));
            pass;

if __name__ == "__main__":
    requestIp();

这里就是短时间内请求很多次的爬虫程序,运行过程中可以发现后面的请求都无法得到一个正常的数据了

其他反爬手段

1、请求数据加密,根据一定的规则将参数加密,然后加密字符串在放在请求头中,这样的方式能对一些初级爬虫工程师有一定作用,对于会js逆向的工程师来说是没用的

2、账号反爬,对于一些接口是要登录才能请求的,这个时候针对账号短时间内请求次数的判断是不是爬虫,这个是我用过比较好用的方式了

相关推荐
z2023050831 分钟前
RDMA之RoCEv2 无损网络PFC 、DCQCN 和ECN (7)
linux·服务器·网络·人工智能·ai
不吃土豆的马铃薯34 分钟前
Spdlog 入门:日志记录器与日志槽基础详解
服务器·开发语言·c++·c·日志·spdlog
凯瑟琳.奥古斯特42 分钟前
传输层核心功能解析
开发语言·网络·职场和发展
我星期八休息43 分钟前
Linux系统编程—库制作与原理
linux·运维·服务器·数据结构·人工智能·python·散列表
William.csj1 小时前
服务器——交互式 NVIDIA GPU 监控工具
运维·服务器
大明者省1 小时前
Ubuntu22.04 宝塔面板与 XFCE 远程桌面端口兼容性分析
运维·服务器·数据库·笔记
jiayong231 小时前
前端面试题库 - 浏览器与网络篇
前端·网络·面试
Harm灬小海1 小时前
【云计算学习之路】学习Centos7系统-Linux软件包管理
linux·运维·服务器·学习·云计算·yum·rpm
pengyi8710152 小时前
共享 IP 防封维护策略,降低被封率、延长 IP 寿命
网络·网络协议·tcp/ip
189228048612 小时前
NY379固态MT29F32T08GSLBHL8-36QA:B
大数据·服务器·人工智能·科技·缓存