在这里,我不会解释太多的代码,没有必要,说说原理就可以了。

AdBlock的广告拦截实际上分为2个部分:

1、对于URL请求的拦截

这一般都是页面中DIV元素嵌入一个IFRMAE/IMAGE元素,然后加载一个广告链接或者GIF图片什么的。

这部分的规则库描述比较复杂。规则大概有几万条,即使对于国内的使用,可能也会有个1000条左右。

不过我觉得没必要搞这么复杂,可以通过提取出最常见的100条,然后用这100条屏蔽80%的请求,就可以了。

这些规则的语法,基本上是对于URL中domain和path的字符串前缀或后缀匹配。可能附带一些额外的属性(理论上说来,这些属性都应该可以从NetworkRequest对象中获取到)

AdBlock Plus的作者实际上是使用JavaScript把这些URL匹配规则映射为了正则表达式,然后再用正则表达式对目标URL进行匹配过滤。

当然,也可以用Java来实现。前面已经说了,正则表达式是基于前缀或者后缀的,前缀可以用Trie树,后缀可以反转后当作前缀处理。

而对于keyword in查询,可以使用基于编译自动机的AC算法(我认为AC算法其实就是一个简化版的 key1|key2|key3|...|keyn 这种形式的正则表达式而已)

一旦匹配上,在shouldOverrideUrlLoading函数里return true;代表已额外处理,实际上不处理,这样就屏蔽了此URL请求。(shouldOverrideUrlLoading主要是用于特殊的scheme协议的,用于URL请求拦截实属误用),好像有额外的shouldIgnoreNetworkRequest

2、对于页面DOM嵌入广告内容的处理

基于规则是,通过CSS3 Selector定位到这些DOM元素,然后设置其display等于none !important。

AdBlock Plus对于页面内容的广告过滤是特定于网站的,也就是说,是对于domain字符串的精确匹配。这里使用一个简单的HashMap性能也就足够可以了。

问题是,有些广告内容是延迟加载的(通过setTimer),对于这部分内容,只能等个几秒钟等广告内容出来之后,才注入执行JS脚本。

当然,这种方法不是很好,最好是在浏览器内核里做一个DOM Mutation事件监控的daemon:如果检测到有新的DOM节点加入,当然必须是在DOM Content Loaded之后,就发送一个通知给客户端,客户端再调度广告屏蔽脚本的重新执行。

上面2类处理看起来有效,实际上无效。设想网站要求用户必须访问广告服务器,以提高一个特殊的cookie,这样才允许用户访问资源。这样第1种方法其实就没用武之地了。对于第2种则更简单,原则上来说,如果把广告跟正常内容混合在一起,你是没办法用计算机算法来区分谁是广告谁是正常内容的,除非用人来维护。或者立法。

从个人角度考虑,某部分广告则让让它下载显示也无不可,如果用户觉得它烦,就提供一个规则添加的UI交互入口。而对于弹窗、闪烁的GIF这类比较恶心的,杀之可也。

1/15更新:

AdBlock Plus做到的优化:假如一个URL为a.b.c,那么这个URL只会跟过滤规则里包含a,或者b,或者c的规则做匹配,后者还是得一个一个的执行JS正则表达式线性匹配

好处就是那些规则中不包含a,b,c的将不会与这个url做匹配。这可能使得把一个10000条规则的总线性扫描降低到了1000条的规模。

但是,它还是没有猎豹浏览器的做法好:AdBlock Plus最终URL与过滤规则的匹配还是用JS正则表达式来执行的(当然,JS里的字符串高级处理都只能用用正则表达式,逐个字符比较对JS代码来说不现实),猎豹对于简单的前缀/后缀匹配可以使用Trie树或AC自动机,但这是基于字符的,只能在Java里执行才有效率。
不过,我想,更有技术含量的,是引入协作式过滤:当用户标明网页中的某个元素属于广告,那么,浏览器内核可以智能地定位到这个DOM元素,并生成一个有效的CSS Selector(这个就是难度之所在了),这样就可以动态地扩展用户的本地过滤规则库,然后再通过上传到云端服务器形成大数据,从中挖掘出公共的广告拦截规则库。

AdBlock广告拦截插件的实现原理相关推荐

  1. Chrome上最好用的广告拦截插件:AdBlock

    Chrome上最好用的广告拦截插件:AdBlock AdBlock,是一款广告拦截插件,自动拦截网页中广告.广告拦截并非100%准确,因此它提供了个性化设置的功能. 一个页面如果被"误伤&q ...

  2. 最强chrome、edge的广告拦截插件

    最强chrome.edge的广告拦截插件 对于浏览器的广告是非常烦人的,尤其是使用百度搜索引擎时,总会在右侧出现百度热搜这样的东西,有时不经意间就会被某些热搜吸引.本来想搜索一些内容,结果被热搜等耗费 ...

  3. AdGuard广告拦截插件V3.6.6

    介绍: AdGuard AdBlocker 是一款广告拦截插件,用以对抗各式广告与弹窗.可以拦截绝大部分常见网站的广告. 例如视频广告,插播广告和浮动广告.从而实现加速页面载入,节省带宽,屏蔽广告和弹 ...

  4. 【插件】浏览器广告拦截插件| 浏览器搜索广告横飞怎么办

    文章目录 浏览器广告拦截插件| 浏览器搜索广告横飞怎么办 一.效果 二.安装 浏览器广告拦截插件| 浏览器搜索广告横飞怎么办 浏览器广告横飞怎么办?今天教你一招解决!很多小伙伴说自己用的浏览器总是有广 ...

  5. Google Chrome 新广告拦截器的工作原理

    转自: https://www.ctrl.blog/entry/chrome-adblocker google chrome 将在2018年2月15日开始对某些网站上的广告进行屏蔽. 笔者看了一下Ch ...

  6. 搜狗浏览器广告拦截插件_拦截烦人的网页广告,增加上网体验

    本号所有资源版权归原作者所有,如有侵权请加小编微信删除.本号免费分享,仅供学习交流,下载后24小时内请自觉删除,切勿用于商业用途,否则后果自负! 今天重新整理分享几大主流浏览器和IE浏览器拦截广告的方 ...

  7. 记一次被浏览器广告拦截插件坑死的经历:adp和ad插件把jsp页面中div显示的图片当作广告拦截!!

    没有任何显示,也没有任何报错,f12中也已经加载了图片等内容,又把chrome换到firfox,但是还是没用,因为我都装了ad插件,我真想爆粗口,因为ad插件也显示没有拦截到广告.经过查错一次又一次重 ...

  8. AdBlock广告拦截规则

    www.baidu.com##div[tpl="right_toplist1"] www.baidu.com##div[tpl="right_toplist"] ...

  9. 广告拦截应用将从Google应用商城中移除

    日期:2013-3-21  来源:GBin1.com Google在Google应用商城上移除了受大众欢迎的Adblock Plus和其他广告拦截应用. 很明显的,这将意味着Adblock Plus和 ...

  10. 2017年网友还在使用的广告屏蔽插件大集合!

    题外话:最近我在想广告也是一个很炫的东西,让人又爱又恨!因为广告存在的必要性它养活了一部分人,又因为广告的讨厌性又养活了一些人.说实话我不讨厌的有创意的广告,说这句话并不是因为我的网站需要广告,当然我 ...

最新文章

  1. 基于矩阵分解的推荐算法
  2. 安卓自定义View进阶-Matrix Camera
  3. 各种排序算法的讲解与代码实现
  4. 当Spring 容器初始化完成后执行某个方法
  5. Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统
  6. EnableDebugPriv;
  7. python 如何获取文件夹下所有的目录。
  8. 监控视频存储解决方案
  9. 基于正点原子STM32的OLED显示实验
  10. DELL披露MacBook Pro杀手
  11. 基于混合策略改进的樽海鞘群算法
  12. 【原创】VBA学习笔记(316)VBA编程基础知识扫盲,只适合纯自学新手看
  13. jQuery锁定页面元素(表格列)
  14. 吴伯凡-认知方法论-聪明人如何避免犯错误
  15. 20200209毕设日记-开题报告
  16. 2020-10-23
  17. linux升级Openssh到8.4
  18. 【已解决】IDEA创建Maven多模块项目子模块引用不到父模块的pom
  19. 字符串指针与字符串数组
  20. Python爬虫之Requests的基础运用

热门文章

  1. 蜂鸣器的专业分类是这样的
  2. 关于如何在代码里区分条码扫描扫描到是是一维码还二维码
  3. Monkey Test - 命令
  4. 含泪推荐几款超级好用的软件
  5. java实现一台电脑控制多台手机_涨姿势:教你用电脑远程控制多台手机!终于可以挂手机了!...
  6. mysql正则防注入_防止sql注入的方法
  7. oracle 函数的使用
  8. 【显卡】python查看GPU(显卡)资源
  9. 前端技术—CSS常用代码大全
  10. 公司邮箱通讯录的更新