Python爬⾍之常见的反爬⼿段和解决⽅法
常见的反爬⼿段和解决思路selenium获取cookie
学习⽬标
1. 了解 服务器反爬的原因
2. 了解 服务器常反什么样的爬⾍
3. 了解 反爬⾍领域常见的⼀些概念
4. 了解 反爬的三个⽅向
5. 了解 常见基于⾝份识别进⾏反爬
6. 了解 常见基于爬⾍⾏为进⾏反爬
7. 了解 常见基于数据加密进⾏反爬
1 服务器反爬的原因
爬⾍占总PV(PV是指页⾯的访问次数,每打开或刷新⼀次页⾯,就算做⼀个pv)⽐例较⾼,这样浪费钱(尤其是三⽉份爬⾍)。
三⽉份爬⾍是个什么概念呢?每年的三⽉份我们会迎接⼀次爬⾍⾼峰期,有⼤量的硕⼠在写论⽂的时候会选择爬取⼀些往⽹站,并进⾏舆情分析。因为五⽉份交论⽂,所以嘛,⼤家都是读过书的,你们懂的,前期各种DotA,LOL,到了三⽉份了,来不及了,赶紧抓数据,四⽉份分析⼀下,五⽉份交论⽂,就是这么个节奏。
公司可免费查询的资源被批量抓⾛,丧失竞争⼒,这样少赚钱。
数据可以在⾮登录状态下直接被查询。如果强制登陆,那么可以通过封杀账号的⽅式让对⽅付出代价,这也是很多⽹站的做法。但是不强制对⽅登录。那么如果没有反爬⾍,对⽅就可以批量复制的信息,公司竞争⼒就会⼤⼤减少。竞争对⼿可以抓到数据,时间长了⽤户就会知道,只需要去竞争对⼿那⾥就可以了,没必要来我们⽹站,这对我们是不利的。
状告爬⾍成功的⼏率⼩
爬⾍在国内还是个擦边球,就是有可能可以起诉成功,也可能完全⽆效。所以还是需要⽤技术⼿段来做最后的保障。
2 服务器常反什么样的爬⾍
⼗分低级的应届毕业⽣
应届毕业⽣的爬⾍通常简单粗暴,根本不管服务器压⼒,加上⼈数不可预测,很容易把站点弄挂。
⼗分低级的创业⼩公司
现在的创业公司越来越多,也不知道是被谁忽悠的然后⼤家创业了发现不知道⼲什么好,觉得⼤数据⽐较热,就开始做⼤数据。分析程序全写差不多了,发现⾃⼰⼿头没有数据。怎么办?写爬⾍爬啊。于是就有了不计其数的⼩爬⾍,出于公司⽣死存亡的考虑,不断爬取数据。
不⼩⼼写错了没⼈去停⽌的失控⼩爬⾍
有些⽹站已经做了相应的反爬,但是爬⾍依然孜孜不倦地爬取。什么意思呢?就是说,他们根本爬不到任何数据,除了httpcode是200以外,⼀切都是不对的,可是爬⾍依然不停⽌这个很可能就是⼀些托管在某些服务器上的⼩爬⾍,已经⽆⼈认领了,依然在⾟勤地⼯作着。
成型的商业对⼿
这个是最⼤的对⼿,他们有技术,有钱,要什么有什么,如果和你死磕,你就只能硬着头⽪和他死磕。
抽风的搜索引擎
⼤家不要以为搜索引擎都是好⼈,他们也有抽风的时候,⽽且⼀抽风就会导致服务器性能下降,请求量跟⽹络攻击没什么区别。
3 反爬⾍领域常见的⼀些概念
因为反爬⾍暂时是个较新的领域,因此有些定义要⾃⼰下:
爬⾍:使⽤任何技术⼿段,批量获取⽹站信息的⼀种⽅式。关键在于批量。
反爬⾍:使⽤任何技术⼿段,阻⽌别⼈批量获取⾃⼰⽹站信息的⼀种⽅式。关键也在于批量。
误伤:在反爬⾍的过程中,错误的将普通⽤户识别为爬⾍。误伤率⾼的反爬⾍策略,效果再好也不能⽤。
拦截:成功地阻⽌爬⾍访问。这⾥会有拦截率的概念。通常来说,拦截率越⾼的反爬⾍策略,误伤的可能性就越⾼。因此需要做个权衡。
资源:机器成本与⼈⼒成本的总和。
这⾥要切记,⼈⼒成本也是资源,⽽且⽐机器更重要。因为,根据摩尔定律,机器越来越便宜。⽽根据IT⾏业的发展趋势,程序员⼯资越来越贵。因此,通常服务器反爬就是让爬⾍⼯程师加班才是王道,机器成本并不是特别值钱。
4 反爬的三个⽅向
基于⾝份识别进⾏反爬
基于爬⾍⾏为进⾏反爬
基于数据加密进⾏反爬
5 常见基于⾝份识别进⾏反爬
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静态⽂件中获取请求数据(github登录数据)
反爬原因:通过增加获取请求参数的难度进⾏反爬
解决⽅案:仔细分析抓包得到的每⼀个包,搞清楚请求之间的联系
2.2 通过发送请求获取请求数据
反爬原因:通过增加获取请求参数的难度进⾏反爬
解决⽅案:仔细分析抓包得到的每⼀个包,搞清楚请求之间的联系,搞清楚请求参数的来源
2.3 通过js⽣成请求参数
反爬原理:js⽣成了请求参数
解决⽅法:分析js,观察加密的实现过程,通过js2py获取js的执⾏结果,或者使⽤selenium来实现
2.4 通过验证码来反爬
反爬原理:对⽅服务器通过弹出验证码强制验证⽤户浏览⾏为
解决⽅法:打码平台或者是机器学习的⽅法识别验证码,其中打码平台廉价易⽤,更值得推荐
6 常见基于爬⾍⾏为进⾏反爬
1 基于请求频率或总请求数量
爬⾍的⾏为与普通⽤户有着明显的区别,爬⾍的请求频率与请求次数要远⾼于普通⽤户
1.1 通过请求ip/账号单位时间内总请求数量进⾏反爬
反爬原理:正常浏览器请求⽹站,速度不会太快,同⼀个ip/账号⼤量请求了对⽅服务器,有更⼤的可能性会被识别为爬⾍
解决⽅法:对应的通过购买⾼质量的ip的⽅式能够解决问题/购买个多账号
1.2 通过同⼀ip/账号请求之间的间隔进⾏反爬
反爬原理:正常⼈操作浏览器浏览⽹站,请求之间的时间间隔是随机的,⽽爬⾍前后两个请求之间时间间隔通常⽐较固定同时时间间隔较短,因此可以⽤来做反爬
解决⽅法:请求之间进⾏随机等待,模拟真实⽤户操作,在添加时间间隔后,为了能够⾼速获取数据,
尽量使⽤代理池,如果是账号,则将账号请求之间设置随机休眠
1.3 通过对请求ip/账号每天请求次数设置阈值进⾏反爬
反爬原理:正常的浏览⾏为,其⼀天的请求次数是有限的,通常超过某⼀个值,服务器就会拒绝响应
解决⽅法:对应的通过购买⾼质量的ip的⽅法/多账号,同时设置请求间随机休眠
2 根据爬取⾏为进⾏反爬,通常在爬取步骤上做分析
2.1 通过js实现跳转来反爬
反爬原理:js实现页⾯跳转,⽆法在源码中获取下⼀页url
解决⽅法: 多次抓包获取条状url,分析规律
2.2 通过蜜罐(陷阱)获取爬⾍ip(或者代理ip),进⾏反爬
反爬原理:在爬⾍获取链接进⾏请求的过程中,爬⾍会根据正则,xpath,css等⽅式进⾏后续链接的提取,此时服务器端可以设置⼀个陷阱url,会被提取规则获取,但是正常⽤户⽆法获取,这样就能有效的区分爬⾍和正常⽤户
解决⽅法: 完成爬⾍的编写之后,使⽤代理批量爬取测试/仔细分析响应内容结构,出页⾯中存在的陷阱
2.3 通过假数据反爬
反爬原理:向返回的响应中添加假数据污染数据库,通常家属剧不会被正常⽤户看到
解决⽅法: 长期运⾏,核对数据库中数据同实际页⾯中数据对应情况,如果存在问题/仔细分析响应内容
2.4 阻塞任务队列
反爬原理:通过⽣成⼤量垃圾url,从⽽阻塞任务队列,降低爬⾍的实际⼯作效率
解决⽅法: 观察运⾏过程中请求响应状态/仔细分析源码获取垃圾url⽣成规则,对URL进⾏过滤
2.5 阻塞⽹络IO
反爬原理:发送请求获取响应的过程实际上就是下载的过程,在任务队列中混⼊⼀个⼤⽂件的url,当爬⾍在进⾏该请求时将会占⽤⽹络io,如果是有多线程则会占⽤线程
解决⽅法: 观察爬⾍运⾏状态/多线程对请求线程计时/发送请求钱
2.6 运维平台综合审计
反爬原理:通过运维平台进⾏综合管理,通常采⽤复合型反爬⾍策略,多种⼿段同时使⽤
解决⽅法: 仔细观察分析,长期运⾏测试⽬标⽹站,检查数据采集速度,多⽅⾯处理
7 常见基于数据加密进⾏反爬
1 对响应中含有的数据进⾏特殊化处理
通常的特殊化处理主要指的就是css数据偏移/⾃定义字体/数据加密/数据图⽚/特殊编码格式等
1.1 通过⾃定义字体来反爬
下图来⾃猫眼电影电脑版
反爬思路: 使⽤⾃有字体⽂件
解决思路:切换到⼿机版/解析字体⽂件进⾏翻译
1.2 通过css来反爬
下图来⾃猫眼去哪⼉电脑版
反爬思路:源码数据不为真正数据,需要通过css位移才能产⽣真正数据
解决思路:计算css的偏移
1.3 通过js动态⽣成数据进⾏反爬
反爬原理:通过js动态⽣成
解决思路:解析关键js,获得数据⽣成流程,模拟⽣成数据
1.4 通过数据图⽚化反爬
58同城短租](baise.58/duanzu/38018718834984x.shtml)
解决思路:通过使⽤图⽚解析引擎从图⽚中解析数据
1.5 通过编码格式进⾏反爬
反爬原理: 不适⽤默认编码格式,在获取响应之后通常爬⾍使⽤utf-8格式进⾏解码,此时解码结果将会是乱码或者报错解决思路:根据源码进⾏多格式解码,或者真正的解码格式
⼩结
掌握 常见的反爬⼿段、原理以及应对思路
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论