谁在爬我的网站?我要“炸”了他

news2024/11/25 7:36:39

如果你曾经搭建过自己的网站,那么你一定对网络爬虫感到无比的烦恼。这些爬虫每天都在大量的访问你的网站,频繁且毫无节制地消耗你的服务器资源。那么,今天我们就来探讨一下,如何“干死”这些爬虫的服务器。

注意:本文所讨论的内容仅供技术交流,不涉及任何违法行为。

首先,我们需要明确一点:如果一个爬虫每天都在访问你的网站,那么你一定有一些方法来识别出这个爬虫。最常见的方法就是通过分析请求的来源IP或者User Agent。一旦你能够确定一个请求是来自爬虫,你就可以开始给你的爬虫上一课了。

我们知道,很多网络爬虫都是使用Python的Requests库来发送网络请求的。如果你仔细阅读过Requests的文档,那么你可能已经注意到,Requests会自动处理gzip和deflate等传输编码的解码。

当你的网站使用gzip对一些较大的资源进行压缩后传输时,客户端(如浏览器或Requests库)在接收到返回的数据后会自动进行解压缩。这个过程对用户来说是透明的,不需要他们手动进行解压缩。

这个功能原本是为了方便开发者而设计的,但我们可以反过来利用这个特性来“玩弄”那些爬虫。以下是如何在Python中使用这个方法来测试返回gzip压缩数据的方法:

在HTTP响应中使用gzip压缩数据时,要确保在响应头中包含正确的Content-Encoding头。在这种情况下,我们故意将Content-Encoding设置为gzip,但实际上我们并不真正对数据进行压缩。这样做的目的是为了让爬虫误以为我们返回的数据是经过gzip压缩的。

当爬虫收到这个响应后,它会自动对数据进行解压缩。然而,因为实际上数据并没有被压缩,所以解压缩操作将无法正常进行。这样,爬虫最终得到的数据将是一片混乱,毫无用处。

通过这种方式,我们可以让爬虫浪费大量的CPU资源去尝试解压根本就没有被压缩的数据。如果这个方法被大规模地实施,那么爬虫的服务器将会被大量的无效解压缩操作拖垮,最终达到“干死”它们服务器的目的。

当然了,在实际操作中,我们还需要考虑一些其他的因素,例如如何防止误伤非爬虫的客户端、如何在实施这种策略的同时不影响正常用户的访问体验等。但是,这个方法至少可以作为一个起点,帮助我们更好地对抗那些无良的网络爬虫。

我首先在硬盘上创建一个文本文件text.txt,里面有两行内容,如下图所示:

然后,我是用gzip命令把它压缩成一个.gz文件:

cat text.txt | gzip > data.gz

接下来,我们使用FastAPI写一个HTTP服务器server.py

然后使用命令uvicorn server:app启动这个服务。

接下来,我们使用requests来请求这个接口,会发现返回的数据是乱码,如下图所示:

返回的数据是乱码,这是因为服务器没有告诉客户端,这个数据是gzip压缩的,因此客户端只有原样展示。由于压缩后的数据是二进制内容,强行转成字符串就会变成乱码。

现在,我们稍微修改一下server.py的代码,通过Headers告诉客户端,这个数据是经过gzip压缩的:

修改以后,重新启动服务器,再次使用requests请求,发现已经可以正常显示数据了:

这段代码的演示已经让我们领略了服务器如何告知客户端返回数据是经过gzip压缩的。那么,我们如何利用好这个功能呢?这就需要深入理解一下压缩文件的原理。

你知道吗?文件之所以可以被压缩,其实是因为它们里面有很多重复的元素。而压缩算法,就是通过一种巧妙的方式来找出并简化这些重复,从而使文件变得更小。当然,不同的压缩算法有不同的实现方式和效果。但我们可以用一个简单的小例子来形象地说明它是如何工作的。

咱们来想象一下,假如有一串192个字符的文本,里面全是“1”,这时我们用5个字符来表示它:“192个1”。哈哈,是不是超级省空间,压缩率高达惊人的97.4%!

再想象一下,如果有一个1GB的文件,我们把它压缩成1MB,那是不是意味着服务器只需要返回1MB的二进制数据就行了?这对服务器来说当然毫无压力。但问题是,当客户端或爬虫拿到这个1MB的数据后,它会在内存中解压成原来的大小,也就是1GB。结果就是,爬虫占用的内存瞬间增加了1GB!要是原始数据再大点,搞不好就直接把爬虫所在服务器的内存给榨干了。可不是闹着玩的,轻则服务器直接干掉爬虫进程,重则直接死机!

你可能会想,这个压缩比会不会太不靠谱了?告诉你,其实要生成这种压缩文件,我们只需要简单输入一行命令就行,真的有这么神奇!

执行结果如下

生成的这个boom.gz文件只有995KB。但是如果我们使用gzip -d boom.gz对这个文件解压缩,就会发现生成了一个1GB的boom文件,如下图所示:

只要大家把命令里面的count=1000改成一个更大的数字,就能得到更大的文件。

我现在把count改成10,给大家做一个演示(不敢用1GB的数据来做测试,害怕我的Jupyter崩溃)。生成的boom.gz文件只有10KB:

服务器返回一个10KB的二进制数据,没有任何问题。

现在我们用requests去请求这个接口,然后查看一下resp这个对象占用的内存大小:.

可以看出,由于requests库会自动对返回数据进行解压缩,所以最终得到的resp对象竟然有10MB之多!

大家在使用这种方法时,一定要先确定请求确实是爬虫发出的,再使用哦。否则,不慎把真实用户误认为是爬虫,那就麻烦了。

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

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

相关文章

2023高教社杯数学建模C题思路代码 - 蔬菜类商品的自动定价与补货决策

# 1 赛题 在生鲜商超中,一般蔬菜类商品的保鲜期都比较短,且品相随销售时间的增加而变差, 大部分品种如当日未售出,隔日就无法再售。因此, 商超通常会根据各商品的历史销售和需 求情况每天进行补货。 由于商超销售的蔬菜…

如何配置群辉相册Synology Photos实现公网访问并与朋友共享照片

文章目录 前言本教程解决的问题是:按照本教程操作完成能够达到的效果是:1.在群辉中下载并安装Synology Photos套件2.设置共享文件夹3.添加您想共享的照片4.cpolar搭建隧道5.公网ip地址访问您的分享相册6.移动端app使用公网上传照片并及时分享 前言 很多…

谷粒商城----Nginx篇

一、正向代理和反向代理 🚩正向代理和反向代理是两种常见的代理服务器模式,用于在网络通信中起到中介的作用。 🏴正向代理(Forward Proxy): 正向代理是在客户端和目标服务器之间充当中介的代理服务器。客…

ADW300物联网电表支持MODBUSTCP协议、MQTT协议-安科瑞黄安南

摘要 随着通信技术的应用越来越广泛,具有通信功能的电子产品越来越多,同时也随着Wi-Fi无线覆盖网络区域的形成,如何利用无线网络覆盖广、带宽高、低使用费率的优势组建物联网系统,变成了一个很实际的问题。 安科瑞也紧跟趋势推出…

旅游需求井喷,抖快书强势涌入,OTA如何制胜下半场?

文 | 螳螂观察 作者 | 图霖 自年初起就逐步恢复的旅游行业,这个暑期迎来意料之中的小高潮。 显著表现是,携程、同程等头部OTA平台迎来订单量大涨。 携程发布的数据预订大数据显示,截至6月14日,平台的暑期亲子订单量同比去年超…

vue3:22、vue-router的使用

import { createRouter, createWebHistory } from vue-router//history模式:createWebHistory //hash模式:createWebHashHistory//vite中的环境变量 import.meta.env.BASE_URL 就是vite.config.js中的base配置项 const router createRouter({history:…

Web3 游民工作机会大放送,高薪岗位职等你来!

近年来,随着互联网、制造业、房地产等行业发展的转型,大量投资机构开始将眼光转向 Web3 赛道,助推初创项目实现从 0 到 1 的发展与蜕变。据 Crunchbase 综合数据统计显示,目前 Web3 行业有 19,182 家公司,总融资高达 8…

MATLAB实现数据插值

目录 一.理论知识 二.一维插值实例 三.二维插值实例 一.理论知识 所谓插值,顾名思义,插入数值。很多时候,我们仅有离散点上的数据,这时如果我们想要分析变量之间的函数关系,则无法实现。但如果通过插值处理&#xf…

工单管理系统有什么作用?如何告别“走流程式”巡检!

在学校的安保、设备巡检、IT机房设备维护以及酒店民宿客房服务等方面,由于管理跟不上,巡查人员容易出现态度松散的问题。这会导致漏检和错巡等“走流程式”巡查现象的出现。管理层对于巡查情况的了解也不够全面,等到出现问题时,往…

期权有什么投资价值?投资期权风险大吗?

期权投资风险是比较大的。首先要求至少赚2个点以后才能保本,低于这个点期权手续费就收不回来了。然后因为自带杠杆交易的特性,其交易风险比期货及股票更大,下文介绍期权有什么投资价值?投资期权风险大吗? 期权合约杠杆化越大&…

LeetCode-17-电话号码的字母组合

一:题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 二:示例与提示 示例 1:…

OpenVINO实验说明

文章目录 0. 注1. 使用环境2. OpenVINO 1. 安装OpenVINO1. 安装虚拟环境平台2. 创建虚拟环境3. 下载OpenVINO notebook4. 安装依赖 2. 重训练1. 下载yolov7源码2. 修改配置文件2.1 weights2.2 cfg2.3 data2.4 epochs2.5 img-size2.6 batch-size2.7 device2.8 可能出现的错误2.8…

Java程序员所需Javascript知识

它是一种脚本语言&#xff0c;可以用来更改页面内容&#xff0c;控制多媒体&#xff0c;制作图像、动画等等 js 代码位置 <script>// js 代码 </script>引入 js 脚本&#xff0c;在js脚本中写js代码 <script src"js脚本路径"></script>注…

如何查看APK的MD5签名及无法显示MD5签名的解决办法

https://blog.asroads.com/post/3358e0c4.html 之前的文章内已经介绍了不少的关于Android环境下出Apk 包遇到的各种填坑操作&#xff0c;以及一些设置小技巧&#xff0c;但坑是未知的&#xff0c;今天又踩一个坑&#xff0c;这次的问题是和电脑环境有关的。于是下面记录一下。 …

HotSpot垃圾收集算法实现细节

文章目录 根节点枚举安全点安全区域记忆集与卡表写屏障三色标记 根节点枚举 在可达性分析算法中&#xff0c;由于GC Roots众多&#xff0c;所以在从GC Roots集合中进行引用链查找时会耗费大量时间。 迄今为止&#xff0c;所有收集器在根节点枚举这一步骤时都是必须暂停用户线…

CS420 附加篇笔记 P1 - 如何寻找基址、偏移、实体的地址和指针

文章目录 IntroHealth variableEntityHow cheat engine worksWhat is an object / a classStatic addressesPointersRelative addressesSummary Intro 这一篇进入了进阶内容&#xff0c;讲的内容也变得即有广泛又有深入&#xff0c;推荐有一定基础和实践或者编程经验的观看&…

【MongoDB】Ubuntu22.04 下安装 MongoDB | 用户权限认证 | skynet.db.mongo 模块使用

文章目录 Ubuntu 22.04 安装 MongoDB后台启动 MongoDBshell 连入 MongoDB 服务 MongoDB 用户权限认证创建 root 用户开启认证重启 MongoDB 服务创建其他用户查看用户信息验证用户权限删除用户 skynet.db.mongo 模块使用authensureIndexfind、findOneinsert、safe_insertdelete、…

关于灾备系统中滚动备份是什么?

备份可以为数据提供安全性和某种形式的“撤销”功能&#xff0c;减少甚至消除不稳定性和风险。最常见的备份类型是完全备份和增量备份。但是&#xff0c;如果您需要频繁的、实时的备份&#xff0c;那么滚动备份就是一种更好的方法。 滚动备份&#xff1a; 在可接受的时间间隔…

ArcGIS 10.8软件安装包下载及安装教程

【软件名称】&#xff1a;ArcGIS 10.6 【安装环境】&#xff1a;Windows 【下载链接 】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1wKpTeiFdhMBmbRWrJRCsoA 提取码&#xff1a;0987 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 软件简介 ArcGIS D…

手术麻醉管理系统源码的开发及应用

手术麻醉管理系统针对麻醉科、手术室和外科病房开发&#xff0c;用于管理与手术麻醉相关的信息&#xff0c;实现有关数据的自动采集、报告的自动生成以及病历的电子化&#xff0c;是医院信息系统的一个重要组成部分。采集和管理的数据包含患者的手术信息、麻醉信息&#xff0c;…