爬虫中常见的反爬手段和解决方法
每日分享:
欲成大树,莫与草争;将军有剑,不斩草蝇;遇烂入及时止损,遇烂事及时抽身。格局小的人喜欢诋毁和嫉妒,因为我不好,我也不想让你好。格局大的人都懂得一个道理,强者互帮,弱者互撕。人性最大的愚蠢就是互相为难。人生匆匆:自渡是一种能力,渡人就是一种格局。
- 了解反爬的三个方向
- 了解常见基于身份识别进行反爬
- 了解常见基于爬虫行为进行反爬
- 了解常见基于数据加密进行反爬
一、反爬的三个方向
- 基于身份识别进行反爬
- 基于爬虫行为进行反爬
- 基于数据加密进行反爬
二、常见基于身份识别进行反爬
1. 通过headers字段来反爬
headers中有很多字段,这些字段都有可能会被对方服务器拿过来判断是否为爬虫
1.1 通过headers中的user-agent字段进行反爬
- 反爬原理:爬虫默认情况下没有user-agent,而是使用模块默认设置
- 解决方法:请求之前添加user-agent即可;更好的方式是使用user-agent池来解决(收集一堆user-agent或者随机生成user-agent)
1.2 通过referer字段或者是其他字段来反爬
- 反爬原理:爬虫默认情况下不会带上referer字段,服务器通过判断请求发起的源头,以此判断请求是否合法
- 解决方法:添加referer字段
1.3 通过cookie来反爬
- 反爬原因:通过检查cookies来查看发起请求的用户是否具备相应权限,以此来进行反爬
- 解决方案:进行模拟登录,成功获取cookies之后再进行数据爬取
2. 通过请求参数来反爬
请求参数的获取方法有很多,向服务器发送请求,很多时候需要携带请求参数,通常服务器端可以通过检查请求参数是否正确来判断是否为爬虫
2.1 通过从html静态文件中获取请求数据
- 反爬原因:通过增加获取请求参数的难度进行反爬
- 解决方案:仔细分析抓包得到的每一个包,搞清楚请求之间的联系
2.2 通过发送请求获取请求数据
- 反爬原因:通过增加获取请求参数的难度进行反爬
- 解决方案:仔细分析抓包得到的每一个包,搞清楚请求之间的联系,搞清楚请求参数的来源
2.3 通过js生成请求参数
- 反爬原理:js生成了请求参数
- 解决方法:分析js,观察加密的实现过程,通过js2py获取js的执行结果,或者使用selenium来实现
2.4 通过验证码来反爬
- 反爬原理:对方服务器通过弹出验证码强制验证用户浏览行为
- 解决方法:打码平台或者是机器学习的方法识别验证码,其中打码平台廉价易用,更值得推荐
三、常见基于爬虫行为进行反爬
3.1 基于请求频率或总请求数量
爬虫的行为与普通用户有着明显的区别,爬虫的请求频率与请求次数要远高于普通用户
3.1.1 通过请求ip/账号单位时间内总请求数量进行反爬
- 反爬原理:正常浏览器请求网络,速度不会太快,同一个ip/账号大量请求了对方服务器,有更大的可能性会被识别为爬虫
- 解决方法:对应的通过购买高质量的ip的方式能够解决问题/购买多个账号
3.1.2 通过同一ip/账号请求之间的间隔进行反爬
- 反爬原理:正常人操作浏览器浏览网站,请求之间的时间间隔是随机的,而爬虫前后两个请求之间间隔通常比较固定同时时间间隔较短,因此可用来反爬
- 解决方法:请求之间进行随机等待,模拟真实用户操作,在添加时间间隔后,为了能够高速获取数据,尽量使用代理池,如果是账号,则将账号请求之间设置随机休眠
3.1.3 通过对请求ip/账号每天请求次数设置阈值进行反爬
- 反爬原理:正常的浏览行为,其一天的请求次数是有限的,通常超过某一个值,服务器就会拒绝响应
- 解决方法:对应的通过购买高质量的ip/多账号的方法,同时设置请求间随机休眠
3.2 根据爬虫行为进行反爬,通常在爬取步骤上做分析
3.2.1 通过js实现跳转来反爬
- 反爬原理:js实现页面跳转,无法在源码中获取下一页url
- 解决方法:多次抓包获取条状url,分析规律
3.2.2 通过蜜罐(陷阱)获取爬虫ip(或代理ip),进行反爬
- 反爬原理:在爬虫获取链接进行请求的过程中,爬虫会根据正则,xpath,css等方式进行后续链接的提取,此时服务器端可以设置一个陷阱url,会被提取规则获取,但是正常用户无法获取,这样就能有效的区分爬虫和正常用户
- 解决方法:完成爬虫的编写之后,使用代理批量爬取测试/仔细分析响应内容结构,找出页面中存在的陷阱
3.2.3 通过假数据反爬
- 反爬原理:向返回的响应中添加假数据污染数据库,通常假数据不会被正常用户看到
- 解决方法:长期运行,核对数据库中数据同实际页面中数据对应情况,如果存在问题/仔细分析响应内容
3.2.4 阻塞任务队列
- 反爬原理:通过生成大量垃圾url,从而阻塞任务队列,降低爬虫的实际工作效率
- 解决方法:观察运行过程中请求影响状态/仔细分析源码获取垃圾url生成规则,对url进行过滤
3.2.5 阻塞网络io
- 反爬原理:发送请求获取响应的过程实际上就是下载的过程,在任务队列中混入一个大文件的url,当爬虫在进行该请求时将会占用网络io,如果是有多线程则会占用线程
- 解决方法:观察爬虫运行状态/多线程对请求线程计时/发送请求线
3.2.6 运维平台综合审计
- 反爬原理:通过运维平台进行综合管理,通常采用复合型反爬策略,多种手段同时使用
- 解决方法:仔细观察分析,长期运行测试目标网站,检查数据采集速度,多方面处理
四、常见基于数据加密进行反爬
4.1 对响应中含有的数据进行特殊化处理
通常的特殊化处理主要指的是css数据偏移/自定义字体/数据加密/数据图片/特殊编码格式
4.1.1 通过自定义字体来反爬
左面写的口碑7.9,检查之后,右面根本不会显示该数字,而是显示几个方框
在无痕模式准备抓包,打开网址,可以找到它的数字就像一段乱码,这就是它自定义的字体:
处理方法:我们可以将数字和自定义字体对应起来,比如7对应的就是
4.1.2 通过css来反爬
- 反爬思路:源码数据不为真正数据,需要通过css位移才能产生真正数据
- 解决思路:计算css偏移
4.1.3 通过js动态生成数据进行反爬
- 反爬原理:通过js动态生成
- 解决思路:解析关键js,获得数据生成流程,模拟生成数据
4.1.4 通过数据图片化反爬
- 一串数字在做成图片显示
- 解决思路:通过使用图片解析引擎从图片中解析数据
4.1.5 通过编码格式进行反爬
- 反爬原理:不适用默认编码格式,在获取响应后通常爬虫使用utf-8格式进行解码,此时解码结果将会是乱码或者报错
- 解决思路:根据源码进行多格式解码,或者真正的解码格式
爬虫中常见的反爬手段和解决方法相关推荐
- python网络爬虫系列(八)——常见的反爬手段和解决方法
常见的反爬手段和解决思路 学习目标 了解 服务器反爬的原因 了解 服务器常反什么样的爬虫 了解 反爬虫领域常见的一些概念 了解 反爬的三个方向 了解 常见基于身份识别进行反爬 了解 常见基于爬虫行为进 ...
- 【爬虫进阶】常见的反爬手段和解决方法(建议收藏)
爬虫进阶:常见的反爬手段和解决思路 1 服务器反爬的原因 2 服务器常反什么样的爬虫 3 反爬虫领域常见的一些概念 4 反爬的三个方向 5 常见基于身份识别进行反爬 5.1 通过headers字段来反 ...
- 爬虫之常见的反爬手段和解决思路
1 服务器反爬的原因 爬虫占总PV(PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv)比例较高,这样浪费钱(尤其是三月份爬虫). 三月份爬虫是个什么概念呢?每年的三月份我们会迎接一次爬虫高 ...
- Python 常见的反爬手段和解决思路
学习目标: 1.了解 服务器反爬的原因: 2.了解 服务器常反什么样的爬虫: 3.了解 反爬虫领域常见的一些概念: 4.了解 反爬的三个方向: 5.了解 常见基于身份识别进行反爬: 6.了解 常见基于 ...
- 常见的反爬手段和解决思路
1.明确反反爬的主要思路 反反爬的主要思路就是:尽可能的去模拟浏览器,浏览器在如何操作,代码中就如何去实现. 例如:浏览器先请求了地址url1,保留了cookie在本地,之后请求地址url2,带上了之 ...
- PHP开发中常见的安全问题详解和解决方法
PHP开发中常见的安全问题详解和解决方法 参考文章: (1)PHP开发中常见的安全问题详解和解决方法 (2)https://www.cnblogs.com/walblog/articles/83313 ...
- Android开发中常见的内存泄露案例以及解决方法总结
Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...
- 爬虫day6常见的反爬总结
day6常见的反爬总结 一.爬虫流程 第1步:确定爬虫对象(爬哪个网页的数据) 第2步:找接口(网页检查,network-Fetch/xhr,刷新,点左下角name里的,看显示的preview有没有想 ...
- Python爬虫:常见的反爬
常见的反爬 爬虫流程 确定爬虫对象(爬哪个网页的数据) 找接口 有接口:直接对接口发送请求 成功(直接json解析) 失败就进入下一步 没有接口,直接进入下一步 用requests直接对网页地址发送请 ...
最新文章
- 【LeetCode】87. Scramble String
- 金九银十铁12,看完弄懂,工资少说加 5K
- Spring.NET企业架构实践之 JQuery + FlexiGrid + ASP.NET MVC + NVelocity + WCF + LINQ + NHibernate 综合应用...
- tensorflow随笔-读取图像文件数据(1)
- nvr服务器系统,【64路IPC网络存储服务器(WNVR)】 - 太平洋安防网
- 前端性能优化:Add Expires headers
- Linux vi 编辑器常见命令的使用
- java中list、set和map 的区别(转)
- 视觉slam学习笔记以及课后习题《第三讲李群李代数》
- cisco配置交换机管理地址和默认网关
- [渝粤教育] 中国地质大学 职业健康管理体系 复习题
- Mac电脑下配置maven环境变量
- windows安装yarn和tyarn
- 如何使用google code(转)
- 读书笔记之《随机漫步的傻瓜》
- 阐述篇-聊聊我眼中の《面试宝典》
- Spring AOP实现原理,从代理说起
- Permission denied: user=dr.who, access=WRITE, inode=“/“:root:supergroup:drwxr-xr-x
- 蓝牙单火开关(天猫精灵生态)方案
- 通讯录姓氏多音字的问题解决
热门文章
- 贝省登录时显示服务器异常请稍后再试,网站服务器出现service unavailable错误如何解决?...
- 用python表白代码_python浪漫表白源码
- 各类后门整理!【白帽黑客必备生存技能】
- 【金融财经】金融市场一周简报(2017-11-03)
- idog copy from,
- 什么是单例模式 (Singleten)
- 【算法】时间复杂度/运行时间——大O表示法
- 手工命令行打包java工程为war包
- 如何进行期货日内趋势量化交易系统的设计?
- 让kaldi在Linux开发板上运行起来~ (测试运行篇)