最近接到一个需求:随便给一个网页,要求检测出里面的广告。

看到这需求,第一时间想到了firefox中的adblock plus,adblock plus是基于规则包来过滤广告,里面的广告描述规则也许能拿来用。于是折腾了一晚上,实现了一个简单的东西来满足需求,效果还不错

adblock plus工作原理:

http://code.google.com/p/adblock-chinalist/wiki/How_does_adblock_plus_work

adblock plus是先把过滤规则全部转换成正则表达式。再用这些正则表达式去过滤广告。

我思路如下:

1.实现一个adblock plus规则解析器,把adblock plus的广告过滤规则 转换成正则表达式。

2.得到一个要检测广告的页面后,解析出这个页面的所有链接。遍历所有链接,应用第一步得到的正则表达式规则判断链接是否广告。

第一步基于对正则表达式的理解简单的实现了下,如"."转换成"\\.","*"转换成".*"等,元素隐藏规则暂时不处理。adblock plus规则说明:http://code.google.com/p/adblock-chinalist/wiki/Writing_Adblock_Plus_filters 。

第二步,(adblock plus详细的匹配算法:http://adblockplus.org/blog/investigating-filter-matching-algorithms)经过第一步处理后,得到了几千条广告过滤正则表达式。 怎么解析出一个页面的所有链接就不说了,到这里时,收到有一大堆有待判断的链接,和一大堆用于判断的正则表达式规则,普通的思路是对于每一条链接,遍历所有规则判断是否匹配,代码如下:

function getMatchingFilter1(S, F)
  for each filter in F
    if (filter matches S)
      return filter
    end if
  end for
  return null
end function

但这样效率惨不忍睹。还好adblock plus中给出了一个不错的解决方案,对每一条过滤规则抽取出一个代表这条过滤规则的唯一key值,把这些放在哈希表中。于是对一条链接的判断不用遍历所有的规则,而是先在哈希表中查找出有可能匹配的规则再匹配。

对于查找出有可能 匹配的规则,adblock中用来一个奇妙的算法:Boyer-Moore algorithm。

adblock plus中实现如下:

function initializeHashTable3(H, J, C, m)
  for each c in C
    H(c) := filter(c)
    for i in (0 .. m/2)
      substring := c.substring(i, m/2)
      jump := m/2 - i
      if substring not in J or J(substring) > jump
        J(substring) := jump
      end if
    end for
  end for
end function

function getMatchingFilter3(S, H, J, m)
  endPtr := m
  while endPtr <= n
    substring := S.substring(endPtr - m/2, m/2)
    if substring in J and J[substring] > 0
      endPtr := endPtr + J[substring]
    else if substring in J and J[substring] = 0
      substring := S.substring(endPtr - m, m)
      if (substring in H and H(substring) matches S)
        return H(substring)
      else
        endPtr := endPtr + 1
      end if
    else
      endPtr := endPtr + m/2 + 1
    end if
  end while

return null
end function

其中参数说明:

H是存放每一天规则生成的唯一key的哈希表,value是这条规则。J存放的是跳过多少位字符的信息,Boyer-Moore算法要用到的。C是是存放每一天规则生成的唯一key的集合。M是每一条规则生成的key的长度,是8,没为什么。S是要判断的链接。

我的实现就是,蹬蹬蹬蹬,就是翻译成C#版本:
public void InitializeHashTable(Dictionary<string, string> H, Dictionary<string, int> J, List<string[]> C)
{
    foreach (string[] kv in C)
    {

        string key = kv[0];
        string ruleText = kv[1];
        if (!H.ContainsKey(key))
        {
            H.Add(key, ruleText);
        }

for (int i = 0; i <= 4; i++)
        {
            int jump = 4 - i;
            string childKey = key.Substring(i, 4);
            if (!J.ContainsKey(childKey) || J[childKey] > jump)
            {
                J[childKey] = jump;
            }
        }
    }
}

private string GetMatchingFilter(string url,Dictionary<string, string> H, Dictionary<string, int> J)
{
    int endPtr = 8;
    while (endPtr <= url.Length)
    {
        string key = url.Substring(endPtr - 4, 4);

if (J.ContainsKey(key) && J[key] > 0)
        {
            endPtr += J[key];
        }
        else if (J.ContainsKey(key) && J[key] == 0)
        {
            key = url.Substring(endPtr - 8, 8);

if (H.ContainsKey(key) && Regex.IsMatch(url, H[key], options))
            {
                return H[key];
            }
            else
            {
                endPtr++;
            }
        }
        else
        {
            endPtr = endPtr + 5;
        }
    }

return null;
}

完成,求交流。文中所用到的资料:
http://adblock-chinalist.googlecode.com/svn/trunk/adblock.txt
http://adblockplus.org/blog/investigating-filter-matching-algorithms
http://code.google.com/p/adblock-chinalist/wiki/How_does_adblock_plus_work
http://code.google.com/p/adblock-chinalist/wiki/Writing_Adblock_Plus_filters 

转载于:https://www.cnblogs.com/pwg17/archive/2011/02/27/1966318.html

通用网页广告监测,ADBlock plus算法的C#实现。相关推荐

  1. C#:实现ADBlock plus(网页广告监测)算法(附完整源码)

    C#:实现ADBlock plus(网页广告监测)算法 public void InitializeHashTable(Dictionary<string, string> H, Dict ...

  2. python在线考试系统设计csdn下载_一种通用的网页相似度检测算法

    如果我们需要在海量的结构未知的网页库中找到和指定的网页相似度比较高的一些网页,我们该怎么办呢?本文提出的"一种通用的网页相似度检测算法"就是专门解决这个问题. 算法如下: 1.提取 ...

  3. 智源研究院发布“智能体系架构与芯片”重大研究方向,打造通用智能处理器,突破“算法共性特征”难题...

    9 月 18 日上午,北京智源人工智能研究院(以下简称"智源研究院")在北大科技园举行"智能体系架构与芯片"重大研究方向发布会,智源研究院院长黄铁军以及北京人工 ...

  4. 网页检测 AdBlock 的 6 种方法

    DEMO: http://sources.ikeepstudying.com/anti-adblock-killer/ 有些网页上充斥着令人厌恶的广告,这些广告不仅阻碍了信息的获取,有的还严重影响了浏 ...

  5. 你相信进化吗?探索通用人工智能的重要途径 | 算法观点

    今天,你AI了没? 关注:决策智能与机器学习,学点AI干货 作者 | Elena Nisioti等人 出处 | medium 编译 | 机器之心(ID:almosthuman2014) 编辑 | 九三 ...

  6. 通用网页调用本地应用程序方案(windows平台)

    一.更新注册表 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\receiveOutOfArg] "URL Protocol& ...

  7. php网页正文提取,通用网页正文抓取工具_任意网页正文提取API

    ArticleExtractor 智能提取任意网页正文内容 无需任何规则,输入目标内容面url地址(网站首页.列表页面除外),可轻松实现对任意新闻网页正文智能提取,并去除广告等与正文无关的内容. 提取 ...

  8. FPS游戏通用自瞄与透视算法详解!!

    自瞄算法与实现: 1:首先我们要找到一个敌人的三维坐标. 2:我们还要找到自己的三维坐标. 3:我们还要找到自己的鼠标坐标X与Y(这里的鼠标坐标X与Y是角度,X为360,Y正中间为0向上减少到负90度 ...

  9. 网页黑名单系统的算法核心

    通过几个题来进行阐述 网页黑名单系统(有一定的容错率,有限的空间) 例如不安全网页的黑名单里有100亿个数据,每一个网页的URL最多占用64B.要求实现一种过滤系统,可以根据网页的URL判断是否在这个 ...

最新文章

  1. Android Volley完全解析4:带你从源码的角度理解Volley
  2. 使用JDK自带的工具jstack找出造成运行程序死锁的原因
  3. text文字垂直居中_CSS垂直居中,你会多少种写法?
  4. 使用transforms.Compose套件做图像数据变换
  5. [高中作文赏析]渴望从前
  6. 博士论文答辩||基于深度强化学习的复杂作业车间调度问题研究
  7. “人肉搜索”名词解释
  8. 第九届蓝桥杯题解(部分)
  9. 怎么删除TEMP文件夹
  10. IntelliJ IDEA(2017)安装和破解。
  11. python练习项目八——下载所有XKCD 漫画
  12. 怎样把WORD表格转换成EXCEL
  13. 力扣(674.160)补8.30
  14. html怎样写出x的平方,x的平方怎么打出来
  15. 莫烦Python教程之Pandas教程
  16. MSSQL 服务器主体 无法在当前安全上下文下访问数据库,错误:916
  17. 与西安协同销售总监赵建春先生避风塘聊天记
  18. 小菜鸟的第一个爬虫:豆瓣爬取电影信息
  19. 特征值和特征向量的理解 浅显易懂 肯定有收获
  20. 双目运算符和三目运算符的使用浅谈

热门文章

  1. 学计算机的要起一个群名,微信群名字大全 一起走过的日子
  2. vue中更换字体,本地存储字体非引用在线字体库
  3. 苹果cmsV10 仿8x8x 视频图片小说源码 在线充值VIP会员 三级分销 推广 提现 在线
  4. HCIA-5G新技术融合创新应用
  5. 轻文章-维修2台IBM服务器
  6. 量子计算机芯片电原理图,量子计算机新进展:量子光学芯片电路
  7. Git切换分支步骤指令操作,以及的时候报错,导致切换失败的处理
  8. 如何利用软文让你的产品广告上百度首页
  9. 摩托入门第一课[老猫]
  10. vb.net 教程 5-12 绘图实例之统计图1