精华内容
下载资源
问答
  • Node.JS编程入门写一套反爬虫系统 作者WangLiwen 爬虫网络安全最大的威胁之一 根据爬取数据类型而分爬虫有不少种类比如爬取Email地址的爬取商品价格的爬取图片的而最多的是爬取内容的内容数据爬虫是为泛滥的 爬虫让...
  • 爬虫让很多人对其深感苦恼,今天的Node.JS实战,将实现一种防护性能很强的反爬虫系统。 首先展示防护效果,然后付上完整代码,以了解实现方法。 防护效果展示 根据两个核心思路进行效果展示如下: 1、字体加密...

    爬虫,网络安全最大的威胁之一!

    根据爬取数据类型而分,爬虫有不少种类,比如爬取Email地址的、爬取商品价格的、爬取图片的,而最多的是爬取内容的,内容数据爬虫是为泛滥的!

    爬虫让很多人对其深感苦恼,今天的Node.JS实战,将实现一种防护性能很强的反爬虫系统。

    首先展示防护效果,然后付上完整代码,以了解实现方法。

    防护效果展示

    根据两个核心思路进行效果展示如下:

    1、字体加密

    创建自定义字体库,将字体进行加密。

    举一个最直白的例子:

    比如要在网页中显示文字:“我是我,你是你,她是她”,在正常的情况下,网页中就是存在这几个字,爬虫当然可以爬取。

    我们要实现的效果是,让这几个字不存在,网页源码中可能是:

    但是在网页中可以正常显示:

     

    但是却不可复制,复制后,全部或部分内容将不能正常显示:

    2、字体防破解

    单纯的字体加密,是不太难被破解的,因为上述的“密文乱码符号”,其实也就是一种对应关系,例如:“A”对应“啊”,“B”对应“不”。只要获得足够的对应关系,替换就可以破解还原出原内容。

    具体实施时,可以从网页中获取字体文件。

    如TTF,通过格式转换,化为TTX,即可得到对应关系。

    也可以手动记录对应关系。

    那么对于这两种破解,我们也需要进行防护。

    1、防止字体文件被下载;

    动态字体路径:

    注意以下两图,不同的字体路径:

    即:每次访问都是不同的字体路径,而且,此动态路径文件是不可下载的:

    当然,文件的正常使用是不受影响的。

    2、使用动态对应关系,防止字体对应被获取。

    我们内置一套系统,自动或手动实现编码变化:

    以下两图,两种不同的编码展示,前面部分是编码,后面是对应的字:

    源码展示

    实现以上功能的代码并不复杂,本例由两个文件,一个目录组成:

    acs.js是主文件,内容如下:

    /**
     * Anti Content Splider
     * Auther:WangLiwen
     * www.ShareWAF.com
     */
    
    var fs = require('fs')
    var font_carrier = require("font-carrier")
    var body_parser = require("body-parser")
    var mime = require("mime");
    
    //变码矩阵,存放字和unicode的对应关系
    var transfer_result = require("./config").tramsform_matrix;
    
    /** 
     * TTF变码
     * 基于一种字体,生成另一种新字体
     * 参数:ttf,原始字体
     * 参数:words,要变码的字
     * 参数:new_ttf,新的字体
     * 返回值:新字体中,unicode和字的对应关系 
     */
    function transform_ttf(ttf,words,new_ttf){
    
        //创建新的空字体
        var font = font_carrier.create()
    
        //从ttf字体中获取文字
        var font_transfer = font_carrier.transfer(ttf)
    
        if(words.length==0){
            return{};
        }
    
        var result={};
    
        var key,value,word;
        //遍历传入的参数:要变码的字体
        for(var i=0;i<words.length;i++){
    
            //新的unicode
            key="&#130"+i;
            //unicode对应的字
            value=words[i];
            //字形
            word=font_transfer.getGlyph(words[i]);
    
            //加入到新字体中
            font.setGlyph(key,word);
    
            //输出信息
            result[key]=value;
        }
    
        //输出各种字体文件
        font.output({
            path:new_ttf
        })
    
        //返回值
        return result;
    }
    
    /**
     * express web
     */
    var express = require('express');
    var app = express();
    app.use(body_parser.urlencoded({extended: true}));
    
    var port = 8000;
    var verstion = "0.0.1";
    app.listen(port);
    console.log("anti content splider");
    console.log("v",verstion);
    console.log("server at port:",port);
    console.log("auther:","wangliwen");
    console.log("copyleft","http://www.sharewaf.com");
    
    //变型url特征池,存放要保护的ttf路径,使ttf路径不泄露
    var transform_url = [];
    
    //express中间件
    app.use(function(req,res,next){
    
        console.log(req.url,req.method);
    
        if(req.method.toString().toLowerCase() == "get"){
            //只处理get请求
    
            //url
            var url = req.url;
    
            //首页访问
            if(url == "/"){
                url = "./admin/index.html"
            }else{
                url = "./admin" + url;
            }
    
            //变形url池
            console.log(transform_url);
    
            //把变形的url路径还原回去
            for(var i=0; i<transform_url.length; i++){
    
                //当前url,是否包含有变形池中的某条特征内容
                if(url.indexOf(transform_url[i]) != -1){
    
                    //当前时间
                    var visit_time = (new Date).getTime();
    
                    //访问时间 - 生成时间变量
                    console.log((visit_time - transform_url[i]))
    
                    //超过一定时间访问,视为非法
                    //原理:打开html时,会立刻引用页面中引用的ttf,时间间隔不会超过100毫秒
                    if((visit_time - transform_url[i]) > 100){
                        res.end("oooops");
                        return;
                    }
    
                    //还原路径
                    url = url.replace(new RegExp(transform_url[i],"g"), "font_dest");
                    console.log("before:",transform_url)
    
                    //删除使用过的时间变量
                    delete transform_url[i];
                    transform_url.splice(i,1);
    
                    console.log("after:",transform_url)
                }
                
            }
    
            //真实地址
            console.log("really url:",url);
    
            //读取文件内容
            var file_content = fs.readFileSync(url)  
    
            //测试html文件
            if(url.indexOf("/test.html") !=- 1){
                //如果是此html文件,则对文件中的原始字体路径做保护
    
                //网页源码
                file_content = file_content.toString();
    
                //遍历变码矩阵,对网页中的文字进行变码
                for (var index in transfer_result){
                    console.log(index,transfer_result[index]);
                    
                    //正则全局替换
                    file_content = file_content.replace(new RegExp(transfer_result[index],"g"), index+";");
                }
    
                
                var count = (file_content.split('font_dest')).length - 1;
                console.log("replaced:",count);
    
                //以时间做为参照值
                var time_parm = (new Date).getTime();
                //字体路径保护,将正确路径font_dest替换为时间值
                file_content = file_content.replace(new RegExp("font_dest","g"), time_parm);
                
                //存入变型url特征池
                for(var i=0; i<count; i++){
                    transform_url.push(time_parm);
                }
                               
            }
    
            //内容head,写入mime
            res.writeHead(200,{"content-type":mime.getType(url)});
            console.log(url, "mime:", mime.getType(url));
    
            //内容
            res.write(file_content); 
            
            res.end();  
            
        }else{
            //get之外请求
            next();
        }
    })
    
    //post操作
    app.post("/transform_ttf",function(req,res){
        console.log(req.body);
    
        //前端传入的、要变码的字
        var transform_words = req.body.transform_words.toString().split(",");
    
        //默认变码符号
        transform_words.push("。");
    
        //源和目标字体目录
        var ttf = "./admin/font_src/" + req.body.font_src;
        var new_ttf = "./admin/font_dest/" + req.body.font_dest;
    
        //变码结果
        transfer_result = transform_ttf(
            ttf,
            transform_words,
            new_ttf
        );
    
        console.log(transfer_result);
    
        //写入文件,给其名称:变码矩阵
        fs.writeFileSync("./config.js","exports.tramsform_matrix="+ JSON.stringify(transfer_result));
        res.send("transform complete!");
    });
    
    /**
     * express,结束
     */

    代码中已有详细注释。

    config.js是字体编码与文字对应关系,源码中称为“变码距阵”,内容如下:

    exports.tramsform_matrix={"Ԕ":"我","ԕ":"你","Ԗ":"他","ԗ":"只","Ԙ":"保","ԙ":"码","Ԛ":"用","ԛ":"。"}

    注:当进行动态变码操作时,此文件内容会发生变化。

    admin目录下,是几个静态网页文件:

    index.html内容如下:

    <html>
        <head>
            <meta charset="utf8">
            <title>anti content splider</title>
        </head>
        <body>
            <form method="post" action="/transform_ttf" target="_blank">
                原始字体:<input id="font_src" name="font_src" type="text" value="KaiGenGothicSC-Normal.ttf" /><br>
                变码字体:<input id="font_dest" name="font_dest" type="text" value="font1" /><br>
                变码文字:<input id="transform_words" name="transform_words" type="text" value="我,你,他,只,保,码,用" /><br>
                <br>
                <input type="submit" value="Transform!"/>
            </form>
        </body>
    </html>

    test.html是用于测试,展示变码效果的文件,内容如下:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>字体测试</title>
    </head>
    <body>
    <div>
    <style>
      @font-face {
        font-family: "font1";
        src: url("font_dest/font1.eot"); /* IE9 */
        src: url("font_dest/font1.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
        url("font_dest/font1.woff2") format("woff2"),
        url("font_dest/font1.woff") format("woff"),
        url("font_dest/font1.ttf") format("truetype"), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
        url("font_dest/font1.svg#iconfont"); /* iOS 4.1- */
      }
      .font-1{
        font-family:"font1";font-size:16px;font-style:normal;
      }
    </style>
      <div class="font-1">&#1300;是&#1300;,&#1301;是&#1301;,&#1302;是&#1302;,她是她&#1307;</div>
      <div class="font-1">ShareWAF(sharewaf.com)不&#1303;是WAF!</div>
      <div class="font-1">JS代&#1305;&#1304;护?混淆?加密,当然&#1306;JShaman(jshaman.com)!</div>
    </div>
    </body>
    </html>
    

    以上,是完整的动态字体变码加密反爬虫方案,出自于ShareWAF,与ShareWAF运营的商业反爬虫产品:ShareWAF-ACS,原理甚本一至。由此可知,本文是相当有价值的技术资料。

    展开全文
  • 反爬虫监控系统 思路: 数据源 nginx 获取客户端的请求 lua脚本收集nginx获取的请求的数据推送到kafka(ps:lua脚本在收集数据时采用’$CS#'进行拼接) 数据处理模块: 数据处理 数据切分:获取kafka的数据,按照’#...

    反爬虫监控系统

    思路:

    数据源

    1. nginx 获取客户端的请求 lua脚本收集nginx获取的请求的数据推送到kafka(ps:lua脚本在收集数据时采用’$CS#'进行拼接)
      数据处理模块:

    数据处理

    1. 数据切分:获取kafka的数据,按照’#CS#'进行切分,并封装到AccessLog对象中(其中的jessionId和userId需要从http_cookie中单独提取出来)
    2. 链路统计:1.计算每台nginx的数据量->根据server_addr直接进行统计 2.统计活跃连接数->由于活跃连接数时递增的,只需要取出最后一个值即可。reduceByKey((x,y)=>y),
      最后需要将结果存入到redis中,并设置过期时间=24h
    3. 数据清洗:获取mysql的过滤规则(过滤掉请求中不需要的文件,例如jpg,gif,png),进行广播。通过在redis中设置flag,对数据库的规则实时监控,
      当规则变化时,标志发生变化,去更新规则,重新广播。将从kafka获取的数据进行规则匹配,过滤掉规则内的文件
    4. 数据脱敏:本项目中涉及的敏感数据为:身份证,手机号。从过滤后的数据中对http_cookie进行
      正则匹配,格式为 ‘=phone;’ 和 ‘=IdCard;’ 进行md5加密,进行替换
    5. 数据分类:根据需求,数据分为 国内查询(0,0),国际查询(1,0),国内预定(0,1),国际预定(1,1)
      获取数据库中的分类规则,分别获取到了四种规则,封装到一个Map进行广播
      通过在redis设置flag,实时监控数据库规则变化
      通过request对规则进行匹配,打上对应的标签 封装到 RequestType(代表查询预定标签)
      通过对http_referer中的时间个数的判断,打标签(单程-> 0,往返-> 1)
    6. 数据解析:获取数据库中的解析规则(查询规则和预定规则),封装到一个Map广播并实时监控,根据上述打的对应的标签对规则进行匹配,执行相应的解析
    展开全文
  • 爬虫与反爬虫技术分析

    千次阅读 2020-02-27 11:28:15
    科普: 什么是爬虫: 百度百科:网络爬虫(又被称为...什么是反爬虫: 百度百科:很多网站开始保护他们的数据,他们根据ip访问频率,浏览网页速度,账户登录,输入验证码,flash封装,ajax混淆,js加密,图片,cs...

    科普:

    什么是爬虫:

    • 百度百科:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫
      什么是反爬虫:
      百度百科:很多网站开始保护他们的数据,他们根据ip访问频率,浏览网页速度,账户登录,输入验证码,flash封装,ajax混淆,js加密,图片,css混淆等五花八门的技术,来对反网络爬虫
      在这里插入图片描述

    爬虫带来的安全风险:

    安全侧:
    1.数据资产泄漏
    2.竞争对手竞品分析
    3.恶意扫描
    4.渗透测试
    后端服务侧:
    1.服务压力上升
    2.服务能力下降
    运营侧:
    1.业务价值输出降低
    2.羊毛党褥羊毛成本降低
    3.运营统计数据失真
    爬虫攻击角度:
    网络安全界向来就有“不知攻焉知防”的说法,因此想要理解反爬虫,有必要先学习爬虫,熟悉爬虫攻击手法,便于更好的防御。爬虫的目的通常是以较低的成本和较高的效率获取信息
    相关技术:
    1.Apache Nutch 分布式爬虫
    2.Java爬虫:Crawler4j、WebMagic、WebController
    3.python爬虫:scrapy、selenium+phantomJS (HeadlessBrowsers)、截图+OCR、
    4.在 Headless Browser 运行时里预注入一些js逻辑,伪造浏览器的特征
    爬虫特征:
    1.User-Agent 没有携带 或者User-Agent 为某些特殊的值 或者有一定的规律
    2.Referer 没有 或者Referer 错误
    3.同一IP短时间内多次访问同一页面
    4.同一账户短时间内多次进行相同操作
    5.同一页面短时间内访问量突增并且有规律
    爬虫通用架构:
    爬虫从待抓取URL队列依次读取,并将URL通过DNS解析,把链接地址转换为网站服务器对应的IP地址。然后将其和网页相对路径名称交给网页下载器,网页下载器负责页面的下载。对于下载到本地的网页,一方面将其存储到页面库中,等待建立索引等后续处理;另一方面将下载网页的URL放入已抓取队列中,这个队列记录了爬虫系统已经下载过的网页URL,以避免系统的重复抓取。对于刚下载的网页,从中抽取出包含的所有链接信息,并在已下载的URL队列中进行检查,如果发现链接还没有被抓取过,则放到待抓取URL队列的末尾,在之后的抓取调度中会下载这个URL对应的网页。如此这般,形成循环,直到待抓取URL队列为空

    反爬虫防御角度:

    相关技术:
    1.前端反爬虫:
    只是提高了恶意爬虫拿到真实数据的难度,并不能起到禁止爬虫的作用。截图+OCR的爬虫无法防御
    1.1 方案一
    页面使用font-face重新定义了字符集,并通过unicode去映射展示,爬虫者必须同时爬取字符集,才能识别出数字,每次刷新页面,字符集的url刷新。使爬虫的难度大大增加
    优势:前端通过一些复杂的转换可以大大提高chromium爬虫的难度
    缺陷: 1…前端需要对数字运算的场景无法使用
    1.2 方案二
    和上面的重新定义字符集类似。可以不采用unicode去映射。而是采用重新定义数字的方案。不影响前端进行数字运算(去哪儿网APP端方案)
    1.3方案三
    利用css样式替换文字
    1.4 方案四
    Headless Chrome 特性检测
    Headless Chrome由于其自身就是一个chrome浏览器,因此支持各种新的css渲染特性和js运行时语法。基于这样的手段,爬虫作为进攻的一方可以绕过几乎所有服务端校验逻辑,但是这些爬虫在客户端的js运行时中依然存在着一些破绽,诸如:
    基于plugin对象的检查
    if(window.navigator.webdriver) {
    console.log(‘It may be Chrome headless’);
    }
    基于language的检查
    if(window.navigator.languages.length == 2) {
    console.log(‘Chrome headless detected’);
    }
    “navigator.plugins.length”此参数可以检测selenium的headless模式,headless模式下为0
    if(window.navigator.plugins.length == 0) {
    console.log(‘Chrome headless detected’);
    }
    基于以上的一些浏览器特性的判断,基本可以通杀市面上大多数 Headless Browser 程序。在这一层面上,实际上是将网页抓取的门槛提高,要求编写爬虫程序的开发者不得不修改浏览器内核的C++代码,重新编译一个浏览器
    这些特性有些也是可以伪造的,那么如何防止伪造浏览器特征呢?有一个方案是在代码执行前判断调用的方法是否是浏览器原生的
    1.5 方案五:
    基于浏览器的 UserAgent 字段描述的浏览器品牌、版本型号信息,对js运行时、DOM和BOM的各个原生对象的属性及方法进行检验,观察其特征是否符合该版本的浏览器所应具备的特征(浏览器指纹检查)
    1.6 方案六:
    前端反调试
    [ ] 通过对浏览器禁止调试从而达到别人无法分析请求接口的目的,场景为打开控制台查看Network,不断的debugger使其无法被查看

    • 不停地打断,页面跳到source页面,阻止查看代码
    • 断点产生不可回收的对象,占据你的内存,造成内存泄漏,没过多久浏览器就会卡顿
      2.中间层反爬虫:
      在客户端与服务器之间设置拦截过滤,有效减少服务器端的压力 (实现方式类似nginx-waf)
      中间层反爬虫取代了后端反爬虫,在一些简单系统里反爬虫可能直接后端实现了。但是将反爬虫做成平台化还是要和后端做解耦
      2.1 对Headers的User-Agent进行检测
      (根据User-Agent 来鉴别你的http header中的各个字段是否符合该浏览器的特征)
      缺点:UA可以伪造,而且比较难校验
      2.2 设备指纹
      Fingerprint.js 是最先进的开源欺诈检测JS库
      useragent用户代理language语言种类colordepth目标设备或缓冲器上的调色板的比特深度devicememory设备内存pixelratio设备像素比hardwareconcurrency可用于运行在用户计算机上的线程的逻辑处理数量screenresolution当前屏幕分辨率availablescreenresolution屏幕宽高timezoneoffset本地时间与GMT时间差timezone时区sessionstorage是否会话存储localtorage是否具有本地存储addbehaviorIE是否指定AddBehavioropendatabase是否有打开的DBcpuclass浏览器系统cpu等级platform运行浏览器的操作系统donottrackdo-not-track设置plugins浏览器插件信息canvas使用Canvas 绘图webglWEBGL指纹信息webglvendorandrenderer具有大量熵的WebGL指纹的子集adblock是否安装AdBlockhasliedlanguages用户是否篡改了屏幕分辨率hasLiedOs是否篡改了操作系统hasliedbrowser用户是否篡改了浏览器touchsupport触摸屏检测fonts字体列表fontsflash已安装的flash字体列表audio音频处理enumeratedevices可用的多媒体输入和输出设备的信息
      2.3 cookie检测
      将设备指纹,服务端下发认证 set进cookie,对cookie的访问频率 限制
      cookie可以有效解决用户标识问题
      2.4 IP检测
      通过IP风险库判断是恶意IP进行黑名单,IP策略无法有效防御动态切换IP的场景
      缺点:IP防御误封率高
      2.5 接口频率控制
      比较初级的爬虫常常通过快速的访问某一些页面,获取其中的关键信息。通过对页面设置访问频率基线,可以对此类爬虫起到一定的防御作用
      在这里插入图片描述
      几乎所有业务接口的访问量都是随着时间变化的,如何设定访问频率阈值,这将是一项巨大的挑战。对于没有分时段阈值的系统,为了避免业务受到影响,通常会根据业务峰值数据上调10%-20%,做为阈值上限,但在非业务高峰时段,爬虫行为很难触发这个域值。另外,周期性的业务变化和非周期性的业务变化也需要考虑。对应的阈值必须能够与业务保持同步变化,才能较好的保证阈值的有效性。总体来说频率限制的特点是初期的上线成本较低,但后期阈值的运营成本会不断上升,且防御效果也比较有限。
      2.6 JS-Injection
      这个方法也是目前业界广泛使用的,在第一次访问请求时,返回注入的js,js执行一些计算逻辑,并将其放入cookie,再次发起请求验证,验证成功后,server向client发放一个token放在cookie里,以后的所有请求都需要携带该cookie标识已认证为非bot身份
      在这里插入图片描述
      2.7 加密ajax参数
      对请求接口返回的json数据进行加密也是一种防爬虫的手法
      2.8 部分功能部分封装到接口中
      缺陷:chromium 爬虫防范效果差一些,不过chromium爬虫效率低下,需要配合前端对chromium的检测
      2.9 轨迹模型
      对用户浏览网页过程中产生的轨迹 进行机器学习判断是人还是机器,轨迹+CNN算法判断
      2.10 ZoombieCookie
      僵尸cookie是指那些删不掉的,删掉会自动重建的cookie。僵尸cookie是依赖于其他的本地存储方法,例如flash的share object,html5的local storages等,当用户删除cookie后,自动从其他本地存储里读取出cookie的备份,并重新种植。
      zoombie cookie + 设备指纹 = 唯一用户
      使用ZoombieCookie 持久化存储Cookie 增加用户伪造难度,解决设备指纹无法完全标识用户问题
      2.11 用户画像
      通过用户注册信息,结合用户的历史行为数据,对用户进行画像。从而分析用户的异常行为
      2.12 反爬虫蜜罐
      威胁情报一方面可以依靠反爬虫蜜罐,一个设置巧妙的蜜罐会极大的提升反爬虫系统的效率和准确性,反之,不仅起不到什么作用甚至可能会影响正常用户
      2.13 Canvas 的指纹
      Canvas是HTML5中动态绘图的标签。基于Canvas绘制特定内容的图片,使用canvas.toDataURL()方法返回该图片内容的base64编码字符串。对于PNG文件格式,以块(chunk)划分,最后一块是一段32位的CRC校验,提取这段CRC校验码便可以用于用户的唯一标识。
      测试结果表明,同一浏览器访问该域时生成的CRC校验码总是不变,基于HTML Canvas生成的UUID可以有效的用于用户追踪技术

    风险拦截:

    对已经确定为爬虫的请求进行防御操作
    1.验证码
    各种各样、千奇百怪的验证码。数字、字母加干扰线、噪点,字母重叠摆放,文字点选,滑动拼图,图片选择,点击验证,鼠标轨迹等等,无论何种形式的验证码,其根本目的都是为了实现人机识别,通过交互来验证发起请求的是人还是机器
    2.短信(邮件)
    其目的和方式与图形(点选)验证码基本相同,只是在实现方法上略有差异,用户需要通过第三方平台(手机号或邮箱)进行用户身份验证,短信邮件独立拿出来说一下。是因为一般情况下,使用图形(点选)验证码,用户可以在3-5秒内完成验证动作。短信验证验证码的验证时间在10-15秒左右,邮件和短信验证码的验证时都会在30秒以上。因此,这类验证方式对用户体验有相对较大的影响,防御效果总体优于图形验证码
    3.假数据:
    针对恶意用户制造假数据
    4.封禁
    直接封禁恶意用户
    5.监控:
    监控恶意用户,进行恶意分析
    反爬虫系统设计:
    分析了3个反爬虫架构,架构大体上都非常的相似,其实和waf的实现雷同。这是其中一个架构图
    在这里插入图片描述

    法律层面:

    数据安全管理办法(征求意见稿)
    第十六条 网络运营者采取自动化手段访问收集网站数据,不得妨碍网站正常运行;此类行为严重影响网站运行,如自动化访问收集流量超过网站日均流量三分之一,网站要求停止自动化访问收集时,应当停止。
    反爬厂商:
    瑞数,百度,极验,白山,知道创宇,邦盛科技,岂安

    写在最后

    对网页内容的抓取与反制,注定是一个魔高一尺道高一丈的猫鼠游戏,你永远不可能以某一种技术彻底封死爬虫程序的路,你能做的只是提高攻击者的抓取成本,并对于未授权的抓取行为做到较为精确的获悉。

    展开全文
  • 不同类型的网站都有不一样的反爬虫机制,判断一个网站是否有反爬虫机制需要根据网站设计架构、数据传输方式和请求方式等各个方面评估。下面是常用的反爬虫机制。 用户请求的Headers。 用户操作网站行为。 网站目录...

    不同类型的网站都有不一样的反爬虫机制,判断一个网站是否有反爬虫机制需要根据网站设计架构、数据传输方式和请求方式等各个方面评估。下面是常用的反爬虫机制。

    1. 用户请求的Headers。
    2. 用户操作网站行为。
    3. 网站目录数据加载方式。
    4. 数据加密。
    5. 验证码识别。

    网站设置的反爬虫机制不代表不能爬取数据。

    1、基于用户请求的Headers
    从用户请求的Headers反爬虫是最常见的反爬虫机制。很多网站会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。
    如果遇到了这类反爬虫机制,就可以在爬虫代码中添加Headers请求头,将浏览器的请求信息以字典的数据格式写入爬虫的请求头。对于检测Headers的反爬虫,在爬虫发送请求中修改或者添加Headers就能很好的解决
    2、基于用户操作网站行为
    有一部分网站是通过检测用户行为来判断用户行为是否合规。网站服务器会根据已设定的判断条件判断访问间隔是否合理,从而达到用户行为是否合理。遇到用户行为判断这种情况,可使用IP代理,IP可在IP代理平台上通过API接口获取,每个请求几次更换一个IP,这样就能很容易地绕过第一种反爬虫。还有一种解决方案是在没吃请求间隔几秒后再发送下一次请求。只需要在代码里面加一个延时功能就可以简单实现,有些有逻辑漏洞的网站可以通过请求多次、退出登录、重新登录、继续请求来绕过同一个账号短时间内不能多次进行相同请求的限制。

    3、基于网站目录数据加载方式
    上述几种情况大多数都出现在静态页面,还有一部分网站是由Ajax通过访问接口的方式生成数据加载到网页。遇到此情况,首先分析网站设计,找到Ajax请求,分析具体请求参数和响应的数据结构及其含义,在爬虫中模拟Ajax请求,就能获取所需数据。
    4、基于数据加密
    对于网站把请求参数加密处理的情况,这种情况可以先找到加密代码,加密代码主要是JavaScript实现的,分析代码的加密方式,然后在爬虫代码中模拟其加密方式,再发送请求。这是最优解决方案,但是花费时间较多难度较大。
    另一种解决方案,使用Selenium+PhantomJS框架(自动化测试技术),调用浏览器内核,利用Selenium模拟人为操作网页并触发页面中的JS脚本,完整的实现自动化操作网页,数据是从网页上自动获取的。这种框架几乎能绕过大多数反爬虫,因为PhantomJS一个没有界面的浏览器。一般情况下不用。
    5、基于验证码识别
    最有效的反爬虫技术就是验证码,目前对复杂的验证码还没有做到很好地识别验证,只能通过第三方平台处理或者OCR技术(光学字符识别)识别

    展开全文
  • 现在很多购票网站在互联网提供查询、预定等服务,有大量用户访问的同时,也存在着大量爬虫爬虫消耗了系统资源,但是没有转化为销量,导致系统资源虚耗,严重时造成系统波动,影响正常用户访问购票。通过日志分析,...
  • 有矛就有盾,每家公司也相应的需要反爬虫系统来达到数据保护、系统稳定性保障、竞争优势保持的目的。然而,一方面防守这事ROI不好体现,另一方面反爬虫这种系统,相对简单的爬虫来说难度和复杂度都要高很多,往往...
  • 大众点评反爬虫解析

    千次阅读 2020-08-10 18:34:22
    记大众点评反爬虫解析 首先声明:博客内容禁止用于商业用途,仅做学习交流。如果侵犯了您的利益和权益,请联系我,我将删除该博客。 最近用大众点评网页版时,发现大众点评上所有的店家的信息都是无法复制的(后知后...
  • 爬取的项目流程 角度一: 角度二: 其中,角度一和角度二说的是同一件事情
  • 随着我们的生活、工作越来越多的线上化、数字化,线上数据也越来越多,为了限制伪装技术越来越强的爬虫访问和恶意占座行为,就需要我们的反爬虫技术。 目前我国反爬虫人才稀缺,随之而来的是..
  • 关于反爬虫,看这一篇就够了

    万次阅读 多人点赞 2016-07-04 13:12:27
    编者:本文来自携程酒店研发部研发经理崔广宇在第三期【携程技术微分享】上的分享,以下为...当你看到“爬虫”两个字的时候,是不是已经有点血脉贲张的感觉了?千万要忍耐,稍稍做点什么,就可以在名义上让他们胜利,
  • 一、主题式网络爬虫设计方案 1.主题式网络爬虫名称:爬取网易云音乐歌单 2.主题式网络爬虫爬取的内容与数据特征分析 爬取网易云音乐歌单前十页歌单,轻音乐类型的歌单名称、歌单播放量、歌单链接、用户名称。 分析...
  • 网页爬虫系统.zip

    2021-03-25 09:44:29
    本程序智能识别爬虫,防止爬虫系统造成大的负载,也可用于访问请求的限流。 爬虫识别策略: 1.实时策略:访问者ip单位时间内访问次数,超过设定阀值的ip列入观察名单;观察名单中的访问着在下一单位时间内继续...
  • 常见的一些反爬虫策略破解方式-Java网络爬虫系统性学习与实战系列(11) 文章目录联系方式概述通过User-Agent校验反爬最全User-Agent设置访问频率限制IP限制Cookie限制Referer通过蜜罐资源反爬动态变换网页结构基于...
  • java web系统网页爬虫程序 简介:一些智能的搜索引擎爬虫的爬取频率比较合理,对网站资源消耗比较少,但是很多糟糕的网络爬虫,对网页爬取能力很差,经常并发几百个请求循环重复抓取,这种爬虫对中小型网站经常...
  • 线上系统反爬虫方案

    2021-07-01 00:35:56
    看到点思路,记一下,后续慢慢扩充。反爬的几种 限流 选头 工学验证 强制签名 特殊值 不可视像素 。
  • Linux系统、网络反爬虫、监控管理——python自动化运维.html
  • kk-anti-reptile 是适用于基于 spring-boot 开发的分布式系统的开源反爬虫接口防刷组件。 开源地址 系统要求 基于 spring-boot 开发(spring-boot1.x, spring-boot2.x 均可) 需要使用 redis 工作流程 kk-anti-reptile...
  • 本文实例讲述了Python3爬虫学习之应对网站反爬虫机制的方法。分享给大家供大家参考,具体如下: 如何应对网站的反爬虫机制 在访问某些网站的时候,网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫,用来...
  • 我们所处的互联网, 是一个爬虫的世界。任何一个小公司,小团队,甚至一个应届毕业生,都有可能编写爬虫,偷偷的获取数据。 当你看到“爬虫”两个字的时候, 就应该有点血脉贲张的感觉了。 爬虫就如同病毒一样...
  • Python 3反爬虫原理与绕过实战

    千次阅读 2020-12-03 16:58:28
    第 1章 开发环境配置 11.1 操作系统的选择 11.1.1 Ubuntu 简介 11.1.2 VirtualBox 的安装 21.1.3 安装 Ubuntu 31.1.4 全屏设置 81.1.5 Python 设置 91.2 练习平台 Steamboat 101.2.1 安装 Docker 111.2.2 ...
  • Python爬虫理论 | (5) 反反爬虫技术

    千次阅读 2019-07-06 15:17:39
    1. 爬虫、反爬虫与反反爬虫 2.常见的反爬虫技术 3.Selenuim库 4.实战 1. 爬虫、反爬虫与反反爬虫 爬虫 自动获取网页信息的程序。 反爬虫 阻止爬虫程序获取网页信息的程序。 反反爬虫 应对反爬虫程序,爬取...
  • 最全反爬虫技术介绍

    2020-12-06 14:36:23
    反爬虫的技术大概分为四个种类:注:文末有福利!一、通过User-Agent来控制访问:无论是浏览器还是爬虫程序,在向服务器发起网络请求的时候,都会发过去一个头文件:headers,比如知乎的requestsheaders:Accept:text...
  • 反爬虫技术

    2017-03-13 11:28:18
    因为搜索引擎的流行,网络爬虫已经成了很普及网络技术,除了专门做搜索的Google,Yahoo,微软,百度以外,几乎每个大型门户网站都有自己的搜索引擎,大大小小叫得出来名字得就几十种,还有各种不知名的几千几万种,...
  • 反爬虫 反爬虫 是网站限制爬虫的一种策略。它并不是禁止爬虫(完全禁止爬虫几乎不可能,也可能误伤正常用户),而是限制爬虫,让爬虫在网站可接受的范围内爬取数据,不至于导致网站瘫痪无法运行。而且只要是爬虫获取...
  • 网站如何反爬虫浅析

    千次阅读 2018-07-24 16:58:35
    要想做爬虫,必须要先了解如何反爬虫,知道了这些,我们才能更好的做爬虫! 因为搜索引擎的流行,网络爬虫已经成了很普及网络技术,除了专门做搜索的Google,Yahoo,微软,百度以外,几乎每个大型门户网站都有自己...
  • 首页专栏java文章详情0这款spring-boot反爬虫组件让你不用担心网站再被爬Github导航站发布于 今天 02:26大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,238
精华内容 6,895
关键字:

反爬虫系统

爬虫 订阅