zoukankan      html  css  js  c++  java
  • 反爬虫机制

    爬虫&反爬虫

    什么是爬虫和反爬虫?

    • 爬虫:使用任何技术手段,批量获取网站信息的一种方式。关键在于批量。

    • 反爬虫:使用任何技术手段,阻止别人批量获取自己网站信息的一种方式。关键也在于批量。

    • 误伤:在反爬虫的过程中,错误的将普通用户识别为爬虫。误伤率高的反爬虫策略,效果再好也不能用。

    • 拦截:成功地阻止爬虫访问。这里会有拦截率的概念。通常来说,拦截率越高的反爬虫策略,误伤的可能性就越高。因此需要做个权衡。

    • 资源:机器成本与人力成本的总和。

    简单爬虫

    通常编写爬虫需要经过这么几个过程:
    ——————————————————

    • 分析页面请求格式

    • 创建合适的http请求

    • 批量发送http请求,获取数据

    ——————————————————

    高级爬虫

    那么爬虫进阶应该如何做呢?通常所谓的进阶有以下几种:

    • 分布式

    通常会有一些教材告诉你,为了爬取效率,需要把爬虫分布式部署到多台机器上。这完全是骗人的。分布式唯一的作用是:防止对方封IP。封IP是终极手段,效果非常好,当然,误伤起用户也是非常爽的。

    • 模拟JavaScript

    有些教程会说,模拟javascript,抓取动态网页,是进阶技巧。但是其实这只是个很简单的功能。因为,如果对方没有反爬虫,你完全可以直接抓ajax本身,而无需关心js怎么处理的。如果对方有反爬虫,那么javascript必然十分复杂,重点在于分析,而不仅仅是简单的模拟。

    换句话说:这应该是基本功。

    • PhantomJs

    这个是一个极端的例子。这个东西本意是用来做自动测试的,结果因为效果很好,很多人拿来做爬虫。但是这个东西有个硬伤,就是:效率。此外PhantomJs也是可以被抓到的。

    传统反爬虫手段

    1、后台对访问进行统计,如果单个IP访问超过阈值,予以封锁。

    这个虽然效果还不错,但是其实有两个缺陷,一个是非常容易误伤普通用户,另一个就是,IP其实不值钱,几十块钱甚至有可能买到几十万个IP。

    2、后台对访问进行统计,如果单个session访问超过阈值,予以封锁。

    这个看起来更高级了一些,但是其实效果更差,因为session完全不值钱,重新申请一个就可以了。

    3、后台对访问进行统计,如果单个userAgent访问超过阈值,予以封锁。

    高级反爬虫手段

    数据加密解密:
    按照自己定义方法进行数据加密再解密
    ——————————————————

    • 服务端:数据的加工处理
    • 前端:通过接口数据进行解析
    • 服务端:接口数据的生产
    • 服务端:路由设置

    ——————————————————

    反爬手段再升级

    上面说的方法主要是针对数字做的反爬手段,如果要对汉字进行反爬怎么办?接下来提供几种方案

    方案1: 对于你站点频率最高的词云,做一个汉字映射,也就是自定义字体文件,步骤跟数字一样。先将常用的汉字生成对应的 ttf 文件;根据下面提供的链接,将 ttf 文件转换为 svg 文件,然后在下面的“字体映射”链接点进去的网站上面选择前面生成的 svg 文件,将svg文件里面的每个汉字做个映射,也就是将汉字专为 unicode 码(注意这里的 unicode 码不要去在线直接生成,因为直接生成的东西也就是有规律的。我给的做法是先用网站生成,然后将得到的结果做个简单的变化,比如将“e342”转换为 “e231”);然后接口返回的数据按照我们的这个字体文件的规则反过去映射出来。

    方案2: 将网站的重要字体,将 html 部分生成图片,这样子爬虫要识别到需要的内容成本就很高了,需要用到 OCR。效率也很低。所以可以拦截钓一部分的爬虫

    方案3: 看到携程的技术分享“反爬的最高境界就是 Canvas 的指纹,原理是不同的机器不同的硬件对于 Canvas 画出的图总是存在像素级别的误差,因此我们判断当对于访问来说大量的 canvas 的指纹一致的话,则认为是爬虫,则可以封掉它”。

    步骤点:

    1. 先根据你们的产品找到常用的关键词,生成词云
    2. 根据词云,将每个字生成对应的 unicode 码
    3. 将词云包括的汉字做成一个字体库
    4. 将字体库 .ttf 做成 svg 格式,然后上传到 icomoon 制作自定义的字体,但是有规则,比如 “年” 对应的 unicode 码是 “u5e74” ,但是我们需要做一个 恺撒加密 ,比如我们设置 偏移量 为1,那么经过恺撒加密 “年”对应的 unicode 码是“u5e75” 。利用这种规则制作我们需要的字体库
    5. 在每次调用接口的时候服务端做的事情是:服务端封装某个方法,将数据经过方法判断是不是在词云中,如果是词云中的字符,利用规则(找到汉字对应的 unicode 码,再根据凯撒加密,设置对应的偏移量,Demo 中为1,将每个汉字加密处理)加密处理后返回数据
    6. 客户端做的事情:
      • 先引入我们前面制作好的汉字字体库
      • 调用接口拿到数据,显示到对应的 Dom 节点上
      • 如果是汉字文本,我们将对应节点的 css 类设置成汉字类,该类对应的 font-family 是我们上面引入的汉字字体库

    ——————————————————
    资料收集源于网络方便个人学习记录使用:
    参考链接

    爱,就是你和某个人一起经历的一切。
  • 相关阅读:
    socket 编程练习--UDP聊天程序
    练习 多线程
    练习二:求最大公约数
    练习一:单链表的反转,串的模式匹配
    【算法1】string 的全排列
    lw资料
    SDmenu滑动菜单获取导航连接部分代码
    FileOperate(个人资料)
    C/C++基本数据类型
    C++/MFC计算程序运行时间
  • 原文地址:https://www.cnblogs.com/afly-8/p/13561132.html
Copyright © 2011-2022 走看看