设为首页
收藏本站
本站论坛
   
3
3
   
  文章列表      

搜索引擎研究-网络蜘蛛程序算法相关资料

用ASP构建网络蜘蛛
  
 编者按:经常去雅虎、搜狐等网站搜索信息的读者一定有这样的疑问:如此庞大的网页信息,到底是如何被这 些网站所收集到的呢?难道都是人工登记并整理的吗?当然不是。这些搜索引擎能够快速地找到如此之多的信 息,和网络蜘蛛的应用是分不开的。

  网络蜘蛛可以算得上是为Internet而开发的最有用处的工具之一。时至今日,要想从以千万计的各不相同 的站点中获取信息,舍网络蜘蛛之外,焉有他哉?

  一个典型的网络蜘蛛(例如雅虎)工作的方式,是查看一个页面,并从中找到相关信息, 然后它再 从该页面的所有链接中出发,继续寻找相关的信息。以此类推,直至穷尽。很快地,就可以在数据库中获得成 千上万的页面和信息。这样的工作方式就如同一张向外发散的蜘蛛网,这正是“网络蜘蛛”这个名称的由来。

  接下来让我们看看如何建立一个网络蜘蛛。在此之前,我们先要了解几个概念。

一、基本原理

  我们可以用网络蜘蛛搜寻很多东西。事实上,现在有一些特别用途的商用网络蜘蛛,这些软件为它们的开 发者赚取了大把的钞票,比如Altavista科技的一份许可证,就价值30万美元。以下是一个网络蜘蛛的基础原理:

  * 从各个消息来源收集信息

  从技术角度讲,一个网络蜘蛛应该可以不受限制地从任意来源获取信息。来源多多益善。

  * 准确度

  不管是谁,遇见这样的事情肯定都会崩溃——搜索引擎向你返回了一百万个结果,可是,只有最后两个是 你需要的(这还算好的,如果是中间的两个呢?)。所以好的网络蜘蛛对其返回的结果应该有足够的准确度, 而且在有些情况下,还要有特定的功能,也就是说,只返回特定类型的信息——比如www.enfused.com的专为 搜索游戏设计的网络蜘蛛,就只返回与游戏相关的东西。

  * 相对更新

  这依赖于你所使用的技术(下面我们会专门提到),网络蜘蛛应该找回更新后的信息,或者至少是比较新 的信息。如果网络蜘蛛总是找回一些几年前的陈芝麻烂谷子,那你一定会比系统先一步崩溃。

  * 相对快速

  这就不用多说了,如果没有足够的速度,那你的网络蜘蛛再怎么准确,也是白搭。


二、基本技术

  有好几种方法可以构建网络蜘蛛。第一种,称之为常规网络蜘蛛,只是简单地进行页面寻找,搜索并获得 你想要的东西。例如,用一个短语作为关键词进行搜索。第二种,特殊网络蜘蛛,只寻找页面的特定部分。这 种网络蜘蛛在某些特定场合很有用(比如,你只想获得某一个站点内的新闻标题)。

  常规网络蜘蛛是两者中相对简单的一种。首先,你不需要预先知道目标页面的情况。只需要在该页面中, 以及在与其链接的页面中,寻找你要的关键词就可以了。你还可以在功能中设定,忽略掉那些在同一站点下的 链接,从而保证每一个结果都来源于不同的站点。

  与之相对应,一个特定的网络蜘蛛通常要求你预先知道一些目标页面的情况,例如表格规划等。举个例子 ,如果你搜寻的是一个页面中的新闻标题,你应该先知道限定此标题的HTML标记。如此你才可以直接搜索页面 中正确的部分。在这种情况下,是否具备搜索该页面的所有链接的功能显得不是特别重要,因为你的网络蜘蛛 很可能在别的页面中无法找到标记,不能进行工作。

  运行网络蜘蛛的时间也有所不同:你可以预先运行,也可以实时运行。预先运行意味着当你的网络蜘蛛运 行时,所有搜集到的信息都存贮在一个数据库中,以备以后使用。很明显,如此你将不会获得最新的数据,但 是如果你经常运行网络蜘蛛,这个问题也不会有什么大碍。

  实时运行意味着你每次运行网络蜘蛛所获得的信息都不会被保存下来,你只能现找现用。例如,如果你在 站点设置了搜索功能,在实时状态下使用网络蜘蛛,则无论何时,只要有用户输入一个关键词并点下“发送” 按钮,你的网络蜘蛛就将运行,而不是仅仅访问数据库。尽管这可以保证你的数据总是最新的,但是却不是大 多数站点的首选,因为网络蜘蛛本身运行和返回数据都需要时间——而时间就是金钱呀!当然,所查找的资料 具有高度时间敏感性的时候例外。

三、构建网络蜘蛛

  那么如何用ASP构建网络蜘蛛呢?答案是:Internet transfer control (ITC)。这个由 微软提供的控件,将使你能够通过ASP程序访问Internet资源。你可以用ITC搜寻Web页面,访问FTP服务器,甚 至可以发送邮件标题。在本文里,我们将着重讨论搜寻Web页面的功能。

  有几个缺陷必须先说明一下。第一,ASP无权访问Windows的注册表,这就使某些ITC正常存储的常量和数 值不可用。通常你可以通过设置ITC为“不使用默认值”来解决这个问题,这就需要你在运行过程中指明每一 次的值。

   另一个更严重的问题是关于许可证书的。由于ASP不具备调用License Manager(一项Windows中的功 能,可以保证组件和控件的合法使用)的功能,那么当License Manager检查当前组件的密钥密码,并将 其与Windows注册表进行比较后,如果发现它们不同,该组件将不会工作。因此,当你想把ITC配置到另一台没 有所需密钥的计算机上时,将导致ITC崩溃。解决的办法之一是将ITC捆绑到另一个VB组件中,由VB组件复制 ITC的路径和工具,从而进行配置。这项工作很麻烦,但不幸的是,它是必不可少的。

  下面是一些例子:

  你可以用下面的编码建立ITC:

          set Inet1 = CreateObject("InetCtls.Inet")
Inet1.protocol = 4    'HTTP
Inet1.accesstype = 1 'Direct connection to internet
Inet1.requesttimeout = 60 'in seconds
Inet1.URL = strURL
strHTML = Inet1.OpenURL 'grab HTML page
  现在strHTML保存着strURL指向的整个页面的HTML内容。要建立一个常规网络蜘蛛,你现在只需要调用 instr() 功能来看看你寻找的串是否在当前位置即可。你也可以按照href标记寻找,解析当前的 URL,然后把它设置到Internet 控件的属性中去,接着再继续打开另一个页面。用来查看所有链接的最 好方法是使用递归。

  要注意的是,尽管这种方法很易于实行,却不是非常准确和强大。今天的许多搜索引擎都可以进行额外的 逻辑检查,例如计算一个页面中某一短语重复的次数,相关字词的近似程度等,有些甚至可以用来判断所搜寻 的语段与上下文的关系。这些功能将留待我们的读者们自己去摸索。


四、特定网络蜘蛛

  相对的,一个特定网络蜘蛛要复杂一些。如我们早先提到的,一个特定网络蜘蛛会搜寻一个页面的特定部 分,因而要求预先知道该部分相关的情况。让我们先看看下面的HTML:

   <HTML><HEAD><TITLE>My News Page</TITLE><META Name=&quo t;keywords" Content="News, headlines"><META Name="descr iption" Content="The current news headlines."></HEAD> ;<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF3300 "VLINK="#CC0000" ALINK="#0000FF"><p><h3>Headlines&l t;/h3></p><!--put headlines here--><a href="/news/8094.asp ">Stocks prices fall</a><a href="/news/8095.asp">Ne w movies today</a><a href="/news/8096.asp">Bush and&nb sp;Gore to debate tonight</a><a href="/news/8097.asp"> Fall TV lineup</a><!--end headlines--></BODY></HTML>


  在这个页面内,我们只关心位于“put headlines here”和 “end headlines”这 两个标记之间的东西。你可以构建一个只返回该区域查找结果的功能设置:

Function GetText(strText, strStartTag, strEndTag)
dim intStart
intStart = instr(1, strText, strStartTag, vbtextcompare)
if intStart then
intStart = intStart + len(strStartTag)
intEnd = InStr(intStart + 1, strText, strEndTag, vbtextcompar e)
GetText = Mid(strText, intStart + 1, intEnd - intStart&n bsp;- 1)
else
GetText = " "
end if
End Function


  按照上面构建ITC控件的例子,你可以很容易地将strHTML中的“ <!--put headlines here-->”和 “<!--end headlines-->”作为参数传 送到GetText中。

  要注意,用于开始和结束的标记都不一定要是实际的HTML专用标记——它们可以是你想使用的任何文本界 定符。在通常情况下,你不容易找到好的HTML标记来界定搜寻区域。你只能使用比较方便称手的标记——例如 ,你的首尾标记可以分别如下:

strStartTag = "/td><td><font face="arial" size=&q uot;2"><p><b><u>"
strEndTag = "<p></td></tr><tr><td><ums>&quo t;

  一定要确定搜索的是HTML页中比较独特的标识,这样你才可以准确地获得你需要的东西。你也可以按照你 所返回的文本部分中的链接进行搜寻,不过如果你不知道那些页面的格式,你的网络蜘蛛将无功而返。


五、保存信息

  在大多数情况下,你会要求将收集到的信息保存在一个数据库中,以备以后使用。你的需求也许包括很广 泛的内容,但是在此之前,你要记住以下几件事:

  在你的数据库中查找最新信息

  如果你经常使用网络蜘蛛去查找一个站点内的新闻标题,你要先确定比较新的标题已经存在于数据库内。 然后将其与网络蜘蛛返回的结果相比较,只添加更新过的部分。这样可以防止你保存一大堆重复数据。

  更新信息

  也许你根本就不想从外部向数据库中添加新信息。比如,如果你维护的是一个美国各州人口的网上索引, 你只需要在数据库内部更新——你将不需要在表格内插入新的信息。

  保存所需信息

如果你在查找标题,要确定你也同时查找了该标题指向的链接,并将其保存下来。如果没有链接,你 也应该建立一个。例如,如果我从www.yoursite.com查找标题,并在www.mysite .com演示,而该标题与一篇在站点之外的文章有链接,那么我必须先保存http://www.you rsite.com这一链接,然后再保存其它链接到数据库内,这些链接才可以正常访问。


  六、结论

  我们已经简要介绍了如何构建一个比较完整的网络蜘蛛。所有的基本功能都已涉及。现在你需要做的就是 再在里面加上你自己的东西。

  这一类功能将被应用在一个COM对象或者一个独立的应用软件内。在ASP中设置这项功能非常方便, 但是你应该将你的编码移到另外的地方,以提高速度和安全性。而且这样也可以令其更容易被打包和传送。

  

用vb构造网络蜘蛛

什么是网络蜘蛛

网络蜘蛛是一种能自动到网上查找信息的一种程序,该程序具有高度的自动性,只要告诉他一个网站,他就可以从这个网站开始依次通过该网站的链接自动抓取链接内容以及网址,然后就顺着这些链接一直抓下去。

网络蜘蛛可以方便的实现从网络中抓取信息并且保存到当地数据库。

智能型的网络蜘蛛甚至可以抓取您指定的信息并自动过滤掉不相关的信息,替代重复的人工操作。

网络蜘蛛运行时必须设置种子网站,设置的种子网站必须可以链接下去,否则可能会造成蜘蛛停止工作。因此我们在设置种子网站时可以设置比较大型的、链接比较多的网站,当然您也可以设置多个种子网站以确保网络蜘蛛能运行足够长的时间。

蜘蛛程序网站层次及其工作原理描述
序号   网站   层次   父序号

1  http://www.netfox.cn/ 1   0

2  http://www.sina.com.cn/   2   1

3  http://www.cnnic.cn/   2   1

4  http://www.baidu.cn/   3   2

5  http://www.yahoo.cn/   3   2

蜘蛛程序首先从层次1(http://www.netfox.cn/)开始提取所有的网站链接,把所有网站链接记录到数据库(或者大数组等),并把这些网站链接标识为层次2;


当把层次2全部记录到数据库后,开始从层次2中顺序为第一的(这里指序号为2的网站)网站链接开始提取其下面的的所有链接记录到数据库,并把这些网站链接标识为层次3;然后依次把层次为2的网站的所有链接记录到数据库,同时把他们的层次标识为层次3;


当层次3全部记录数据库后,开始从层次3中顺序为第一的网站链接开始提取,依次类推即可!


注意:程序要保留一个指针记录当前正在操作的序号!另外您也可以增加一个父序号字段来记录他们之间的继承关系!    

层次1表示为网络种子;我们这里把网络种子放在第一层,根据需要您可以设置一个或者多个网络种子,实际上我们通过这个层次图可以很显然地看出来,低层次的网址就是高层次的网络种子。也就是说只要有一个或者几个网络种子,我们就可以通过他们的链接找到更多的网络种子。只要这样我们的蜘蛛才能永远地运行下去!

层次2是通过层次1(即网络种子)抓取到的链接;

层次3是通过层次2抓取到的链接;

依次类推,构成一棵大树!

蜘蛛程序关键代码

由于我对VB比较熟悉,所以在此我用VB实现核心部分的代码,当然您也可以很简单地转换成其他语言代码。在这里了为了简单起见,我们这里不对数据库操作,我们建立一个二维数组存放我们的网址!!

Dim Web(4,10000)         ‘//建立数组

Dim Pointer                   ‘//建立指针,记录当前种子

Dim Id                         ‘//建立序号,记录当前抓区网站的序号

Dim Layer                     ‘//建立层次,记录当前正在运行种子的层次

Dim Running                 ‘//建立是否运行的标志,

  

Private Function NewworkSeed_Set() As Boolean       ‘//用来设置网络种子,为演示方便我们把种子放在数组,

                                                                             '//当然您也可以根据需要把他们直接放到数据库中

       Web(0,0) = 1                                     ‘//序号

       Web(1,0) = “http://www.netfox.cn/”           ‘//网站

       Web(2,0) = 1                                     ‘//层次

       Web(3,0) = 0                                     ‘//父序号,0表示为网络原始种子

       Web(4,0) = “奈福网络”

       ‘//当然这里可以设置多个网络原始种子

       Web(0,1) = 1

       Web(1,1) = “http://www.aspfaq.cn/”

       Web(2,1) = 1

       Web(3,1) = 0

       Web(4,1) = “asp技术站”

       ‘//设置网络种子后,记录种子序号开始后的序号,这里设置了2个种子,所以Id=2开始

       Id = 2

End Function

  

Private Sub Spider_Work()           ‘//蜘蛛工作程序,抓取网站并记录到数组
                                               ‘//根据需要可以把他们放到数据库中

     Dim A

     For Each A In WebBrowser.Document.All

         If UCase(A.tagName) = "A" Then

             If IsValidWeb(A.href) Then

                 Id = Id + 1

                             Web(0, Id) = Id                     ‘//记录当前网站的序号

                             Web(1, Id) = A.href                     ‘//记录当前网站

                             Web(2, Id) = Layer               ‘//记录当前网站的层次

                             If Web(2,Pointer)<> Layer Then Layer = Layer + 1     ‘//当指针层次与当前层次不同的话

                                                                                                         ‘//则说明层次已经发生了增加

                             Web(3, Id) = Pointer             ‘//记录当前网站的父序号

                             Web(4,Id) = A.innerText               ‘//记录当前网站的名称

             End If

         End If

Next

Pointer = Pointer + 1

WebBrowser.Navigate Web(1, Pointer-1)     ‘//抓取当前种子完毕后,自动跳转到下一个种子

If Running = False Then               ‘//运行为否,退出运行

       Exit Sub

End If

End Sub

  

Private Function Spider_Init() As Boolean     ‘//蜘蛛程序初始化函数

       Pointer = 1     ‘//指针设置为1,表示从第一个序号开始运行

       Id = 2             ‘//序号设置为2,以后可以读取记录

       Layer = 0               ‘//层次设置为0,表示蜘蛛第一次运行

                             ‘//以上指针,序号,层次都可以记录并且方便以后读取

       If IsValidWeb(Web(1, Pointer-1)) Then         ‘//判断种子是否正确,如果正确初始化成功,否则失败

               Running = True

               Spider_Init = True

               WebBrowser.Navigate Web(1, Pointer-1)

       Else

               Running = False

               Spider_Init = False

               Exit Function

       End If    

End Function

  

Private Sub WebBrowser_DocumentComplete(ByVal pDisp As Object, URL As Variant)   ‘//WebBrowser控件

     Call Spider_Work()

End Sub

  

Private Function IsValidWeb(_href) As Boolean           ‘//判断是否是cn域名函数

                                                                             ‘//通过该函数可以实现抓取指定网站或数据

     If InStr(_href, "http://www.") > 0 And InStr(_href, ".cn/") > 0 And Len(_href) < 60 Then

         IsValidWeb = True

     Else

         IsValidWeb = False

     End If

End Function

  

Private Sub InitCommand_Click()         ‘//Init初始化 命令控件

       If Spider_Init() Then

               Msgbox “蜘蛛初始化成功并开始运行了”

       Else

               Msgbox “蜘蛛初始化失败”

       End If

End Private

  

Private Sub StopCommand_Click()       ‘//Stop停止 命令控件

       Running = False     ‘//停止运行

End Private

  

Private Sub RunCommand_Click()       ‘//Run运行 命令控件

       Running = True       ‘//继续运行

       Call Spider_Work()         ‘//蜘蛛运行主程序

End Private


> >
 
 
   
 
网上赚钱申请指南
 

友情链接
个人主页
 
 
 
 

wel come to . 欢迎光临
宇宙浪仔