如何通过限制 IP 相关信息 | 控制用户访问站点频率

文章目录

  • 通过 IP 限制反爬
    • 实验介绍
        • 知识点
        • 课程环境
    • IP 限制实战
        • 用 Nginx 限制特定 IP
        • 关于 allow 和 deny 的使用说明
        • Nginx 限制 IP 访问频率
        • Python Flask 模拟 IP 黑名单
    • 实验总结

通过 IP 限制反爬

实验介绍

在常规的反爬手段中,IP 限制是应用广泛且比较有效的,但其存在一定的 误杀,因同一 IP 下可能不止一位用户。本实验从 Nginx 限制特定 IP 的配置开始学习,然后扩展到限制 IP 访问频次,最后通过文本文件模拟了黑名单 IP 库限制爬虫 IP 这一技术点。

知识点

  • Nginx 限制 IP 访问
  • Nginx 控制 IP 访问频次
  • 用 Python Flask 配合黑名单限制 IP

写python爬虫,你永远绕不过去代理问题

课程环境

蓝桥提供的 Ubuntu20+ 系统,系统内置 Nginx,内置 sublime text3 编辑器,Python3+ 版本。

课程实战参见 玩转 16 种反爬虫技巧

IP 限制实战

用 Nginx 限制特定 IP

首先学习利用 Nginx 配置限制特定 IP 访问我们的站点,限制 IP 有两种机制,即黑/白名单

  • 黑名单:在名单中的 IP 无法访问;
  • 白名单:在名单中的 IP 可以访问。

反爬中常见的是应用 IP 黑名单技术,假设你的网站安全等级较高,可以启用 IP 白名单机制。

下面为大家详细说明黑名单机制。

为了配合 Nginx 配置,先使用 Python Flask 获取一下蓝桥系统中本地环境的 IP。

在 Code 目录中中创建一个新目录 03_demo,然后创建 index.py 文件,输入如下代码。

import logging
from flask import Flask, render_template, requestapp = Flask(__name__)@app.route('/')
def index():ip = request.remote_addrlogging.debug(ip)return render_template('index.html', user_ip=ip)if __name__ == '__main__':# 注意蓝桥环境不能使用 80 端口,会出现异常app.run(host="0.0.0.0", port=8080)

在项目根目录 templates 中新建 index.html 文件,然后输入如下代码:

<!DOCTYPE html>
<html><head> </head><body><div class="container"><div class="header"><h3 class="text-muted">获取用户IP</h3></div><hr /><div>IP 地址是: <strong>{{user_ip}}</strong><hr /></div></div></body>
</html>

运行代码得到如下内容,由于 Flask 运行后可以使用两个 IP 地址访问,即 127.0.0.1192.168.42.3 ,所以后续限制 IP 时,也可以拿这两个 IP 下手。

图片描述

到这里我们获取到了本地 IP,接下来就可以在 Nginx 中进行限制了。

打开 /etc/nginx/conf.d/default.conf 文件,然后参考下图进行配置。

location / {root   /usr/share/nginx/html;index  index.html index.htm;allow  192.168.42.3;deny all;
}

配置输入位置截图:

图片描述

修改 default.conf 文件之后,注意重新加载配置文件,命令如下:

# 重新加载配置
sudo /etc/init.d/nginx reload

接下来在 终端 使用 wget 关键字进行测试。

# 测试 127.0.0.1
wget http://127.0.0.1# 测试 192.168.42.3
wget http://192.168.42.3

得到的结果如下所示:

图片描述

由于我们设置了仅允许(allow)IP 地址为 192.168.42.3 时,才可以访问目标站点,所以第一次请求 127.0.0.1 时,系统返回 403 禁止。

关于 allow 和 deny 的使用说明

屏蔽操作的关键字是 deny

屏蔽单个 IP

deny 127.0.0.1;

屏蔽多个 IP

deny 127.0.0.1;
deny 127.0.0.1;

屏蔽全部 IP

deny all;

屏蔽 IP 段访问

# deny ip/mask
# 屏蔽 192.0.0.0 到 192.255.255.254 访问的命令
deny 192.0.0.0/8;# 屏蔽 192.168.0.0 到 192.168.255.254 访问的命令
deny 192.168.0.0/16;#屏蔽 192.168.6.1 到 192.168.6.254 访问的命令
deny 192.168.6.0/24;

扩展知识点 192.168.0.0/16 为 CIDR 的表示语法,学有余力的同学可以继续学习一下。

此时你应该发现,如果 IP 地址过多,每次都屏蔽一个会非常繁琐,因此 blockip.conf 就出现了,它可以一次屏蔽多个 IP,而且在单独文件配置。

blockip.conf 文件需创建在 default.conf 同目录 /etc/nginx/conf.d/ 中,所以提前修改该目录读写权限。

sudo chmod 777 /etc/nginx/conf.d/

图片描述

blockip.conf 文件内容如下所示:

allow  192.168.42.3;
deny all;

保存之后在 default.conf 导入该文件即可。

include blockip.conf;

图片描述

修改配置之后,使用 sudo /etc/init.d/nginx reload 重新加载配置。

再次测试,发现与前文结果一致,证明导入配置文件已经生效。

允许操作的关键字是 allow

允许单个 IP

allow 127.0.0.1;

允许所有 IP

allow all;

其余内容与上文 拒绝 操作一致。

需要注意的事项

Nginx 配置会从上至下依次判断,写在前面的语句会屏蔽后续的语句,具体配置如下所示:

# 先禁止所有,后续允许的也无法访问
deny all;
allow 127.0.0.1;
allow 192.168.42.3;

图片描述

解决上述问题的方式就是,将允许的 IP 配置前置。

allow 127.0.0.1;
allow 192.168.42.3;
deny all;

图片描述

Nginx 限制 IP 访问频率

使用 Nginx 可以控制 IP 访问频率,涉及的两个配置,分别如下所示:

limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s;

该配置需要写到 /etc/nginx 目录中的 nginx.conf 文件内,具体位置如下所示:

图片描述

参数说明如下:

  • limit_req_zone :该变量用于限制请求频率,只能在 http 使用;
  • $binary_remote_addr:二进制远程地址;
  • zone=one:定义一个名称为 one 的记录区,总容量为 10 M;
  • rate:每秒的请求为 2 个(测试用,实战中适当调高)。

除了上述配置外,还需要在 default.conf 中的 location 块配置如下内容:

limit_req zone=one burst=3 nodelay;

参数说明如下:

  • zone=one :设置使用哪个配置区域来做限制,与上面 limit_req_zonename 对应;
  • burst=3burst 配置在这里,我们设置了一个大小为 3 的缓冲区,当有大量请求过来时,超过访问频次限制的请求,先放到缓冲区内等待,但不能超过 3 个,否则超过的请求会直接报 503 的错误然后返回,其中的 3 可自行设置;
  • nodelay :该参数表示超过的请求不被延迟处理。

图片描述

该配置完成后,需要重启 Nginx 服务,否则配置不生效。

sudo /etc/init.d/nginx restart

测试使用 Python 代码实现:

import requestsprint(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))
print(requests.get('http://127.0.0.1'))

运行代码之后,得到如下响应状态码,可以看到从第 5 个请求开始,返回的是 503,你可以修改上文提及的配置值,将其调大,然后继续模拟不同数量的请求。

图片描述

Python Flask 模拟 IP 黑名单

使用 Python 去限制 IP,最佳的解决方案是使用 Python + Redis,但本系列实验的重点是反爬逻辑,所以本实验用普通的 txt 文件代替 redis 存储。

首先在 03_demo 目录创建一个 ban.txt 文件,该文件记录 IP 黑名单数据,每行存储一个 IP 地址,例如:

127.0.0.1
183.247.199.114
183.247.211.50
……

接下来就可以在程序中读取该文件,然后通过判断请求端的 IP 地址是否存在于黑名单中,存在即返回 403 状态码。

在前文创建的 index.py 文件中编入下述代码。

import logging
from flask import Flask, render_template, requestapp = Flask(__name__)def get_ban_ip():with open('ban.txt',"r") as f:ip_list = f.readlines()# 去除空格,并转换为集合set_ip = {ip.strip() for ip in ip_list}return set_ip@app.route('/')
def index():# 获取客户端 IPip = request.remote_addrips = get_ban_ip()if ip in ips:# 判断 IP 是否在黑名单中,存在返回 403return "forbidden",403return render_template('index.html', user_ip=ip)if __name__ == '__main__':app.run(host="0.0.0.0", port=8080)

以上代码核心检测函数是 get_ban_ip(),它读取黑名单文件,并将其结果存储到集合中,然后通过 in 运算符进行检测。

运行代码之后,你可以分别访问下述请求地址,获取结果。

http://127.0.0.1:8080 # 被禁止
http://192.168.42.3:8080 # 可以访问

图片描述

实验总结

本实验前部分主要集中讲解了 Nginx 对于 IP 限制的相关配置,在反爬实战中可以作为应急使用,第二部分的 Python Flask + IP 黑名单更加通用一些,而且在实际工作中,你可以构建一个 IP 和请求次数的键值对,然后设置每 IP 每秒访问频次瓶颈,当超过设置预设值时,进行屏蔽。

实战中还会碰到一种场景,爬虫程序不断切换代理 IP 访问我们的服务器,此时你需要做的是尽力维护好 IP 黑名单库,并且将 IP 与频次控制进行合理结合,恰当的判定对方是否为爬虫,然后封禁。

IP 封禁很容易造成误伤,实战中要反复测试判定程序,尽量不放过一个爬虫程序,也不误伤一个正常用户。

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

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

相关文章

win11 报错 你的IT管理员已经限制对此应用一些区域的访问 解决方法

你的IT管理员已经限制对此应用一些区域的访问,你尝试访问的项目不可用。有关详细,请与你的IT支持人员联系。 1.按下wins&#xff0c;在框中输入cmd&#xff0c;右键管理员身份运行 2.在命令提示符中输入 reg add “HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Def…

wordpress开放注册和邮件问题解决

1开放注册 WordPress后台,设置-常规,勾选任何人都可以注册前面的复选框,新用户角色改为作者&#xff0c;保存即可开启。 2新用户注册收不到邮件问题解决 wordpress配置SMTP服务发送邮件(以qq邮箱为例) 第一步、配置邮箱&#xff08;这里介绍qq邮箱&#xff09; 我试过多个…

SLAM基础知识汇总【长期更新】

SLAM基础知识汇总 特征点相关 特征点由关键点和描述子构成&#xff1a; 关键点&#xff1a;特征点在图像里的位置描述子&#xff1a;通常是一个向量&#xff0c;描述了该关键点周围的信息&#xff0c;朝向大小等 [ORB-SLAM2] ORB-SLAM中的ORB特征&#xff08;提取&#xff…

国科大数字图像处理(复习与整理)

图像处理复习笔记&#xff1a; 1、证明一个系统是线性系统2、证明函数卷积的傅里叶变换等于函数傅氏变换后的乘积3、采样定理与混叠4、直方图均衡化第一节课知识点第二节课知识点第三节课知识点第四节课知识点第五节课知识点第六节课知识点第七节课知识点第八节课知识点第九节课…

3D视觉感知新SOTA BEVFormer复现nuscenes数据集测试demo

0 写在前面 分享最近在BEV感知方面的工作&#xff0c;欢迎自动驾驶同行交流学习&#xff0c;助力自动驾驶早日落地。 1.概述 对于自动驾驶而言&#xff0c;BEV&#xff08;鸟瞰图&#xff09;下的目标检测是一项十分重要的任务。尽管这项任务已经吸引了大量的研究投入&#…

CCF认证202305-1重复局面

题目背景 国际象棋在对局时&#xff0c;同一局面连续或间断出现3次或3次以上&#xff0c;可由任意一方提出和棋。 问题描述 国际象棋每一个局面可以用大小为 的字符数组来表示&#xff0c;其中每一位对应棋盘上的一个格子。六种棋子王、后、车、象、马、兵分别用字母 k、q、…

地鼠君黑盒测试--小白如何梳理需求,告别听不懂

没有需求文档的痛苦 刚开始作黑盒&#xff08;功能&#xff09;测试时&#xff0c;小白难免会遇到这种情况&#xff0c;就是需求梳理不清晰&#xff0c;没有需求文档或者需求文档太简单。这种一开始没人带时&#xff0c;不容易发觉后续测试多痛苦。 笔者一开始时&#xff0c;就…

记一次购买海外服务器的经历和python包管理小记

概述 最近在研究ChatGPT&#xff0c;需要有个服务器一直挂着&#xff0c;刚好看到raksmart在搞活动&#xff1b; 可以关注下&#xff0c;他们的活动页面 https://billing.raksmart.com/whmcs/index.php?rp%2Fannouncements&languagechinese-cn 刚好四月&#xff0c;有便…

No signature of method: build_*.android() is applicable for argument types

意思很直观&#xff1a;就是build的时候&#xff0c;android()的参数错误。 更新android studio 后出现这种问题&#xff0c;主要是新版本的生成的app和module模版有所变化引起的。 Android Studio Electric Eel | 2022.1.1 Patch 1 Build #AI-221.6008.13.2211.9514443, built…

01 Faster R-CNN系列

目录 一、 R-CNN 1. R-CNN流程&#xff08;4个步骤 &#xff09; 2. RP的确定 3. 预训练模型微调&#xff08;backbone&#xff09; 4. SVM的分类 5. bbox regression的训练 6. NMS 二、 Fast R-CNN 1. Fast R-CNN算法流程 2. 候选区域生成 3. 预训练模型微调&#…

ChatGPT API 遇见 Tistory:自动化英语学习博客

这是通过集成 ChatGPT API 创建自动化英语学习内容系列中的第三部分。 转发: ChatGPT API Meets Tistory: The Automated English Learning Blogs 项目介绍 介绍 这是通过集成 ChatGPT API 创建自动化英语学习内容系列中的第三部分。 我正在尝试整合各种平台。 第一个是 Se…

cahtgpt算法压力测试(丁真版,更新gpt4(暴风哭泣了已经))

更新 补充了gpt-4版本的答案&#xff0c;只能说牛逼&#xff0c;我收回之前的替代不了高级科研工作者的结论&#xff0c;话不多说上答案&#xff1a; 可以看到这里已经吊打got3.5了&#xff0c;它能把这个问题解释的很清楚了 那么关于GPF算法和varimax的关系呢 可以看到gpt3…

连音乐都可以创作!Google AI部门推出交互式体验

机器学习也能应用在音乐上吗&#xff1f;Google AI部门的Magenta研究项目PAIR计划团队打造出第一个由AI驱动的Doodle服务&#xff0c;Doodle为一项交互式体验&#xff0c;让用户自行创造一段旋律&#xff0c;按下和声演奏&#xff08;Harmonized&#xff09;的按钮后&#xff0…

现在程序员的工资是不是被高估了?

图片来源&#xff1a;AIGC 文章来源&#xff1a;www.zhihu.com/question/295009798 韩冬 不是程序员的工资被高估了。而是在中国&#xff0c;IT行业是少有的劳动者议价能力强&#xff0c;能够比较公平的和资方分配公司收入的行业。 最近三十年我国经济突飞猛进&#xff0c;GDP从…

im即时通讯开发/聊天软件系统/社交APP源码搭建/私有化部署聊天原生开发源码快速搭建

由IM技术专家打造的基于 Java 实现的即时通讯&#xff08;IM&#xff09;项目 我们提供私有化即时通讯解决方案&#xff0c;独立部署在您自己的服务器上、代码可以开源、支持二次开发、苹果端上线指导&#xff0c;源码出售&#xff0c;提供远程技术指导&#xff0c;全程指导服务…

微分销机制设计_免费快速搭建微信分销商城_OctShop源码

现在微信的流量以及用户基数的庞大&#xff0c;让很多企业或商家都想在微信里面分一杯羹。搭建一个微信分销商城是一个很明智的选择&#xff0c; 而一个比较完善的商城系统,它的设计与开发是庞大复杂的系统工程&#xff0c;比较耗时耗财。 如何快速免费搭建一个大型专业级的微信…

全新开源微商城源码带分销 支持多端+搭建部署教程

分享一个全新版开源微商城源码带分销功能&#xff0c;支持10终端合一&#xff0c;功能强大&#xff0c;含完整代码程序包和搭建部署教程。 系统特色功能一览&#xff1a; 1、一个后台管理所有设备端&#xff0c;支持&#xff1a;电脑H5手机微信ipad微信小程序支付宝小程序百度…

股票左侧交易策略

文章目录 1.散户炒股常见问题1.1.满仓、重仓操作1.2.一买就跌一卖就涨-反复被洗1.3.追高被套1.4.持股数量过多1.5.过分迷恋技术分析1.6.不会逆向思考1.7.没有自己成型的操作策略 2.认识市场、认识主力、认识自己2.1.认识市场2.1.1.A股的本质是政策市 2.1.2.A股的本质是圈钱市2.…

外汇经典交易策略,最基本的趋势跟踪策略

在所有的经典交易策略中&#xff0c;趋势跟随策略可以说是非常主流的策略&#xff0c;趋势跟随策略一直是盈利能力非常强的交易的策略&#xff0c;往往可以出现较大盈利的策略一般都有趋势跟随的影子&#xff0c;毕竟交易的一条基本准则就是&#xff1a;顺势而为。下面我们介绍…

股票打板策略分析

股票打板策略分析 这里我们只分析一件事情&#xff0c;就是如何打板才能最大概率赚到钱&#xff0c;就是我们可以分析过去一天涨停今天还涨停、分析过去两天涨停今天涨的概率&#xff0c;一直到过去10天涨停今天涨的概率&#xff0c;其实很多人都喜欢打板&#xff0c;但是可能…