常见的反爬手段和解决思路(爬虫与反爬虫)
学习目标 1 服务器反爬的原因 2 服务器长反什么样的爬虫 (1)十分低级的应届毕业生 (2)十分低级的创业小公司 (3)不小心写错了没人去停止的失控小爬虫 (4)成型的商业对手 (5)抽风的搜索引擎 3 反爬虫领域常见的一些概念 4 反爬的三个方向 (1)基于身份识别进行反爬 (2)基于爬虫行为的反爬 (3)基于数据加密进行反爬 5 常见基于身份识别进行反爬 5.1 通过headers字段来反爬 (1)通过headers中的user-agent (2)通过refer字段或者是其他字段来反馈 (3)通过cookie来反馈 5.2 通过请求参数来反爬 (1)通过html静态文件中获取请求数据(github登录数据) (2)通过发送请求获取请求数据 (3)通过js生成请求参数 (4)通过验证码来反爬 6 常见基于爬虫行为进行反爬 6.1 基于请求频率或总请求书 (1)通过请求ip账号单位时间内总请求数量进行反爬 (2)通过同一ip/账号请求之间的问题进行反爬 (3)通过同一ip/账号每天请求次数设置阈值进行反爬 6.2 根据爬虫行为进行反爬,通常在爬取步骤上做分析 (1) 通过js实现跳转来反爬 (2) 通过蜜罐(陷阱)获取爬虫ip(或者代理),进行反爬 (4) 通过假数据反爬 (4) 堵塞任务队列 7 常见基于数据加密进行反爬 (1)对响应中含有的数据进行特殊化处理 (2)通过自定义字体来反爬 下图来自猫眼电影电脑版 (3)通过css来反爬下图猫眼去哪儿电脑版 (4)通过js动态生成数据进行反爬 (5)通过数据图片化反爬 (6)通过编码格式进行反爬 小结学习目标
1.了解服务器反爬的原因
2.了解服务器长反什么样的爬虫
3.了解反爬虫领域常见的一些概念
4.了解反爬的三个方向
5.了解常见基于身份识别进行反爬
6.了解常见基于数据加密进行反爬
1 服务器反爬的原因
(1)爬虫占总PV较高,浪费资源
(2)资源被批量抓走,丧失竞争力
(3)法律的灰色地带
2 服务器长反什么样的爬虫
(1)十分低级的应届毕业生
应届毕业生的爬虫通常简单粗暴,根本不管服务器压力,加上人数不可预测,很容易把站点弄垮
(2)十分低级的创业小公司
现在的创业公司越来越多,也不知道被谁忽悠的,然后大家创了业不知道干什么好,觉得大数据比较热,就开始做大数据,分析程序全部写的差不多了,发现自己手头上没有数据。怎么办?写爬虫啊,于是就有了不计其数的小爬虫,处于公司的生死存亡,不断爬取数据。
(3)不小心写错了没人去停止的失控小爬虫
有些网站已经做了相应的反爬,但是爬虫仍然不断爬取。什么意思?就是说,他们根本爬不到任何数据,除了httpcode是200以外,一切都是不对的,可是爬虫依然不停止这个很可能就是一些托管在某些服务器上的小爬虫,已经无人认领了,依然在辛勤的工作着。
(4)成型的商业对手
这个是最大的对手,他们有技术,有钱,要什么,有什么,如果和你死磕,你就只能硬着头皮和他死磕。
(5)抽风的搜索引擎
大家不要以为搜索引擎都是好人,他们也有抽风的时候,而且一抽风就会导致服务器性能下降,请求量跟网络攻击没什么区别。
3 反爬虫领域常见的一些概念
因为反爬暂时是个比较新的领域,因此有定义要自己下:
爬虫:
使用任何技术手段,批量获取网站信息的一种方式,关键在于批量反爬虫:
使用任何技术手段,阻止别人批量获取自己网站信息的一种方式,关键也是批量误伤:
在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的爬虫策略,效果再好也不能用。拦截:
成功阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高,因此需要做个权衡。资源:
机器成本和人力成本的总和。
这里要切记,人力成本也是资源,而且比机器更重要,因为根据摩尔定律,机器越来越便宜。而根据it行业的发展趋势,程序员越来越贵。因此,通常服务器反爬就是让爬虫工程师加班才是王道,机器成本并不是特别值钱。
4 反爬的三个方向
(1)基于身份识别进行反爬
看请求是否为浏览器请求,若有问题则异常
(2)基于爬虫行为的反爬
一般是来到列表页面,从列表页面获得所有详情页面url,针对页面发起请求,爬虫对此进行检查
(3)基于数据加密进行反爬
爬取时解析过程中是加密的数据,乱码等
每个方向都会有若干手段
5 常见基于身份识别进行反爬
5.1 通过headers字段来反爬
(1)通过headers中的user-agent
反爬原因:
爬虫默认情况下没有user-agent,而是使用模块默认设置解决方案:
请求之前添加user-agent;更好的方式是使用user-agent池来解决(收集一堆user-agent的方式,或者随机生成user-agent)
(2)通过refer字段或者是其他字段来反馈
反爬原因:
爬虫默认情况下不会带上refer字段,服务器端通过判断请求发起的源头,一次判断请求是否合法解决方案:
添加refer字段
(3)通过cookie来反馈
反爬原因:
通过检查cookies来查看发起请求的用户是否具备相应权限,以此来进行反爬解决方案:
进行模拟登陆,成功获取cookies之后进行数据爬取
5.2 通过请求参数来反爬
请求参数的获取方法有很多,向服务器发送请求,很多时候需要携带请求参数,通常服务器可以通过检查请求参数是否正确来判断是否为爬虫
(1)通过html静态文件中获取请求数据(github登录数据)
反爬原因:
通过增加获取请求参数的难度进行反爬解决方案:
仔细分析抓包的每个包,搞清楚请求之间的联系
(2)通过发送请求获取请求数据
反爬原因:
通过增加获取请求参数的难度进行反爬解决方案:
仔细分析抓包得到的每一个包,搞清楚请求之间的联系,搞清楚请求参数的来源
(3)通过js生成请求参数
有时浏览器对账号密码等进行加密,或者通过js生成临时数据反爬原因:
js生成了请求参数解决方案:
分析js,观察加密的实现过程,通过js2py获取js的执行结果,或者使用selenium来实现
(4)通过验证码来反爬
反爬原因:
对方服务器通过弹出验证码强制验证用户浏览行为解决方案:
打码平台或者机器学习的方法识别验证码,其中打码平台廉价易用,值得推荐
6 常见基于爬虫行为进行反爬
6.1 基于请求频率或总请求书
爬虫的行为与普通用户有这明显的区别,爬虫的请求评率与请求次数远高于普通用户
(1)通过请求ip账号单位时间内总请求数量进行反爬
反爬原理:
正常浏览器请求网站,速度不会太快,同一个ip账号大量请求了对方服务器,有更大的可能性会被识别为爬虫解决方法:
对应的通过购买高质量的ip的方式能够解决问题/购买多个账号
(2)通过同一ip/账号请求之间的问题进行反爬
反爬原理:
正常人操作浏览器浏览网站,请求之间的时间间隔是随机的,而爬虫前后两个请求之间时间间隔通常比较固定同时时间间隔较短,因此可以用来做反爬解决方法:
请求之间随机等待,模拟真实用户操作,在添加时间间隔后,为了能够告诉获取数据,尽量使用代理池,如果是账号,则将账号请求之间设置随机休眠
(3)通过同一ip/账号每天请求次数设置阈值进行反爬
反爬原理:
正常的浏览行为,其一天的请求次数是有限的,通常超过某一个值,服务器就会拒绝响应解决方法:
对应的通过购买高质量的ip的方法/多账号,同时设置请求间随机休眠
6.2 根据爬虫行为进行反爬,通常在爬取步骤上做分析
(1) 通过js实现跳转来反爬
反爬原理:
js实现页面跳转,无法在源码中获取下一页url解决方法:
多次抓包获取条状url,分析规律
(2) 通过蜜罐(陷阱)获取爬虫ip(或者代理),进行反爬
反爬原理:
在爬虫获取链接进行请求的过程中,爬虫会根据正则,xpath,css等方式进行后续链接的提取,此时服务器端可以设置一个陷阱url,会被提取规则获取,但是正常用户无法获取,这样就能有效的区分爬虫和正常用户解决方法:
完成爬虫的编写之后,使用代理批量爬取测试/仔细分析响应内容结构,找出页面中存在的陷阱
(4) 通过假数据反爬
反爬原理:
向返回的响应中添加假数据污染数据库,通常假数据不会被正常用户看到解决方法:
长期运行,核对数据库中数据同实际页面中数据对应情况,如果存在问题/仔细分析响应内容
(4) 堵塞任务队列
反爬原理:
通过生成大量垃圾url,从而堵塞任务队列,降低爬虫的实际工作效率解决方法:
观察运行过程中请求响应状态/仔细分析源码获取垃圾url生成规则,对url进行过滤
7 常见基于数据加密进行反爬
(1)对响应中含有的数据进行特殊化处理
通常的特殊化处理主要指的的就是css数据偏移,自定义字体/数据加密/数据图片/特殊编码格式等
(2)通过自定义字体来反爬 下图来自猫眼电影电脑版
对于上面字体可以所有的对应起来,到时候翻译,但有些麻烦
当手机版的时候,检查发现没有进行加密了
1)反爬思路:
使用自有字体文件
2)解决思路:
切换到手机版/解析字体文件进行翻译
(3)通过css来反爬下图猫眼去哪儿电脑版
(4)通过js动态生成数据进行反爬
可能先拿到数据,再通过js运算得到结果,再进行渲染,在源码中并没有存在,此时若在源码中无法找到该数据,就需要查看是否js生成,后面会专门讲解js解析该如何做。
反爬原因:
通过js动态生成解决思路:
解析关键js,获得数据生成流程,模拟生成数据
(5)通过数据图片化反爬
将数据转化成图片,就是使你多走好几步
58同城短租()解决思路:
通过使用图片解析引擎从图片中解析数据
(6)通过编码格式进行反爬
反爬原因:
不适用默认编码格式,在获取响应之后通常爬虫使用utf-8格式进行解码,此时解码结果将会是乱码或者报错解决思路:
根据源码进行多格式解码,或者真正的解码格式
小结
掌握常见的反爬手段、原理以及应对思路