zoukankan      html  css  js  c++  java
  • ADBlock的实现原理

    ADBlock的实现原理

    ADBlock的实现基于以下两种情况进行拦截:

            1)对URL请求的拦截,这种URL广告一般是网页中div元素嵌入了一个iframe/image元素,然后加载一个广告链接或者GIF图片。如CSDN博客网站:http://blog.csdn.net/cteng/article/details/42681299

     

            右下角的一个小广告,其dom代码:

     http://f12.baidu.com/it/u=1775265002,2744098895&fm=76id="img_10" class="figure"style="opacity: 1;">,这是百度广告联盟的广告。

             AdBlock对于页面内容的广告过滤是特定于网站的(事先写好过滤的filter,即过滤规则),对domain字符串的进行精确匹配。其作者用JavaScript把这些URL匹配规则映射为了正则表达式,然后再用正则表达式对目标URL进行匹配过滤。这类似于哈希表一样,在匹配的时候,按照相同的方法将URL,分成一些keyword,然后通过keyword去找对应的filter,最后再匹配找到的filter。这样就不需要遍历规则表,大大地提高了匹配时间。

             2)对于页面DOM嵌入广告内容的处理,这种一般是通过CSS3 Selector定位到这些DOM元素,然后设置其display等于none !important。思考:对于简单的DOM元素处理,有个问题是会出现ajax加载延迟,如果通过setTimeOut等几秒后才注入执行Js脚本,可能有些内容尚未加载出来,清除不彻底,但是如果使用setInterval隔一段事件持续注入Js脚本的话又会影响性能。最好是在浏览器内核里做一个DOM Mutation事件监控的daemon:如果检测到有新的DOM节点加入,当然必须是在DOM Content Loaded之后,就发送一个通知给客户端,客户端再调度广告屏蔽脚本的重新执行。这样在彻底清除广告的同时,又降低对性能的影响。

           此外除了ADBlock自身过滤广告的方式,网上还有以下几个有趣的方案:

           1)引入协作式过滤:当用户标明网页中的某个元素属于广告,那么,浏览器内核可以智能地定位到这个DOM元素,并生成一个有效的CSS Selector,这样就可以动态地扩展用户的本地过滤规则库,然后再通过上传到云端服务器形成大数据,从中挖掘出公共的广告拦截规则库。

           2)加cookies,对于有些广告,比如网站的app推广,第一次进入网站时会弹出来,然后叉掉后加入cookie,第二次访问就不会出现了。对于这种广告可以通过浏览器主动添加到cookie的方式,这样用户第一次访问也不会跳出广告。

          3)模拟点击,对于有些可以叉掉的广告,而又没有cookie,每次访问都会出现,可以写脚本让浏览器帮你进行网页模拟点击,直接帮点击那个叉,但碰到网速不好,特别是移动端很可能出现广告出现一下就消失的效果,用户体验可能不是很好。

    2.ADBlock过滤规则

             从官方的easylistchina.txt规则表中(https://easylist-downloads.adblockplus.org/easylistchina.txt),总结了几种常用规则:1)基本过滤规则,要拦截的url地址,如:http://example.com。 

            2)定义例外规则,可以使用@@表示后面的是例外,不会拦截;也可以配合|使用。如:@@|http://example.com。

            3)匹配网址开头和结尾,使用管线符号|表示最前端或者最末端。如:阻挡以swf结尾,swf|;阻挡以http开头的,|http。||开头可以匹配http://、https://和http://www.等协议的开头。

            4)标记分隔符,通常需要接受过规则的任何分隔符,分隔符可以除了字母、数字或_-.%之外的任意字符。

            5)注释,使用!作为注释的开始,也可以在注释的上面书写任何想些的文案。

            6)限定的特定域名,如果在域名之前有“~”,该过滤规则不适用于这个域名的页面(需要AdBlock Plus 1.1或更高版本)。例如,~example.com##*.sponsor将适用于除了“example.com”之外的域名。

            7)标记分隔符,通常您需要接受过滤规则的任何分隔符。例如,您可能写这样一个规则阻挡http://example.com/和http://example.com:8000/但不能阻挡http://example.com.ar/。在这里,符号(^)用作一个分隔符。分隔符可以是除了字母、数字或者_ – . %之外的任何字符。这个地址的结尾也是作为一个分隔符,下面的例子中所有的分隔符以红色标记出:http:// example.com : 8000 / foo.bar ? a = 12 & b = %D1%82%D0%B5%D1%81%D1%82。所以这个地址可以通过这些过滤规则过滤^example.com^或^%D1%82%D0%B5%D1%81%D1%82^或^foo.bar^。

           8)CSS元素,使用##开头,classname用.,id用#。

           更具体的可以参考官网:https://adblockplus.org/zh_CN/filters

  • 相关阅读:
    Codeforces Round #592 (Div. 2)C. The Football Season(暴力,循环节)
    Educational Codeforces Round 72 (Rated for Div. 2)D. Coloring Edges(想法)
    扩展KMP
    poj 1699 Best Sequence(dfs)
    KMP(思路分析)
    poj 1950 Dessert(dfs)
    poj 3278 Catch That Cow(BFS)
    素数环(回溯)
    sort与qsort
    poj 1952 buy low buy lower(DP)
  • 原文地址:https://www.cnblogs.com/bonelee/p/14208610.html
Copyright © 2011-2022 走看看