常见三大反爬方向
1、身份识别
(1)headers字段
- User-Agent字段
反爬原理:爬虫默认情况下没有User-Agent,而是使用模块默认设置
解决方法:请求之前添加User-Agent即可,最好使用User-Agent池来解决
- 可使用fake-useragent模块自动生成,官方文档:http://useragentstring.com/
- 用户代理字符串列表:http://useragentstring.com/pages/useragentstring.php
- referer字段
反爬原理:爬虫默认情况下不会带上referer字段,服务器端通过判断请求发起的源头,以此判断请求是否合法
解决方法:添加referer字段
- 如果请求头有带referer字段,添加上即可
- cookie
反爬原因:通过检查cookies来查看发起请求的用户是否具备相应权限,以此来进行反爬
解决方案:1、成功获取cookies之后模拟登录;2、通过post请求携带data模拟登录
- 方法1:先登录,获取cookies之后模拟登录
- 方法2:通过post请求携带data模拟登录
(2)请求参数
-
html静态文件
反爬原因:请求参数为某个html文件内的参数
解决方案:利用search寻找相关html静态文件 -
发送请求
反爬原因:请求参数为已发送请求包的返回参数
解决方案:利用search寻找相关包 -
js生成
反爬原理:js生成请求参数
解决方法:分析js,观察加密的实现过程,通过js2py获取js的执行结果 -
验证码
反爬原理:通过弹出验证码强制验证
解决方法:连接打码平台API或者使用机器学习的方法识别验证码
2、爬虫行为
(1)请求频率
-
同一ip/账号单位时间内总请求数量
反爬原理:同一个ip/账号大量请求对方服务器,会被识别为爬虫
解决方法:1、使用多ip代理(最好是高匿代理),搭建ip代理池;2、使用多账号 -
同一ip/账号请求间隔
反爬原理:请求间隔固定或请求时间间隔较短,会被识别为爬虫
解决方法:1、使用randam随机函数获取随机请求间隔,模拟真实用户操作;2、使用多ip代理(最好是高匿代理),搭建ip代理池;3、使用多账号,账号请求之间设置随机休眠 -
同一ip/账号每日请求次数
反爬原理:日请求次数超过服务器设定值,服务器拒绝响应
解决方法:1、使用多ip代理(最好是高匿代理),搭建ip代理池;2、使用多账号
(2)爬取过程
-
js跳转
反爬原理:通过js实现页面跳转,无法在源码中获取下一页url
解决方法:抓包跳转后的页面,获取对应请求的url,分析其规律 -
陷阱
反爬原理:设置容易被爬虫语法规则获取的陷阱url,但正常用户无法获取,有效区分爬虫和正常用户
解决方法:仔细分析响应内容结构,找出页面中存在的陷阱 -
假数据
反爬原理:向返回的响应中添加假数据污染数据库
解决方法:核对数据库中数据同实际页面中数据的对应情况 -
阻塞任务队列
反爬原理:通过生成大量垃圾url,从而阻塞任务队列,降低爬虫的实际工作效率
解决方法:观察运行过程中请求响应状态,仔细分析源码,获取垃圾url生成规则,对url进行过滤 -
阻塞网络IO
反爬原理:发送请求获取响应的过程实际上就是下载的过程,在任务队列中混入一个大文件的url,当爬虫在进行该请求时将会占用网络IO,如果是有多线程则会占用线程
解决方法: 观察爬虫运行状态,对请求线程计时 -
运维平台综合审计
反爬原理:通过运维平台进行综合管理,通常采用复合型反爬虫策略,多种手段同时使用
解决方法: 根据上面的解决方案多方面处理
3、数据加密
(1)数据特殊化处理
- 自定义字体
反爬思路: 使用自有字体文件
解决思路:1、切换到手机版再进行分析;2、解析字体再进行翻译
- 例:猫眼电影评分
- 方法1. 切换到手机版后,字体可以直接获取
- 方法2. 找到对应文件进行字体解析
- css偏移
反爬思路:源码数据不是真正数据,需要通过css位移才能产生真正数据
解决思路:计算css的偏移
- 例:去哪儿网
- js动态生成数据
反爬原理:通过js动态生成
解决思路:解析关键js,获得数据生成流程,模拟生成数据
- 例:登录时,post请求的password为加密数据
-
数据图片化
反爬原理:通过图片展示数据
解决思路:通过使用图片解析引擎从图片中解析数据 -
编码格式
反爬原理: 不使用默认编码格式(通常爬虫使用utf-8格式进行解码)
解决思路:根据源码尝试多种格式解码