暗网信息抓取


 1.什么是暗网

  广义地讲,任何不能通过一次(或多次)HTTP GET请求直接下载的Web页面,我们都可以认为其处于“暗网”中。不能直接通过HTTP GET请求下载这些Web页面的原因是多方面的,有可能是网络原因不能下载,比如说企业或学校的内部网站,只有通过代理服务器连通这些网络,才能下载其中的Web页面;也有可能是动态页面,需要用户身份认证,登录后才能下载等,还有其它一些原因,这里不再一一列举。

  狭义的“暗网”,是指那些没有链接指向的动态Web页面的集合,这些页面只能通过提交一个HTML表单等的形式获取其内容,也就是通过至少一次HTTP POST请求才能获取其内容,不能通过HTTP GET直接下载得到。比如说一些学校的图书馆,只有用户输入书名等检索词进行搜索时,才能得到相关的结果的索引列表,然后再跟据这个索引列表来获取相关的页面。这些页面,没有其它外链链接进来,只能通过上述方法获取。

 

暗网的资源:

动态内容(占90%以上)
未被链接内容
私有网站
Contextual Web
被限制存取内容
脚本化内容
非HTML/文本内容



而我们主要研究爬取的主要是动态内容,动态网页肯定是可以被爬取的,只是爬取出来的网页是动态生成的,不能像普通的静态网页一样依靠解析链接就能获取。


动态网页的生成机制:

时间动态机制
基于用户的动态机制
输入动态机制



现在针对暗网资源主要有两种解决方案:

构建更有针对性的暗网爬虫
与暗网网站合作,实现信息的对接



我们选取的是第一种方案

而在构建暗网爬虫的时候,是没有通用的解决方案的,这也是百度现在投入较多人力的一个方面,百度针对暗网的搜索也不是非常好。

如何来抓取暗网信息

  首先要声明,本文的讲的暗网是指狭义上的暗网。因此,如何来对暗网信息进行抓取的关键,就落在了如何让WebSpider模拟人提交HTML表单的行为。通常,如果一个表单中的元素的取值都是固定的,那么,我们可能通过枚举各种取值组合,通过HTTP POST提交表单,直接获取相应的页面,如图1所示:

 

    在上面的表单中,各个元素的取值集合都是固定的,我们的WebSpider只要把各种所有的可能取值组合进行枚举,便可得到所有的页面。

    但是实际上,通过我们遇到的表单有很多元素的取值集合都是未定的,这时候,就不能直接采取上面的方面来获取相应页面了,那该怎么办呢?如图2所示,是一个含有取值集合未定的元素的表单:

 

    假如说我们选择了ISBN号进行检索,我们知道,只有输入合法的ISBN号,才能检索到内容。那么,WebSpider该如何知道什么样的ISBN号才是合法的呢?下面介绍一种方法。

    对于这种含有取值集合未定元素的表单,我们对其中每一个取值集合未定的元素进行机器学习,为其得到一个有效的,取值个数有限的近似的取值集合。然后再采取上面介绍的枚举的方法,进行抓取。如在图2所示的例子中,我们通过机器学习的方法,得到一个合法的ISBN号的集合,然后再让WebSpider进行抓取,便可以得到我们想要的结果。

 

    写在最后面:上面只是对暗网信息抓取的一个简单的介绍,目的只是让普通读者对暗网信息的抓取有一个基本的了解。如果想深入了解暗网信息的抓取,可以参考学习下面两份Paper,另外可以在互联网上搜索相关资料:

    1.Crawling the HiddenWeb   

    2.Downloading Hidden Web Content

现在构建暗网爬虫有两种经典的解决方案

—*A. Ntoulas, P. Zerfos, and J. Cho. Downloading hidden web content. Technical report, UCLA, 2004.
—*S. Raghavan and H. Garcia-Molina. Crawling the hidden web. In VLDB, 2001.



我们现在举个例子,比如我们想获取文本类型的资源

这是我们学校图书馆的图书检索系统,因为所有的图书资源都是保存在学校的服务器内,并且相互独立,如果用传统依靠链接来爬取的方法是不行的,因为他们之间没有链接,

用户要得到数据只能通过搜索入口,输入相应的关键字,才能得到数据。





所以我们爬取网页的方法就是通过不断的post表单来提交查询关键字,来获取返回的数据,而问题的关键是如何选取这个关键字

因为暗网的资源我们是无法完全爬取的,就像淘宝网的查询系统,即使很多商品跟你输入的关键字匹配,淘宝网也只会最多返回100页的宝贝列表,不可能把全部资源给你看的。所以我们要寻找用户最感兴趣的内容进行爬取,这样虽然有信息遗漏,但是我们做出来的搜索引擎也是比较让人满意的。

计算关键字通用算法:

(1) while ( there are available resources ) do
// select a term to send to the site
(2) qi = SelectTerm()
// send query and acquire result index page
(3) R(qi) = QueryWebSite( qi )
// download the pages of interest
(4) Download( R(qi) )
(5) done
关键在于(2)选择查询的关键字



我们将问题形式化:

假设一个暗网的页面组成一个集合S,每个页面是里面的1个点。每次查询qi将会获得S的一个子集。每个子集都有权重,这个权重等于执行这次查询qi的开销。这样暗网的抓取问题就转换为子集集合的覆盖问题,即需要找到一个覆盖了最多点的子集集合,同时是权重和是最小的。我们成功地将暗网抓取的问题转换成了图论的问题。




性能指标:

对于一个网站的查询qi,我们使用P(qi)表示本次查询返回的结果集占该网站的总的页面集合的百分比。
例如:P(qi) = 3000/10000 =0.3
我们用Cost(qi)表示一次查询qi的占用的资源开销。这个开销的度量取决于具体的场景,可以是时间,带宽,与该网站的交换次数,或者也可以是这些因素的综合。



Cost(qi)由3个部分组成:
提交查询请求的开销,这个一般是个固定值,我们设定为Cq
下载结果集索引页面的开销,这个开销大小与结果集大小成正比。假设平均下来每个索引项下载时间为Cr。
下载每个感兴趣页面的时间,这个也是与结果集大小成正比。假设每个页面的下载时间为Cd。



Cost(qi) = Cq +Cr*P(qi)+Cd*P(qi)
我们有些页面已经下载过了,所以不需要重新下载,我们只需要下载新加入的页面
Cost(qi) = Cq +Cr*P(qi)+Cd*Pnew(qi)



爬虫策略的形式化表达:



关键字查询选择:

假设爬虫已经做了q1,q2,q3,....,qi次查询,在第i+1次的关键字选择的时候,我们通过分析前n次抓取回来的页面,然后估算哪个关键字最有可能匹配获取得到最多的新结果集。



假设进行了q1,q2,q3,....,qi-1查询,那么P(q1˅q2˅q3˅...˅qi-1)是已知的,我们需要估算P(q1˅q2˅q3˅...˅qi):
P(q1˅q2˅q3˅...˅qi) = P(q1˅q2˅q3˅...˅qi-1)
                               + P(qi) – P(qi ˄(q1˅q2˅q3˅...˅qi-1))
                                   = P(q1˅q2˅q3˅...˅qi-1) + P(qi)
                               –P(q1˅q2˅q3˅...˅qi-1)
                               *P(qi | (q1˅q2˅q3˅...˅qi-1))
现在问题就转换成如何估算P(qi),和P(qi | (q1˅q2˅q3˅...˅qi-1))



P(qi | (q1˅q2˅q3˅...˅qi-1)), 它表示的意义是q1,q2,q3,....,qi-1的结果集页面中包含qi查询的关键字的页面出现的比率。我们可以通过统计qi的查询关键字在q1,q2,q3,....,qi-1中出现的页面次数来近似估算这个比率。


P(qi)的估算方法:
Zipf估算方法


1932年,哈佛大学的语言学专家Zipf在研究英文单词出现的频率时,发现如果把单词出现的频率按由大到小的顺序排列,则每个单词出现的频率与它的名次的常数次幂存在简单的反比关系,这种分布就称为Zipf定律,它表明在英语单词中,只有极少数的词被经常使用,而绝大多数词很少被使用.实际上,包括汉语在内的许多国家的语言都有这种特点。这个定律后来在很多领域得到了同样的验证,包括网站的访问者数量、城镇的大小和每个国家公司的数量。




就以我们的图书馆的书籍查询系统为例子吧。假设已经存在3个查询了:
q1=disk, q2=java, q3=computer。数据库中存在100000本书,q1,q2,q3这3个查询分别返回2000,1000,6000个书籍链接。总共是8000本不一样的书籍。则可以计算:
P(computer) = 6000/100000 = 0.06
P(computer| q1˅q2˅q3) = 6000/8000 = 0.75
类似的我们可以计算其它的关键字tk在q1˅q2˅q3中出现的概率,假设有一个data的关键字,在q1˅q2˅q3中3200个结果中出现,那么我们估算P(data| q1˅q2˅q3)=0.4。

q1=disk, q2=java, q3=computer
表3-1 q1,q2,q3查询后的概率





总结查询选择算法:

Parameters:T: The list of potential query keywords
Procedure
 Foreach tk in T do
 Estimate Efficiency(tk) = Pnew(tk)/Cost(tk)
 done
 return tk with maximum Efficiency(tk)
Efficiency(tk) = Pnew(tk)/Cost(tk)
评估一次查询。其中Pnew(tk)为查询返回的新页面数量占总页面数量的比率的估算。Cost(tk)是使用tk进行查询的资源开销。



Pnew(qi) = P(q1˅q2˅q3˅...˅qi-1) + P(qi)
            –P(q1˅q2˅q3˅...˅qi-1)*P(qi | (q1˅q2˅q3˅...˅qi-1))
            –P(q1˅q2˅q3˅...˅qi-1)
            = P(qi)
            –P(q1˅q2˅q3˅...˅qi-1)*P(qi | (q1˅q2˅q3˅...˅qi-1))
Cost(qi) = Cq + Cr*P(qi) + Cd* Pnew(qi)
Pnew(qi)和Cost(qi)都可以估算预测得到



缺点:

局限于用于解决爬取文本式数据库的暗网资源
很难扩展到多个输入的结构化的数据库的暗网资源的爬取