通用网页广告监测,ADBlock plus算法的C#实现。
最近接到一个需求:随便给一个网页,要求检测出里面的广告。
看到这需求,第一时间想到了firefox中的adblock plus,adblock plus是基于规则包来过滤广告,里面的广告描述规则也许能拿来用。于是折腾了一晚上,实现了一个简单的东西来满足需求,效果还不错。
adblock plus工作原理:
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)经过第一步处理后,得到了几千条广告过滤正则表达式。 怎么解析出一个页面的所有链接就不说了,到这里时,收到有一大堆有待判断的链接,和一大堆用于判断的正则表达式规则,普通的思路是对于每一条链接,遍历所有规则判断是否匹配,代码如下:
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中实现如下:
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#版本:
{
foreach (string[] kv in C)
{
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;
}
完成,求交流。文中所用到的资料:
转载于:https://www.cnblogs.com/pwg17/archive/2011/02/27/1966318.html
通用网页广告监测,ADBlock plus算法的C#实现。相关推荐
- C#:实现ADBlock plus(网页广告监测)算法(附完整源码)
C#:实现ADBlock plus(网页广告监测)算法 public void InitializeHashTable(Dictionary<string, string> H, Dict ...
- python在线考试系统设计csdn下载_一种通用的网页相似度检测算法
如果我们需要在海量的结构未知的网页库中找到和指定的网页相似度比较高的一些网页,我们该怎么办呢?本文提出的"一种通用的网页相似度检测算法"就是专门解决这个问题. 算法如下: 1.提取 ...
- 智源研究院发布“智能体系架构与芯片”重大研究方向,打造通用智能处理器,突破“算法共性特征”难题...
9 月 18 日上午,北京智源人工智能研究院(以下简称"智源研究院")在北大科技园举行"智能体系架构与芯片"重大研究方向发布会,智源研究院院长黄铁军以及北京人工 ...
- 网页检测 AdBlock 的 6 种方法
DEMO: http://sources.ikeepstudying.com/anti-adblock-killer/ 有些网页上充斥着令人厌恶的广告,这些广告不仅阻碍了信息的获取,有的还严重影响了浏 ...
- 你相信进化吗?探索通用人工智能的重要途径 | 算法观点
今天,你AI了没? 关注:决策智能与机器学习,学点AI干货 作者 | Elena Nisioti等人 出处 | medium 编译 | 机器之心(ID:almosthuman2014) 编辑 | 九三 ...
- 通用网页调用本地应用程序方案(windows平台)
一.更新注册表 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\receiveOutOfArg] "URL Protocol& ...
- php网页正文提取,通用网页正文抓取工具_任意网页正文提取API
ArticleExtractor 智能提取任意网页正文内容 无需任何规则,输入目标内容面url地址(网站首页.列表页面除外),可轻松实现对任意新闻网页正文智能提取,并去除广告等与正文无关的内容. 提取 ...
- FPS游戏通用自瞄与透视算法详解!!
自瞄算法与实现: 1:首先我们要找到一个敌人的三维坐标. 2:我们还要找到自己的三维坐标. 3:我们还要找到自己的鼠标坐标X与Y(这里的鼠标坐标X与Y是角度,X为360,Y正中间为0向上减少到负90度 ...
- 网页黑名单系统的算法核心
通过几个题来进行阐述 网页黑名单系统(有一定的容错率,有限的空间) 例如不安全网页的黑名单里有100亿个数据,每一个网页的URL最多占用64B.要求实现一种过滤系统,可以根据网页的URL判断是否在这个 ...
最新文章
- Android Volley完全解析4:带你从源码的角度理解Volley
- 使用JDK自带的工具jstack找出造成运行程序死锁的原因
- text文字垂直居中_CSS垂直居中,你会多少种写法?
- 使用transforms.Compose套件做图像数据变换
- [高中作文赏析]渴望从前
- 博士论文答辩||基于深度强化学习的复杂作业车间调度问题研究
- “人肉搜索”名词解释
- 第九届蓝桥杯题解(部分)
- 怎么删除TEMP文件夹
- IntelliJ IDEA(2017)安装和破解。
- python练习项目八——下载所有XKCD 漫画
- 怎样把WORD表格转换成EXCEL
- 力扣(674.160)补8.30
- html怎样写出x的平方,x的平方怎么打出来
- 莫烦Python教程之Pandas教程
- MSSQL 服务器主体 无法在当前安全上下文下访问数据库,错误:916
- 与西安协同销售总监赵建春先生避风塘聊天记
- 小菜鸟的第一个爬虫:豆瓣爬取电影信息
- 特征值和特征向量的理解 浅显易懂 肯定有收获
- 双目运算符和三目运算符的使用浅谈