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

2023-11-01

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

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

首先,我们需要明确一点:如果一个爬虫每天都在访问你的网站,那么你一定有一些方法来识别出这个爬虫。最常见的方法就是通过分析请求的来源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之多!

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

谁在爬我的网站?我要“炸”了他 的相关文章

随机推荐

  • Windows环境下编译C++版的MXNet问题处理

    最近涉及要在c 上部署人脸检测的算法 要在Windows环境下编译运行MXNet 对于不熟悉c 的小白的我真是一件又让人抓狂又掉头发的事情 网上关于c 的部署的帖子少之又少 加上又是第一次摸这些东西 所以出现的bug真的数不胜数 写这个bl
  • 数据结构与算法之二叉树: Leetcode 145. 二叉树的后序遍历 (Typescript版)

    二叉树的后序遍历 https leetcode cn problems binary tree postorder traversal 描述 给你一棵二叉树的根节点 root 返回其节点值的 后序遍历 示例 1 输入 root 1 null
  • 适合普通大学生的前端开发学习路线

    大家好 我是帅地 假如你没有明确的目标 或许可以按照我说的学习路线来学习一波 我写的每一份学习路线 不会很全面 因为我认为 东西列的太多 反而不利于新手的学习 所以我列举的 都是比较必要的知识 当你把这些知识学了的时候 我相信你不需要别人的
  • 前端基础_使用moveTo与lineTo路径绘制火柴人

    使用moveTo与lineTo路径绘制火柴人 接下来看一下除了arc方法以外 其他使用路径绘制图形时会使用到的方法 moveTo x y 不绘制 只是将当前位置移动到新的目标坐标 x y lineTo x y 不仅将当前位置移动到新的目标坐
  • 工控CTF(wp)

    GUET工控CTF 所见非真 异常的流量分析 黑客的攻击 黑客的大意 丢失的数据 凯撒的秘密 工程的秘密 S7协议分析 轻松时刻 打不开的压缩包 失控的遥控 病毒文件分析 OPC协议分析 sign in 随意记录一下这次CTF的解题步骤 比
  • 文章详情页 - 评论功能的实现

    目录 1 准备工作 1 1 创建评论表 1 2 创建评论实体类 1 3 创建 mapper 层评论接口和对应的 xml 实现 1 4 准备评论的 service 层 1 5 准备评论的 controller 层 2 总的初始化详情页 2 1
  • The Open Group 参考卡|《ArchiMate® 3.1 规范》中文版正式发布

    ArchiMate 规范 3 1 版在 3 0 1 版之间做了如下改动 增加了新的策略元素 价值流 为关联关系添加了可选的指示标记 改进了元模型和相关图形的组织结构 进一步完善和规范了关系的推导 除此之外 ArchiMate 规范 3 1
  • 全球及中国微电网市场规模容量及建设运营模式分析报告2021年版

    全球及中国微电网市场规模容量及建设运营模式分析报告2021年版 HS HS HS HS HS HS HS HS HS HS HS HS 修订日期 2021年11月 搜索鸿晟信合研究院查看官网更多内容 第一章 微电网相关概述 1 1 微电网概
  • pandas 取excel 中的某一列_别找了,这是 Pandas 最详细教程了

    点击上方 菜鸟编程大本营 选择 星标 公众号 重磅干货 第一时间送达 来源 机器之心 Python 是开源的 它很棒 但是也无法避免开源的一些固有问题 很多包都在做 或者在尝试做 同样的事情 如果你是 Python 新手 那么你很难知道某个
  • MySQL 如何优化慢查询?

    一 前言 在日常开发中 我们往往会给表加各种索引 来提高 MySQL 的检索效率 但我们有时会遇到明明给字段加了索引 并没有走索引的Case 进而导致 MySQL 产生慢查询 严重场景下 甚至出现主从延迟 数据库拖垮的极端事故 本文梳理出索
  • 用Python采集Notion数据

    使用 Python 采集 Notion 数据的方法 首先 你需要在 Notion 网站上申请一个 API key 具体方法可以参考这篇文章 https developers notion com docs getting started s
  • 驱动开发,stm32mp157a开发板的led灯控制实验(再优化),使用ioctl函数,通过字符设备驱动分步注册方式编写LED驱动,完成设备文件和设备的绑定

    1 实验目的 编写LED灯的驱动 在应用程序中编写控制LED灯亮灭的代码逻辑实现LED灯功能的控制 2 LED灯相关寄存器分析 LED1 gt PE10 LED1亮灭 RCC寄存器 4 gt 1 0X50000A28 GPIOE MODER
  • 采用冒泡排序的方法将数组中的元素从小到大进行排序

    include
  • QT生成动态链接库.so文件

    首先是新建一个工程 选择C 库 打开后是这样的 然后输入新建的名称 下一步 记得勾选Qtcore那个 就是默认的那个 否则编译似乎不能通过 因为后面自动生成的 h文件里还有这个 自动生成的有4个文件一个pro 一个cpp 一个XXX h文件
  • 【darknet yolo】could not open file xx.cfg

    错误图如上 原因 data文件的编码不对 用notepad 打开发现 错误的 正确的 发现错误的比正确的每行换行的时候多了一个cr 解决 ubuntu下安装dos2unix 然后转换下 dos2unix 52 data
  • 面试题:Spring常见的一些面试题与答案

    Spring是Java开发领域中最流行的框架之一 广泛应用于企业级应用的开发 在面试中 面试官经常会问及与Spring相关的问题 以考察面试者对Spring框架的理解和应用能力 本文将介绍一些常见的Spring面试题 并提供详细的解答和实际
  • PID参数解析+调参经验笔记(经验法)

    在最前面推荐一个大佬的讲解 真的很浅显易懂 建议先看了解大概PID 链接 ps 2022 1 2更新pid通俗理解 out speed p err d now speed pid最核心算法 运动员参加100米跑步 假设这个人可以瞬间提速 但
  • 关于==和equals的区别和联系,面试这么回答就可以

    长篇大论的话 我这里就不多写了 相信大家入门java 的时候就知道个大概了 这里想表述的是 如果面试官问你 关于 和equals的区别 该怎么回答完美呢 可以这样说 总结的来说 1 对于 比较的是值是否相等 如果作用于基本数据类型的变量 则
  • vcomp140.dll丢失怎样修复?多种方法教你修复

    vcomp140 dll丢失算是一个比较常见的异常事件 在使用电脑的时候 有时候弹窗出现由于找不到vcomp140 dll 无法继续执行代码等 这种都是属于vcomp140 dll文件丢失 今天我们主要针对这个情况来给大家说说vcomp14
  • 谁在爬我的网站?我要“炸”了他

    如果你曾经搭建过自己的网站 那么你一定对网络爬虫感到无比的烦恼 这些爬虫每天都在大量的访问你的网站 频繁且毫无节制地消耗你的服务器资源 那么 今天我们就来探讨一下 如何 干死 这些爬虫的服务器 注意 本文所讨论的内容仅供技术交流 不涉及任何