爬虫泛滥,总结爬虫攻防战

By | 2024 年 9 月 12 日

1、通过User-Agent来控制访问

无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers,比如知乎的requests headers
对于爬虫程序来说,最需要注意的字段就是:User-Agent
很多网站都会建立user-agent白名单,只有属于正常范围的user-agent才能够正常访问。

攻:难度⭐
可以自己设置一下user-agent,或者更好的是,可以从一系列的user-agent里随机挑出一个符合标准的使用。

2、通过IP限制实现
如果一个固定的ip在短暂的时间内,快速大量的访问一个网站,后台管理员可以编写IP限制,不让该IP继续访问。

攻:难度⭐
通过IP代理池来解决。
ip代理的获取,对于个人有一定成本,且网上有免费和付费的。企业则是成本不高,购买集群云服务或者多IP服务器来自建代理池。

3. SESSION访问限制
后台统计登录用户的操作,比如短时间的点击事件,请求数据事件,与正常值比对,用于区分用户是否处理异常状态,如果是,则限制登录用户操作权限。
缺点:需要增加数据埋点功能,阈值设置不好,容易造成误操作。

攻:难度⭐⭐⭐
解决方法:注册多个账号、模拟正常操作。

4. Spider Trap
蜘蛛陷阱导致网络爬虫进入无限循环之类的东西,这会浪费蜘蛛的资源,降低其生产力,并且在编写得不好的爬虫的情况下,可能导致程序崩溃。礼貌蜘蛛在不同主机之间交替请求,并且不会每隔几秒钟从同一服务器请求多次文档,这意味着“礼貌”网络爬虫比“不礼貌”爬虫的影响程度要小得多。

反爬方式:

  • 创建无限深度的目录结构 HTTP://example.com/bar/foo/bar/foo/bar/foo/bar /
  • 动态页面,为网络爬虫生成无限数量的文档。如由算法生成杂乱的文章页面。
  • 文档中填充了大量字符,使解析文档的词法分析器崩溃。

此外,带蜘蛛陷阱的网站通常都有robots.txt告诉机器人不要进入陷阱,因此合法的“礼貌”机器人不会陷入陷阱,而忽视robots.txt设置的“不礼貌”机器人会受到陷阱的影响。

攻:难度⭐⭐⭐

把网页按照所引用的css文件进行聚类,通过控制类里最大能包含的网页数量防止爬虫进入trap后出不来,对不含css的网页会给一个penalty,限制它能产生的链接数量。这个办法理论上不保证能避免爬虫陷入死循环,但是实际上这个方案工作得挺好,因为绝大多数网页都使用了css,动态网页更是如此。

缺点:反爬方式1,2会增加很多无用目录或文件,造成资源浪费,也对正常的SEO十分不友好,可能会被惩罚。

5. 验证码

验证码是一种区分用户是计算机还是人的公共全自动程序。可以防止:恶意破解密码、刷票、论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上用验证码是现在很多网站通行的方式。
包含简单验证码、图片识别验证码、三方服务验证、滑动验证、点击验证、短信验证等。
打码平台雇佣了人力,专门帮人识别验证码。识别完把结果传回去。总共的过程用不了几秒时间。这样的打码平台还有记忆功能。图片被识别为“锅铲”之后,那么下次这张图片再出现的时候,系统就直接判断它是“锅铲”。时间一长,图片验证码服务器里的图片就被标记完了,机器就能自动识别了。
①人工验证码标记形成库
②简单验证码灰度分层处理,实现文字识别
③复杂字库验证码,体验不好,三方验证码平台可以解决
④三方平台验证码自然也有三方平台破解

攻:难度⭐⭐
接入三方平台破解即可

6. 通过robots.txt来限制爬虫
robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。
robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。
此文君子协定,标准搜索引擎支持,但是....

攻:难度⭐
如果使用scrapy框架,只需将settings文件里的ROBOTSTXT_OBEY设置值为 False

7、动态数据加载
python的requests库只能爬取静态页面,爬取不了动态加载的页面。使用JS加载数据方式,能提高爬虫门槛。
对搜索引擎不友好。

攻:难度⭐⭐
模拟点击,数据分析链接替换,抓包分析

8. 数据加密-使用加密算法
前端加密 通过对查询参数、user-agent、验证码、cookie等前端数据进行加密生成一串加密指令,将加密指令作为参数,再进行服务器数据请求。该加密参数为空或者错误,服务器都不对请求进行响应。

服务器端加密 在服务器端同样有一段加密逻辑,生成一串编码,与请求的编码进行匹配,匹配通过则会返回数据。

攻:难度⭐⭐⭐

JS加密破解方式,就是要找到JS的加密代码,然后使用第三方库js2py在Python中运行JS代码,从而得到相应的编码。

案例参考:

https://blog.csdn.net/lsh19950928/article/details/81585881   

缺点:加密算法明文写在JS里,爬虫用户还是可以分析出来。

9. 数据加密-使用字体文件映射
服务器端根据字体映射文件先将客户端查询的数据进行变换再传回前端,前端根据字体文件进行逆向解密。

映射方式可以是数字乱序显示,这样爬虫可以爬取数据,但是数据是错误的。

攻:难度⭐⭐⭐⭐

如果能看懂JS代码,这样的方式还是很容易破解的,所以需要做以下几个操作来加大破解难度。

  • 对JS加密
  • 使用多个不同的字体文件,然后约定使用指定字体文件方式,比如时间戳取模,这样每次爬取到的数据映射方式都不一样,映射结果就不一样,极大提高了破解的难度。该种方式相比使用加密算法方式难度更高,因为加密算法是固定的几种,对方很容易获取并破解,而字体文件映射可以按任意规则映射,正常的数据使之错误显示,爬虫不容易察觉。

参考案例:https://www.jianshu.com/p/f79d8e674768

缺点:需要生成字体文件,增加网站加载资源的体量。

10. 非可视区域遮挡
此方式主要针对使用senlium进行的爬虫,如果模拟界面未进入可视区域,则对未见数据进行遮挡,防止senlium的click()操作。这种方式只能稍稍降低爬虫的爬取速度,并不能阻止继续进行数据爬取。

内容来源:https://blog.csdn.net/m0_59236127/article/details/136022426

如需删除,请联系toqiniu艾特163

发表回复

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据