搜索引擎蜘蛛算法与蜘蛛程序构架

上一篇 / 下一篇  2009-06-10 10:37:24 / 个人分类:web测试

一、网络蜘蛛基本原理


m(DM%P+\0
          网络蜘蛛即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。

d~O*Z9h@]8v0
          对于搜索引擎来说,要抓取互联网上所有的网页几乎是不可能的,从目前公布的数据来看,容量最大的搜索引擎也不过是抓取了整个网页数量的百分之四十左右。这其中的原因一方面是抓取技术的瓶颈,无法遍历所有的网页,有许多网页无法从其它网页的链接中找到;另一个原因是存储技术和处理技术的问题,如果按照每个页面的平均大小为20K计算(包含图片),100亿网页的容量是100×2000G字节,即使能够存储,下载也存在问题(按照一台机器每秒下载20K计算,需要340台机器不停的下载一年时间,才能把所有网页下载完毕)。同时,由于数据量太大,在提供搜索时也会有效率方面的影响。因此,许多搜索引擎的网络蜘蛛只是抓取那些重要的网页,而在抓取的时候评价重要性主要的依据是某个网页的链接深度。
51Testing软件测试网q*ueM0jc!t%P
          在抓取网页的时候,网络蜘蛛一般有两种策略:广度优先和深度优先(如下图所示)。广度优先是指网络蜘蛛会先抓取起始网页中链接的所有网页,然后再选择其中的一个链接网页,继续抓取在此网页中链接的所有网页。这是最常用的方式,因为这个方法可以让网络蜘蛛并行处理,提高其抓取速度。深度优先是指网络蜘蛛会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接。这个方法有个优点是网络蜘蛛在设计的时候比较容易。两种策略的区别,下图的说明会更加明确。

网络蜘蛛

}{$up#]`1W9g?0
          由于不可能抓取所有的网页,有些网络蜘蛛对一些不太重要的网站,设置了访问的层数。例如,在上图中,A为起始网页,属于0层,B、C、D、E、F属于第1层,G、H属于第2层,I属于第3层。如果网络蜘蛛设置的访问层数为2的话,网页I是不会被访问到的。这也让有些网站上一部分网页能够在搜索引擎上搜索到,另外一部分不能被搜索到。对于网站设计者来说,扁平化的网站结构设计有助于搜索引擎抓取其更多的网页。51Testing软件测试网bF&Ta-c5s"I(^O
          网络蜘蛛在访问网站网页的时候,经常会遇到加密数据和网页权限的问题,有些网页是需要会员权限才能访问。当然,网站的所有者可以通过协议让网络蜘蛛不去抓取,但对于一些出售报告的网站,他们希望搜索引擎能搜索到他们的报告,但又不能完全免费的让搜索者查看,这样就需要给网络蜘蛛提供相应的用户名和密码。网络蜘蛛可以通过所给的权限对这些网页进行网页抓取,从而提供搜索。而当搜索者点击查看该网页的时候,同样需要搜索者提供相应的权限验证。
二、网站与网络蜘蛛
51Testing软件测试网dR k7c p'\c*k+TM
          网络蜘蛛需要抓取网页,不同于一般的访问,如果控制不好,则会引起网站服务器负担过重。每个网络蜘蛛都有自己的名字,在抓取网页的时候,都会向网站标明自己的身份。网络蜘蛛在抓取网页的时候会发送一个请求,这个请求中就有一个字段为User-agent,用于标识此网络蜘蛛的身份。例如Google网络蜘蛛的标识为GoogleBot,Baidu网络蜘蛛的标识为BaiDuSpider,Yahoo网络蜘蛛的标识为Inktomi Slurp。如果在网站上有访问日志记录,网站管理员就能知道,哪些搜索引擎的网络蜘蛛过来过,什么时候过来的,以及读了多少数据等等。如果网站管理员发现某个蜘蛛有问题,就通过其标识来和其所有者联系。
          网络蜘蛛进入一个网站,一般会访问一个特殊的文本文件Robots.txt,这个文件一般放在网站服务器的根目录下,网站管理员可以通过robots.txt来定义哪些目录网络蜘蛛不能访问,或者哪些目录对于某些特定的网络蜘蛛不能访问。例如有些网站的可执行文件目录和临时文件目录不希望被搜索引擎搜索到,那么网站管理员就可以把这些目录定义为拒绝访问目录。Robots.txt语法很简单,例如如果对目录没有任何限制,可以用以下两行来描述:51Testing软件测试网jTd(n v g6u;u
          User-agent:    *

K2dZ[b2Is*HAbX0
          Disallow:
51Testing软件测试网 IO3|Xcms
          当然,Robots.txt只是一个协议,如果网络蜘蛛的设计者不遵循这个协议,网站管理员也无法阻止网络蜘蛛对于某些页面的访问,但一般的网络蜘蛛都会遵循这些协议,而且网站管理员还可以通过其它方式来拒绝网络蜘蛛对某些网页的抓取。

0ImxEf]0
          网络蜘蛛在下载网页的时候,会去识别网页的HTML代码,在其代码的部分,会有META标识。通过这些标识,可以告诉网络蜘蛛本网页是否需要被抓取,还可以告诉网络蜘蛛本网页中的链接是否需要被继续跟踪。例如: 表示本网页不需要被抓取,但是网页内的链接需要被跟踪。

6ts"J6ci6B!GD0
          关于Robots.txt的语法和META. Tag语法,前面的一篇“禁止搜索引擎收录的方法”一文中做了详细的介绍。

"fp!J Nu7C;|0
           现在一般的网站都希望搜索引擎能更全面的抓取自己网站的网页,因为这样可以让更多的访问者能通过搜索引擎找到此网站。为了让本网站的网页更全面被抓取到,网站管理员可以建立一个网站地图,即Site Map。许多网络蜘蛛会把sitemap.htm文件作为一个网站网页爬取的入口,网站管理员可以把网站内部所有网页的链接放在这个文件里面,那么网络蜘蛛可以很方便的把整个网站抓取下来,避免遗漏某些网页,也会减小对网站服务器的负担。(Google专门为网站管理员提供了XML的Sitemap)
三、网络蜘蛛对内容提取

Mw @7rHs*Y B M$r5Q i0
          搜索引擎建立网页索引,处理的对象是文本文件。对于网络蜘蛛来说,抓取下来网页包括各种格式,包括html、图片、doc、pdf、多媒体、动态网页及其它格式等。这些文件抓取下来后,需要把这些文件中的文本信息提取出来。准确提取这些文档的信息,一方面对搜索引擎的搜索准确性有重要作用,另一方面对于网络蜘蛛正确跟踪其它链接有一定影响。

L'uH@ wm6c0
          对于doc、pdf等文档,这种由专业厂商提供的软件生成的文档,厂商都会提供相应的文本提取接口。网络蜘蛛只需要调用这些插件的接口,就可以轻松的提取文档中的文本信息和文件其它相关的信息。
          HTML等文档不一样,HTML有一套自己的语法,通过不同的命令标识符来表示不同的字体、颜色、位置等版式,如:、、等,提取文本信息时需要把这些标识符都过滤掉。过滤标识符并非难事,因为这些标识符都有一定的规则,只要按照不同的标识符取得相应的信息即可。但在识别这些信息的时候,需要同步记录许多版式信息,例如文字的字体大小、是否是标题、是否是加粗显示、是否是页面的关键词等,这些信息有助于计算单词在网页中的重要程度。同时,对于HTML网页来说,除了标题和正文以外,会有许多广告链接以及公共的频道链接,这些链接和文本正文一点关系也没有,在提取网页内容的时候,也需要过滤这些无用的链接。例如某个网站有“产品介绍”频道,因为导航条在网站内每个网页都有,若不过滤导航条链接,在搜索“产品介绍”的时候,则网站内每个网页都会搜索到,无疑会带来大量垃圾信息。过滤这些无效链接需要统计大量的网页结构规律,抽取一些共性,统一过滤;对于一些重要而结果特殊的网站,还需要个别处理。这就需要网络蜘蛛的设计有一定的扩展性。
四、网络蜘蛛的程序构架
          用ASP构造网络蜘蛛
  那么如何用ASP构建网络蜘蛛呢?答案是:Internet transfer control (ITC)。这个由 微软提供的控件,将使你能够通过ASP程序访问Internet资源。你可以用ITC搜寻Web页面,访问FTP服务器,甚 至可以发送邮件标题。在本文里,我们将着重讨论搜寻Web页面的功能。51Testing软件测试网 iAi?%|
51Testing软件测试网 \/q%t~1F MY"x.G
  有几个缺陷必须先说明一下。第一,ASP无权访问Windows的注册表,这就使某些ITC正常存储的常量和数 值不可用。通常你可以通过设置ITC为“不使用默认值”来解决这个问题,这就需要你在运行过程中指明每一 次的值。51Testing软件测试网,C1xm.YjU1v R/lU
     另一个更严重的问题是关于许可证书的。由于ASP不具备调用License Manager(一项Windows中的功 能,可以保证组件和控件的合法使用)的功能,那么当License Manager检查当前组件的密钥密码,并将 其与Windows注册表进行比较后,如果发现它们不同,该组件将不会工作。因此,当你想把ITC配置到另一台没 有所需密钥的计算机上时,将导致ITC崩溃。解决的办法之一是将ITC捆绑到另一个VB组件中,由VB组件复制 ITC的路径和工具,从而进行配置。这项工作很麻烦,但不幸的是,它是必不可少的。51Testing软件测试网*M(i"{%FRM
51Testing软件测试网y"~My _h%V/}
  下面是一些例子:
i/B1W:e[Z"A!~0
eh'z`q0  你可以用下面的编码建立ITC:
51Testing软件测试网1Mxp}B~0I(_ {
              set Inet1 = CreateObject("InetCtls.Inet")
c!hA.k|F1[0Inet1.protocol = 4      'HTTP51Testing软件测试网?:V%FK5o%eH
Inet1.accesstype = 1     'Direct connection to internet51Testing软件测试网*xOS/JLHo
Inet1.requesttimeout = 60 'in seconds51Testing软件测试网y.f weAD#wm u5]u6K
Inet1.URL = strURL
[LNP#Bw0strHTML = Inet1.OpenURL 'grab HTML page51Testing软件测试网!G1wN7|~H(pI v T-}
 现在strHTML保存着strURL指向的整个页面的HTML内容。要建立一个常规网络蜘蛛,你现在只需要调用    instr() 功能来看看你寻找的串是否在当前位置即可。你也可以按照href标记寻找,解析当前的 URL,然后把它设置到Internet 控件的属性中去,接着再继续打开另一个页面。用来查看所有链接的最 好方法是使用递归。
jc b3N A051Testing软件测试网8g{lF9n[
  要注意的是,尽管这种方法很易于实行,却不是非常准确和强大。今天的许多搜索引擎都可以进行额外的 逻辑检查,例如计算一个页面中某一短语重复的次数,相关字词的近似程度等,有些甚至可以用来判断所搜寻 的语段与上下文的关系。
          用VB构造网络蜘蛛
51Testing软件测试网/A}1Sd T t

          蜘蛛程序网站层次及其工作原理描述:51Testing软件测试网D$SS'}`
序号    网站    层次    父序号
j^#Poq"a4l w*V-r051Testing软件测试网dYQ.C#a]H
1  http://www.netfox.cn/1    0
nyj u2G%y0
j0U0A/rcH02  http://www.sina.com.cn/    2    1
%D&\7M[g*Y!Kr0I(zV0
2E Ml"OJ7BrCc03  http://www.cnnic.cn/    2    1
`g$hy1z-nZ0
w M NKeJz+O04  http://www.baidu.cn/    3    2
{sU9h8b7bXL$wt0
9nDV-p8G)fM$X05  http://www.yahoo.cn/    3    251Testing软件测试网'jq Fm&tuw
51Testing软件测试网4N9AP3\.S8^sE(e

"oP6O8w*~0          蜘蛛程序首先从层次1(http://www.netfox.cn/)开始提取所有的网站链接,把所有网站链接记录到数据库(或者大数组等),并把这些网站链接标识为层次2;51Testing软件测试网Xd8rx4r7A sfv

s'?m!W[?051Testing软件测试网%~;A'q:`t!E4l:dE
          当把层次2全部记录到数据库后,开始从层次2中顺序为第一的(这里指序号为2的网站)网站链接开始提取其下面的的所有链接记录到数据库,并把这些网站链接标识为层次3;然后依次把层次为2的网站的所有链接记录到数据库,同时把他们的层次标识为层次3;

8E7}4`7d[ v&SD0

iVt[4c#^ |6OY051Testing软件测试网P&q(B0G] f'O'A5S.|ly
           当层次3全部记录数据库后,开始从层次3中顺序为第一的网站链接开始提取,依次类推即可!

N8xs9b @q!S&b051Testing软件测试网q8_d#R8d^ Q l8i


2DbWAAH2R U1C0           注意:程序要保留一个指针记录当前正在操作的序号!另外您也可以增加一个父序号字段来记录他们之间的继承关系!    51Testing软件测试网 d*E3TeH f6P9nN F

51Testing软件测试网Ia T,{(WU p

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

+H(X-mA!rG0          层次2是通过层次1(即网络种子)抓取到的链接;51Testing软件测试网 [.]Zpd7ZkSb

|[B\7o'Y0          层次3是通过层次2抓取到的链接;51Testing软件测试网h x [ n-KJ)ZN|

51Testing软件测试网um0zI0~'i:R4E

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

+i7Z |'yj{0

M.[+]#tu0          蜘蛛程序关键代码:51Testing软件测试网x/^[Q9pZ8L-v

)\c5T W][*_z0         这里使用VB实现核心部分的代码,当然您也可以很简单地转换成其他语言代码。在这里了为了简单起见,我们这里不对数据库操作,我们建立一个二维数组存放我们的网址!!51Testing软件测试网C|Pnu sP|M

51Testing软件测试网 R*w XPv&^9Z'[h

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

k/I ~E{8c$mF051Testing软件测试网I.SJ(ja k0`m~C

Dim Pointer                    ‘//建立指针,记录当前种子51Testing软件测试网,bA8O{ c)onv

51Testing软件测试网G;SzvA&s

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

!Q1GN0e+OM0

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

v-mo/\/h0

l9mvs,]n3K\-a a^0Dim Running                  ‘//建立是否运行的标志,

``6s!f!sIv!D0

![{a^.q"`@x0  

]P^#F]%x|x|.y0

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

9D;x+L"WG051Testing软件测试网:nE wY7\

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

dS(\'C6cdE5h[051Testing软件测试网'sL_ Fgi

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

4Uu5a1Dxe051Testing软件测试网+},Z$Aq~\b%Gu

         Web(1,0) = “http://www.netfox.cn/”             ‘//网站51Testing软件测试网M\)F&];{fg4e

51Testing软件测试网s`u_1`H

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

+p"wD2p){%e[051Testing软件测试网:UamN9n&G

         Web(3,0) = 0                                       ‘//父序号,0表示为网络原始种子51Testing软件测试网qr Y-g#x5\IB vb

LXi+en]!e"O-f#E7l"w0         Web(4,0) = “奈福网络”

+kpCcN j(`#k.c051Testing软件测试网z7zi1[$_} `C"x9l

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

&a*r#_5Lx'PtT~051Testing软件测试网 gk JHQ2T.Y9X

         Web(0,1) = 151Testing软件测试网1~#G(r4t*f"G

51Testing软件测试网'ocX-|`!N8V

         Web(1,1) = “http://www.aspfaq.cn/51Testing软件测试网 Rvd8|]T

51Testing软件测试网G1_H9?Bm ~6ow

         Web(2,1) = 151Testing软件测试网u?|:Riju aW

51Testing软件测试网/X&f Sy0\1{y1t\l

         Web(3,1) = 0

J U#`5W&Du(Zp"o0r5K051Testing软件测试网kHSNX`?s

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

]y.{'hu/C"]/[0

4E8f,egk'U7vG#O8sT0         ‘//设置网络种子后,记录种子序号开始后的序号,这里设置了2个种子,所以Id=2开始51Testing软件测试网 k9\:A.W w$R/g

&_ P0kJvb1}i.G0         Id = 2

z6yM0B2w {JOB WS&X0

pBLz5]m0End Function51Testing软件测试网8eq&XQ:^0f5a7Kd

\'J2D)R:iKdz0  

+RO#LSZ.g*N051Testing软件测试网n1D*uKg

Private Sub Spider_Work()            ‘//蜘蛛工作程序,抓取网站并记录到数组
5|b^*K C8[%Ad0                                                 ‘//根据需要可以把他们放到数据库中51Testing软件测试网Yd!a9Fp8{ Y H5W

51Testing软件测试网s+^7itXt

      Dim A

0R!_+g Q:dN0

Wp'x;kX1u6T0      For Each A In WebBrowser.Document.All

i,b1B(Up(Y0

$RdZ7sE0          If UCase(A.tagName) = "A" Then51Testing软件测试网H9o7ap"r/G+Gu

0U$f2^+?q3d?0              If IsValidWeb(A.href) Then51Testing软件测试网 }V)smRJ1]u

51Testing软件测试网 }%H$GO:N:Uu

                  Id = Id + 151Testing软件测试网/WG6x.le;N_

51Testing软件测试网%c s7^ q8`'[

                              Web(0, Id) = Id                      ‘//记录当前网站的序号51Testing软件测试网%k,sus0Y:R"?|'g

Cq,q|`A^0                              Web(1, Id) = A.href                       ‘//记录当前网站

"a q&o[#j:L051Testing软件测试网:y0dG&}w^ d,uz5Q

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

6a/Trp N6fm Nc8g051Testing软件测试网!?N/p3X:AhZ-r?

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

%r-f-bkEc.Ip c0

G~)Z*}r a0                                                                                                           ‘//则说明层次已经发生了增加51Testing软件测试网.q*{HJVby%o0Q

&m D#Kl*|0                              Web(3, Id) = Pointer               ‘//记录当前网站的父序号51Testing软件测试网%C zR/I0^ P+W%j-hbe

;H6X2[z/PI9s0                              Web(4,Id) = A.innerText                ‘//记录当前网站的名称51Testing软件测试网'j5HW6_c

2^,@Y'` ca*beBV3C0              End If

6J/zo'|-{TZqu051Testing软件测试网8i!Mh1D1DU"_3H4m/S

          End If

1gA f/U8S5m051Testing软件测试网2| c?I;?,y

Next

N?7h|*G0

l UF(F)Ju)~0Pointer = Pointer + 1

0h.G4Zi!y R8@0

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

Fx|)E0{5X"c0

|)]D }-T8UOc/i0If Running = False Then                ‘//运行为否,退出运行

rr3]7ej}:g2~I0

(Z KL#O%@nE b0         Exit Sub

jwm8dJC(l R*e]0

:`D|dI%Q[(Rz0End If

8VRCu,mL7nw9d h051Testing软件测试网"ot r;@`$Z'o

End Sub

0Z/~0AJ'ELpO1c051Testing软件测试网p$}b!| b#ZE

  51Testing软件测试网NvQPC3E

51Testing软件测试网 b E`%K%T;pb+L@

Private Function Spider_Init() As Boolean      ‘//蜘蛛程序初始化函数51Testing软件测试网$b@$P#XG+`/Kh

)H m8B J'V5c+mm0         Pointer = 1       ‘//指针设置为1,表示从第一个序号开始运行51Testing软件测试网du{"U6vh M,Z1}N

51Testing软件测试网f_EnB*Dd"w

         Id = 2              ‘//序号设置为2,以后可以读取记录51Testing软件测试网;f`+\pTHh7D

0]O1rDrQ"Y0         Layer = 0                ‘//层次设置为0,表示蜘蛛第一次运行51Testing软件测试网:@&a:m&xs4Q%~-g4L

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

C2X/vU,b/Ax0

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

4[GS;U,QK B051Testing软件测试网/v,g R k]8c

                Running = True51Testing软件测试网 j(Q} P?"c7G$[9W

51Testing软件测试网 E-`~'e!U:di`.V

                Spider_Init = True

6}h(X[Is0

6H KB]-}A3z o0                WebBrowser.Navigate Web(1, Pointer-1)

1@o$^6_'A;zXa/T^t3S0

5utn]O{0         Else

K4g z_@w0

+e~_1F'H+cQ_W1~0                Running = False51Testing软件测试网czL6_uJ(NXz

51Testing软件测试网9TEG,v"y2g4xsG8@

                Spider_Init = False51Testing软件测试网et2?n-kGr/S5`

51Testing软件测试网 vT8`5d V}

                Exit Function

7XMW/b"{(p2E5f:oN\ E051Testing软件测试网ELAb$J#vhTv*^

         End If     51Testing软件测试网 k'B:^i"Y2f[[2Qau

51Testing软件测试网TBr-P(S-H'V"PC

End Function

f;?[-Q~7^qw(I051Testing软件测试网"w [@6q.vkx

  

U2u4[t)poF0

(aZ(H@C*eFL0Private Sub WebBrowser_DocumentComplete(ByVal pDisp As Object, URL As Variant)     ‘//WebBrowser控件

0P#m gG$qX#QU051Testing软件测试网,Ry3_&Q]J] s;^Ug'G

      Call Spider_Work()

}3U4^ qm V1F,OR z051Testing软件测试网L/^rL {2iih

End Sub

;yd v/u|8n.[+VQ0

2j!j#h%`1@i(ey%[;||n0  

K8}1p#};x#dj Y0

9I6[pJ V{?\0Private Function IsValidWeb(_href) As Boolean             ‘//判断是否是cn域名函数51Testing软件测试网(K {.Yt!a)Jd

51Testing软件测试网X_x G8LMz;Z

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

f1HE"nx[Wkp t)M0

J%n_eK J'V V2s p0      If InStr(_href, "http://www.") > 0 And InStr(_href, ".cn/") > 0 And Len(_href) < 60 Then51Testing软件测试网)f?8Ay:ro

51Testing软件测试网e#~:Ess[/k;P

          IsValidWeb = True51Testing软件测试网6}2j#L5g?K%A

51Testing软件测试网t,M,LQ pR

      Else

z']X;yCfwy0

Me#Y A Ntw0          IsValidWeb = False51Testing软件测试网 ^4](Q]pq'Kt@

1\/F8FN)^8]y+aR0      End If

(f}1Ss2c3M/f051Testing软件测试网T2R1}0h1i/C.h1C

End Function51Testing软件测试网!OwW\ p@})O

j!H2JB H g&K0  51Testing软件测试网:wD;N0i \7C{

51Testing软件测试网[1?3FE7Ok*g|K

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

Kiw/jfv On0d0

&N#m3f;k.I ^ o8Y6P0         If Spider_Init() Then51Testing软件测试网L8rPU ~ ^o.z

51Testing软件测试网K6DH4\?

                Msgbox “蜘蛛初始化成功并开始运行了”51Testing软件测试网ZR$C(g*Ut`

%z"Z-Y8c'O+S @0         Else

? {O2Z-Y(@J;sA-G*~051Testing软件测试网 R8}Y*R;w0@ N3A3o4U-F

                Msgbox “蜘蛛初始化失败”

`L@4m*{3G(J4Jp0

f {2_.n+K$@0         End If51Testing软件测试网9YAKgQqm!t9R

51Testing软件测试网9u?,\@1n_UyE

End Private

CP9j9Fuy0

!rTu KPaE:BO2|0  51Testing软件测试网 ?sYY Bi)}(y/C

V8{W y!H.e_$u0Private Sub StopCommand_Click()        ‘//Stop停止 命令控件51Testing软件测试网.MB-gev9uw

,z-U"]*^/sC T`K/I0         Running = False       ‘//停止运行

V p?@%j.n^[0

7j;[y,kO;J0End Private

2FH2dd&aZ)|0

!e(W-dt+~]v0  51Testing软件测试网Wj'[PEN'^ pxu(c

51Testing软件测试网DgZm8j9eA2};b j$~

Private Sub RunCommand_Click()         ‘//Run运行 命令控件51Testing软件测试网+A+v3l#WB(m_

51Testing软件测试网~ T]m][D tw

         Running = True        ‘//继续运行

f4s8Y.V6mMO0

.@)O]!Y{0         Call Spider_Work()          ‘//蜘蛛运行主程序51Testing软件测试网{O ]r#r3df)vs2g

F&M]pL0End Private51Testing软件测试网#iUS%cq2ak9m

          特定网络蜘蛛
  相对的,一个特定网络蜘蛛要复杂一些。如我们早先提到的,一个特定网络蜘蛛会搜寻一个页面的特定部 分,因而要求预先知道该部分相关的情况。让我们先看看下面的HTML:51Testing软件测试网hD(@4__)J

v hbtO0   <HTML>
            <HEAD>
            <TITLE>My News Page</TITLE>
            <META    Name="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 _fcksavedurl=""/news/8094.asp" ">Stocks prices fall</a><a href="/news/8095.asp">New 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>

0X@I}K4VShO \0
P%c,z k8O(Hh'S3|hS3ME0  在这个页面内,我们只关心位于“put headlines here”和 “end headlines”这 两个标记之间的东西。你可以构建一个只返回该区域查找结果的功能设置:

#|SnF2^{^051Testing软件测试网4^L}p.aE rX!X*G

Function GetText(strText, strStartTag, strEndTag)
P"RCBHx%]c6?D7~G0dim intStart
upL+m0mWeb"{0intStart = instr(1, strText, strStartTag, vbtextcompare)51Testing软件测试网-H j^ QB
if intStart then
*id,`&[~}-YC0intStart = intStart + len(strStartTag)
R*vw']XZF0intEnd = InStr(intStart + 1, strText, strEndTag, vbtextcompar e)
h@B t2`mU0GetText = Mid(strText, intStart + 1, intEnd - intStart&n bsp;- 1)51Testing软件测试网WwRvv[AM
else51Testing软件测试网eo:U3T$KL
GetText = " "
3a:k vI U5K ~/BU0end if
-rB.gh't s1L,D0End Function

mc)a:dB Y051Testing软件测试网{&xHJ4P(m~


S7r ZE.F:J!L;s:Y0  按照上面构建ITC控件的例子,你可以很容易地将strHTML中的“ <!--put headlines here-->”和 “<!--end headlines-->”作为参数传 送到GetText中。51Testing软件测试网 zb9YR!d O\7tE

#\C6`#m-wLu0  要注意,用于开始和结束的标记都不一定要是实际的HTML专用标记——它们可以是你想使用的任何文本界 定符。在通常情况下,你不容易找到好的HTML标记来界定搜寻区域。你只能使用比较方便称手的标记——例如 ,你的首尾标记可以分别如下:51Testing软件测试网7S+br3X E |J5I

ET6d"YH(Q lY/a0strStartTag = "/td><td><font face="arial" size=&q uot;2"><p><b><u>"
T#Mb d L:\0strEndTag = "<p></td></tr><tr><td><ums>&quo t;51Testing软件测试网@%Lr0eN"l
51Testing软件测试网4y)v#lLj3J;E9U%M
  一定要确定搜索的是HTML页中比较独特的标识,这样你才可以准确地获得你需要的东西。你也可以按照你 所返回的文本部分中的链接进行搜寻,不过如果你不知道那些页面的格式,你的网络蜘蛛将无功而返。

DOl5vWl^3Z0a051Testing软件测试网g6h` EV'RLI o/C

作者:奇点 、Winter、枫林

F$x7c-_#v,f(x@[0
作者: 枫林51Testing软件测试网\*S-y|JMp/q
原载: 搜索引擎优化SEO博客51Testing软件测试网 cz s-A7d\9SSDZ:_jj
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。51Testing软件测试网 Cg9s,V|%].K
本文链接地址: http://blog.5ixb.com/seo/search-engine-spider. html
$ElD}l1\s3L)A p0
51Testing软件测试网6Lo"{^r&nh

TAG:

 

评分:0

我来说两句

日历

« 2024-04-16  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 15505
  • 日志数: 11
  • 建立时间: 2008-05-21
  • 更新时间: 2009-08-13

RSS订阅

Open Toolbar