1.爬虫
爬虫指的是按照一定规则自动抓取万维网信息的程序。
分类:
- 通用爬虫(爬取尽可能多的站点)
- 聚焦爬虫(爬少量 尽量精确)
步骤:
- 请求指定的URL以获取响应正文
- 解析响应正文内容
- 获取信息并存储
2.反爬虫
在爬虫的各个步骤进行阻拦
3.信息校验型反爬虫(服务器端通过校验请求头或者请求正文中特定的信息)
信息校验主要解决了客户端身份鉴别、数据来源判断和请求的合法性判断等问题,避免数据接收者使用被篡改过的数据,保证数据的有效性
3.1:User-Agent反爬虫
原理:很多编程语言和软件有默认的user-Agent标识,这个标识会被携带在请求头参数中。
实现思路:
- 预先设置黑名单策略,将常见的爬虫关键字记录:python,java等关键字记录
- 将检验逻辑交个nginx处理,nginx校验每一次请求的User-Agent 头域值,如果包含黑名单,则nginx return 403
- 同时可以维护ip黑名单,一旦检测到某user-agent下包含关键字,则将此ip加入ip黑名单
示例:校验成本极小,大部分都会默认带上这种校验吧
3.2:cookie信息反爬虫
原理:大部分的爬虫程序在默认情况下只请求HTML文本资源,它们并不会主动完成浏览器保存Cookie的操作。
实现思路:将javascript和cookie结合使用
- 设定跳板页面,在页面中执行js代码。js代码负责生成一段与nginx校验相对应的随机字符串并存储到cookie中
- 重定向到目标页面,页面发送请求
- nginx配置特定的校验规则和path校验 不通过则否则443
示例:常见的一些cookie校验比如用户信息校验等应该都是一种应用
3.3:通过非对称加密和摘要算法完成对请求数据的加密
原理:前端发请求时的所有数据都是可以通过控制台伪造的。我们通过非对称加密加密 加密数据和时间戳保证了数据的唯一性,通过摘要算法保证了数据的完整性(跟https的加密过程类似)
实现思路:
- 客户端启动,发送请求到服务端,服务端通过RSA生成公钥和私钥
- 客户端拿到公钥后,根据RSA生成公钥和私钥
- 客户端将自己的公钥通过服务端公钥加密发送给服务端
- 客户端和服务端分别用自己的私钥进行数据传输即可 传输过程中可以用md5将数据处理一遍,保证数据的完整性。
示例:之前开发过一个小程序用的就是这种形式的数据传输
3.4:优缺点分析
优点:大部分可以通过nginx配置完成校验,服务器压力小。
缺点:
- 未经过加密的大部分需要校验的信息都是可以伪造的,只能隔绝小部分爬虫手段比较不成熟的爬虫程序。
- 经过加密的数据需要经历加密过程,无论是服务端解密还是客户端加密都会有时间上的消耗,造成客户端反馈时间过长,尤其是对于电商平台需要频繁处理数据请求的时候会造成用户体验不好和增大服务器压力。
- 对于需要加密的js代码,切记在打包过程中要打包成反编译形式,避免爬虫开发者可以获取源代码,从而伪造加密数据。*
3.5:Tips
对于websocket连接或使用其他协议完成的数据传输,都可以借助上述信息校验反爬虫的思想,只是对于加密的字段或者自然携带的字段会不同。
信息校验型反爬虫方案的主要设计主导完成者是服务器开发。对于前端来说,完成按照约定好的方式去传递数据即可。所以如果不配置完善nginx请求拦截服务,服务端的压力会巨巨巨大,而且会巨巨巨缓慢。
4.动态渲染反爬虫
页面或者数据的动态渲染可以天然完成反爬虫的需求,因为普通的爬虫程序是打开页面时,递归或者迭代的去爬取不同的网络请求。
动态请求的接口是需要用户触发某个条件才能去请求新的数据。所以可以天然的避免一些简单的爬虫程序。
但是对立的,有很多库比如 Selenium Splash 等可以获取页面元素 并触发一些交互行为,从而可以主动触发一些动态的接口。完成爬虫需要。
5.文本混淆反爬虫
反爬虫的前提是不能影响用户正常浏览网页和阅读文字内容,直接混淆文本很容易被看出来,所以开发者通常是利用CSS的特性来实现混淆
5.1:图片伪装反爬虫
原理:将某些关键信息通过生成图片的形式插入dom中完成展示,避免爬虫程序通过爬去关键信息。
实现思路:
- 对于关键信息,后端可以直接返回图片,比如手机号码等(图片传输慢&爬虫程序可以自行下载获取 不推荐 差评)
- 也可以前端自行解决,在遇到敏感信息等通过canvas标签生成插入dom中 (墙裂推荐 爬虫程序不可下载 不可通过dom获取 好评)
5.2:CSS偏移反爬虫
原理:利用CSS样式将乱序的文字排版为人类正常阅读顺序的行为。
实现思路:
- 将关键信息进行分组。比如价格信息:467 分成三组 分别是 777(混淆) 6 4
- 分别插入
<b>777</b>
<b>6</b>
<b>7</b>
- 根据字体大小来进行偏移处理
<b style="width:16px;left:-48px">777</b>
<b style="width:16px;left:-32px">6</b>
<b style="width:16px;left:-48px">4</b>
示例:dwz.cn/d05zNKyq (价格信息采用这种反爬虫手段)
5.3:SVG映射反爬虫
原理:是5.1的升级版本。因为矢量图形在缩放上有天然的优势。但是需要前端或者后端维护一套完整的映射关系。
实现思路:
- 前端或者后端已有一套完整的SVG和文字的映射关系
- 对于关键信息 在插入页面的时候 将文字转换成对应关系的svg进行插入
碎碎念:之前美团的web页面对于手机号和地址等敏感信息采用的是这种方式(2020年版本 无从证实),但是目前已经进行没采用这种反爬虫手段了(已证实)。
5.4:字体反爬虫
原理:是5.3的升级版本,font-family可以引入自定义的字体库。将自定义字体应用到网页中重要的数据上,使得爬虫程序无法获得正确的数据。
实现思路:
- 得有一套自定义字体 woff 文件或其他文件
- 完成 自定义字体的编码和unicode编码的 映射关系 ( {key:value} )形式
- 通过font-family 声明使用的字体包(一般设置多个 避免不支持 首个是自定义的字体包 如果自定义字体包没有 则用其他的字体包)
- 在写的时候对于关键字体就可以 通过插入特殊的value了
示例:www.shixiseng.com/interns?key… (工资信息进行了字体反爬)
5.5:优缺点分析
优点:
- 如果图片 svg等资源由前端生成,服务器是无感知的。更利于构建 胖服务端 瘦客户端的应用程序。完成对服务端模块的复用。
- 矢量图和字体都可以完成伸缩展示不变形,并不会影响相应式页面的构建。
缺点:
- 如果整个页面的信息都采用文本混淆反爬的方式进行处理,是不利于seo的。所以尤其是电商平台,文本混淆反爬需要慎用。只能对于某些关键信息比如手机号 价格等关键信息设置文本反爬,其他的比如商品种类,商品名字等信息最好不要进行反爬处理。
- 因为现在OCR技术的完善,爬虫程序完全可以不根据dom结构进行数据处理。直接根据页面内容进行图片截图,再交给OCR服务进行数据提取,此时任何的文本混淆技术都是无法完成反爬的。好消息是成熟的OCR服务目前都是收费的。
6.特征识别反爬虫
特征识别反爬虫是指通过客户端的特征、属性或用户行为特点来区分正常用户和爬虫程序的手段
6.1:WebDriver识别
developer.mozilla.org/zh-CN/docs/…
原理:爬虫程序一般借助浏览器驱动向浏览器发出指令。被控用户代理可以通知文档当前用户代理是由 WebDriver 控制的。navigator.webDriver的值为true。
实现思路:
- 可以为所有的事件请求都设置一层拦截,封装通用hooks处理(更适合在开发新功能或者新平台等时候使用)或者在打包阶段进行处理(自定义loader,通过正则匹配on事件,匹配到则按照规定 =摘取内容进行处理,可以用来防止代码入浸系统代码,也可以解决批量处理的问题) 。
- 拦截代码里可以用来判断 navigator.webDriver的值 如果为真,则触发真实事件,反之拒绝触发
Tips:
- navigator.webdriver只适用于使用WebDriver的渲染工具,对于Splash这种使用WebKit内核开发的渲染工具来说是无效的
- navigator.webdrive的值是可改变的,建议配合user-agent同时检验
- 设置ip黑名单,如果一旦发现有爬虫的程序,就将ip加入黑名单
6.2:利用爬虫程序特征
原理:爬虫程序一般总是希望在最短的时间内完成爬取工作。所以在单位时间内向服务端发出网络请求的次数不是一般的使用者可以达到的。
实现思路:
- 新建nginx辅助配置文件rates.conf
- 在配置文件中加入limit_req_zone限制
6.3:隐藏链接反爬虫
原理:对于页面隐藏元素,普通用户无法触发其事件绑定。但是爬虫应用程序可以。
实现思路:
- 创建黑名单ip 集合数据结构
- 创建隐藏接口,接口逻辑,如果请求到则将请求Ip加入黑名单
- 如果请求ip在黑名单则拒绝响应
6.4:优缺点分析
优点:
- 设计得当 代码入侵程度很小
- 防爬成程度相对而言比较好
缺点:
- 得设计得当
7.验证码
通过验证码机制来限制只有合法用户才可以获取的数据
7.1库:
7.2:一个有趣的验证码:
scportal.taobao.com/quali/h5/qu…
Tips:反爬的前提一定是保证你的源代码是反编译的。如果源代码不是反编译的,爬虫程序可以获得你的程序源代码,那么一切都是白搭。反编译代码的手段有很多比如代码压缩就是一种常见且有效的手段。