运维工作中对反爬虫的一些思考

最近运维工作中单位的网站被攻击,我们的反爬虫系统已经比较严格了,突然有5个用户登录30多万次经我们查找发现,用户是正常登录,这一异常被我们的技术部门捕捉到第一时间响应,没想到常规架构已经不足以应付现在的技术了,对反爬虫做一个总结。

文章目录

    • 一、事件起由
    • 二、爬虫类型
      • 1、身份伪装
      • 2、降低主IP访问频率
    • 三、编写基础爬虫原理
      • 1、分析页面请求格式
      • 2、构建合适的HTTP请求
      • 3、批量发送HTTP请求并获取数据
    • 四、编写高级爬虫原理
      • 1、分布式爬虫
      • 2、模拟JavaScript
      • 3、使用PhantomJS
    • 五、不同级别爬虫的优缺点分析
    • 六、反爬虫系统设计的常规架构
      • 1、对访问量进行统计,并封锁超过阈值的单个IP地址
      • 2、对访问量进行统计,并封锁超过阈值的单个会话(session)
      • 3、对访问量进行统计,并封锁超过阈值的单个用户代理(userAgent)
      • 4、组合使用
    • 七、总结

一、事件起由

门户网站的登录页面突然加载时间变成原来的4到5倍,部门快速响应,排查原因,没有被异常攻击,后来发现5个正常登录的用户登录次数过于频繁,明显不是人类能达到的手速,而我们的网站还有图片验证,这是有意而为的爬虫行为,所以我们部门快速响应,指定方案。
在这里插入图片描述

二、爬虫类型

1、身份伪装

自定义Headers请求

request = urllib.request.Request(url,headers=head)
  • user-agent修改:修改存储的系统和浏览器的型号版本信息
  • referer修改:不直接发起请求,修改检查请求的来源URL
  • cookie修改:观察需爬虫网站的Cookie格式,并进行伪造
headers = {'Referer':'https://accounts.pixiv.net/loginlang=zh&source=pc&view_type=page&ref=wwwtop_accounts_index',#如某些网站(如p站)要检查referer,就给他加上'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'#每个爬虫必备的伪装}
r = requests.get("https://segmentfault.com/a/1190000014383966",headers=headers)

2、降低主IP访问频率

  • 休眠:降低访问频率和次数
  • ip代理:使用环境变量 http_proxy 来设置 HTTP Proxy

proxies={ 'http': 'http://xx.xx.xx.xx:xx' }

time.sleep(60)#用python自带time模块的休眠功能
proxies = {'http': 'http://10.10.1.10:3128',#“协议类型:完整ip地址+端号”'https': 'http://10.10.1.10:1080'}#代理ip字典,随机调用
r = requests.get(url,headers=headers,proxies=proxies)

三、编写基础爬虫原理

在进行反爬虫工作之前,首先需要掌握如何编写基础的爬虫程序。
目前,网络上关于爬虫的资料相对有限,通常仅提供一段Python代码示例。尽管Python是一门强大的编程语言,但针对已实施反爬虫措施的网站,Python并非最佳选择。
讽刺的是,许多公开的Python爬虫代码通常会使用一个名为lynx的用户代理(User-Agent)。至于如何处理这个User-Agent,这里无需多言。

编写爬虫程序通常需要经过以下几个步骤:

1、分析页面请求格式

理解目标页面的请求结构和数据传输方式。

2、构建合适的HTTP请求

根据页面分析结果,创建与目标网站交互的HTTP请求。

3、批量发送HTTP请求并获取数据

通过循环发送HTTP请求,批量获取所需数据。

例如,当你访问一个在线购物网站时,你可能会在产品详情页点击“加入购物车”按钮,这会触发页面加载并更新购物车中的商品数量和总价。如果你的目标是获取购物车中的产品信息,你需要确定哪个网络请求包含这些数据。

一个有效的做法是通过浏览器的开发者工具查看网络请求。在分析这些请求时,你可以通过数据传输量来筛选和排序。通常,包含重要数据的请求会传输较大的数据量,而其他请求则相对较小。通过这种方法,你可以快速找到与购物车信息相关的请求,从中提取所需的数据。只需根据网络传输的数据量对请求进行倒序排列。尽管页面可能生成多个复杂的URL,开发人员通常不会将大量数据附加在无关的请求上

四、编写高级爬虫原理

编写高级爬虫进阶技巧包括以下几种:

1、分布式爬虫

一些教程建议将爬虫分布式部署在多台机器上,以提高抓取效率。然而,这种说法并不完全正确。分布式爬虫的主要目的是规避目标网站对单个IP的封禁。封IP是反爬虫的终极手段,虽然非常有效,但也可能误伤正常用户。

2、模拟JavaScript

有些教程将模拟JavaScript和抓取动态网页视为进阶技巧,但实际上,这只是一个基础功能。如果目标网站没有实施反爬虫措施,你可以直接抓取Ajax请求的数据,无需过多关注JavaScript的处理过程。但如果对方采取了反爬虫措施,JavaScript的逻辑往往会变得复杂,此时关键在于深入分析,而不仅仅是简单的模拟。因此,掌握JavaScript模拟应当视为基本功。

3、使用PhantomJS

PhantomJS是一个极端的例子。它原本是用于自动化测试的工具,但由于其强大的功能,许多人将其用于爬虫。然而,PhantomJS有一个明显的缺点:效率低。此外,PhantomJS本身也容易被检测到,尽管涉及的技术细节较为复杂,这里不再详述。

五、不同级别爬虫的优缺点分析

较低级的爬虫虽然容易被封锁,但其性能优越,成本较低。而越是高级的爬虫,虽然难以被封锁,但其性能较低,成本也显著增加。

爬虫级别性能成本
低级
高级

当反爬虫的成本高到一定程度时,继续封锁爬虫就可能变得不再必要。在经济学中,这种现象被称为边际效应,即当成本增加到某个临界点时,额外的收益将逐渐减少。

因此,在对比双方资源时,我们可以发现,执意与对方在反爬虫技术上较量并不划算。应当找到一个最佳平衡点,超过这一点时,不妨允许其继续爬取数据。毕竟,反爬虫的目标是基于商业利益,而非为了显示技术能力。

六、反爬虫系统设计的常规架构

1、对访问量进行统计,并封锁超过阈值的单个IP地址

这种方法虽然有效,但存在两个明显缺陷。首先,它容易误伤普通用户;其次,IP资源成本低廉,可以轻易购买大量IP地址。因此,从总体上看,这种策略的性价比不高。然而,对于初级爬虫,仍然有一定的效果。

2、对访问量进行统计,并封锁超过阈值的单个会话(session)

虽然看起来更高级一些,但效果实际上更差。因为session同样不具备成本,可以轻松重新生成。因此,这种方法的有效性有限。

3、对访问量进行统计,并封锁超过阈值的单个用户代理(userAgent)

这是一个强有力的策略,类似于使用抗生素,效果显著,但副作用也大。误伤普通用户的风险很高,使用时需格外谨慎。我们至今只在极少数情况下短暂封锁过特定平台下的浏览器。

4、组合使用

将这些措施结合起来使用,可以提升整体的防护能力,同时降低误伤率。在应对低级爬虫时,这种组合策略相对有效。

由此可见,反爬虫与爬虫之间实际上是一场博弈。最终的赢家往往是那些有资源投入的“玩家”。由于上述方法效果各有优劣,因此,使用JavaScript进行防护通常更为可靠。

七、总结

我们的网站使用的是随机校验码,由于我们是3级防护等级,12306是4级,成本达不到。所以按照现有的最优解决方案,我们升级了我们的随机校验码,暂时阻止了此次攻击,未来如果还有类似的攻击,我们准备加入手机短信的验证,进一步遏制恶意登录操作。这次事件为我们的网络安全防护带来了重要启示,并成为我们反爬虫技术的核心理念之一:及时变更。

参考文献:
[1]携程技术中心. 关于反爬虫,看这一篇就够了[R/OL][2016-06-30].https://segmentfault.com/a/1190000005840672
[2]忍野忍.Python 从零开始爬虫(零)——爬虫思路&requests模块使用[R/OL][2018-04-14].https://segmentfault.com/a/1190000014383966
[3]忍野忍.Python 从零开始爬虫(一)——爬虫伪装&反“反爬”[R/OL][2018-04-14].https://segmentfault.com/a/1190000014431323

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

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

相关文章

机器学习练手(二):基于KMeans的股票分类

总结:本文为和鲸python 机器学习原理与实践闯关训练营资料整理而来,加入了自己的理解(by GPT4o) 原活动链接 在前一关我们学习了逻辑回归,学会如何训练模型、数据基础性分析、如何处理空值等操作,下面我们…

springcloud loadbalancer nacos无损发布

前言 故事背景 jenkins部署时总是会有几秒钟接口调用报错,观察日志是因为流量被下发到已下线的服务,重启脚本在停止应用之前先调用nacos注销实例api后再重启依然会短暂出现此问题。项目架构是springcloud alibaba,通过openfeign进行微服务之间调用&…

面试笔记8.6

缓存 1.如何保证redis与数据库一致性 redis面试:如何保证缓存和数据库数据的一致性?_使用update更新数据,json缓存不更新-CSDN博客 如果先删除缓存,再删除数据库,数据不一致, 解决 删 1.先操作缓存但不删除缓存&…

C#使用NPOI进行Excel和Word文件处理(二)

文章目录 使用NPOI在C#中处理Excel和Word文件1. 什么是NPOI?2. 安装NPOI2.1 VisualStudio2019引入NPOI 3. 处理Excel文件读取Excel文件写入Excel文件 4. 处理Word文件读取Word文件写入Word文件 总结Github 地址链接参考例子 使用NPOI在C#中处理Excel和Word文件 在C…

linux maven仓库 删除未下载完成的包 lastUpdated文件

以下命令查找.lastUpdated文件所在目录,并删除所在目录(maven包的版本目录)。 $ find ~/.m2/repository/ -regex ".*\.lastUpdated" | xargs dirname | xargs rm -rf查找未下载完成的文件 $ find ~/.m2/repository/ -regex ".*\.lastUp…

使用 docker 快速搭建独角数卡发卡网

docker版本的发卡程序搭建 项目1:https://github.com/assimon/dujiaoka 项目2(基于项目1):https://github.com/Apocalypsor/dujiaoka-docker 一键安装脚本 curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/m…

系统化学习 H264视频编码(06)哥伦布编码解读

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的…

C语言典型例题28

《C程序设计教程(第四版)——谭浩强》 习题2.5 输入一个华氏温度,要求输出摄氏温度。公式为C5/9(F-32),要求输出要有文字说明,取两位小数 数学知识: (1)华氏温度与摄氏温度&#x…

E2000 RGMII0通讯异常问题总结

最近让新来小朋友做了一款E2000Q的板卡,使用了E2000Q上的两个RGMII资源,外接YT8521转出了电口。 但是他调试中遇到了一个比较奇怪的问题,两套YT8521的电路都一样,但是一路通一路不通。 也就是框图中MAC2(芯片RGMII0,系统对应eth1)那路网络不通,图中MAC3(芯片RGMII1,…

DITA发布PDF样式定制

- 1 - 概述 使用结构化写作/DITA写作,内容和样式是分离的。 编写的内容放在DITA文件中,样式是放在样式模板文件中。 而且针对不同的格式的输出(如:PDF,MS Word),样式模板文件不同。 文档工程…

【优秀python案例】基于百度贴吧的数据采集与文本分析设计与实现

数据采集实现: 对百度贴吧帖子数据的采集。首先,使用requests库发送HTTP请求,通过设置请求头模拟浏览器访问,获取网页的HTML内容。然后,利用BeautifulSoup库对HTML内容进行解析,以便提取所需的信息。 在循…

c# .net core项目角色授权机制

前言 角色授权机制是确保应用程序安全性的重要组成部分,它允许开发者根据用户的角色来限制对应用程序中不同资源的访问。 基本概念: 角色授权基于用户角色的访问控制,即根据用户所属的角色来决定其能够访问的资源或执行的操作。在.NET Cor…

k8s—ingress应用

一、ingress和ingress-controller ingress对象: 指的是k8s中的⼀个api对象/资源对象,⼀般⽤yaml配置。作⽤是定义请求如何转发到service的规则,可以理解为配置模板。 ingress-controller: 具体实现反向代理及负载均衡的程序&…

鸿蒙第三方应用.hap打包、安装流程。

最近在华为手表上安装第三方应用(源码打包构建应用,需要签名)。网上看了教程,在此记录下。 准备工作:先安装DevEco Studio开发工具。 进入华为 appgallery connect网站(注册、开发者实名认证) …

【Material-UI】按钮组:按钮变体详解

文章目录 一、按钮变体概述1. 组件介绍2. 基本用法 二、按钮变体详细说明1. 轮廓按钮(Outlined)2. 文本按钮(Text)3. 填充按钮(Contained) 三、按钮变体的实际应用场景1. 界面设计2. 界面一致性3. 视觉层次…

面试笔记 8.5

面试常见: Jvm,高并发,多线程,数据库,redis,框架 1.N I/O有什么核心组件 Java NIO 基本原理以及三大核心组件_java nio核心组件有哪些-CSDN博客 Buffer 缓冲 Channel 一对一 Channel 读取数据 Selector对应线程…

双轮驱动产品持续商业成功

获取完整PPT见下图 更多有关华为研发管理/IPD、MBSE、PLM、ERP、MES、数据治理、数字样机等方面免费解决方案、资料获取,请见下图

前端(五):前端工程化

前端工程化是指在企业级的前端开发项目中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。 一、环境准备 (一)环境准备 1、Vue-cli:是Vue官方提供的一个脚手架,用于快速生成一个Vue的项目模板。 2、…

myeclipse 2020 下载 安装 汉化

1,解压 myeclipse 2020 压缩包到当前目录下: 点击此处蓝色字体下载压缩包 提取码 k3x9 2,鼠标右键 点击 myeclipse 2020.exe 选择 以管理员身份运行 : 3,等待加载: 4,点击 Next : 5…

正则表达式测试工具

前言 正则表达式测试工具可供您输入正则表达式和测试文本,立即查看匹配结果. 下面是离线的HTML文件,同样可以提供相同的服务. 目录 使用说明 HTML代码 正则表达式的编写经验和方法 总结 使用说明 1.先将HTML代码存储成.html为后缀的文件; 2.然后用浏览器打开这个…