网络蜘蛛进入一个网站,一般会访问一个特殊的文本文件Robots.txt,这个文件一般放在网站服务器的根目录下,网站管理员可以通过robots.txt来定义哪些目录网络蜘蛛不能访问,或者哪些目录对于某些特定的网络蜘蛛不能访问。例如有些网站的可执行文件目录和临时文件目录不希望被搜索引擎搜索到,那么网站管理员就可以把这些目录定义为拒绝访问目录。Robots.txt语法很简单,例如如果对目录没有任何限制,可以用以下两行来描述:
当然,Robots.txt只是一个协议,如果网络蜘蛛的设计者不遵循这个协议,网站管理员也无法阻止网络蜘蛛对于某些页面的访问,但一般的网络蜘蛛都会遵循这些协议,而且网站管理员还可以通过其它方式来拒绝网络蜘蛛对某些网页的抓取。
网络蜘蛛在下载网页的时候,会去识别网页的HTML代码,在其代码的部分,会有META标识。通过这些标识,可以告诉网络蜘蛛本网页是否需要被抓取,还可以告诉网络蜘蛛本网页中的链接是否需要被继续跟踪。例如: 表示本网页不需要被抓取,但是网页内的链接需要被跟踪。
现在一般的网站都希望搜索引擎能更全面的抓取自己网站的网页,因为这样可以让更多的访问者能通过搜索引擎找到此网站。为了让本网站的网页更全面被抓取到,网站管理员可以建立一个网站地图,即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"{%FRM51Testing软件测试网y"~My
_h%V/} 下面是一些例子:
i/B1W:e[Z"A!~0eh'z`q0 你可以用下面的编码建立ITC:
51Testing软件测试网1Mxp }B~0I(_ {
set Inet1 = CreateObject("InetCtls.Inet")
c!h A.k|F1[0Inet1.protocol = 4 'HTTP51Testing软件测试网 ?:V%FK5o%eH
Inet1.accesstype = 1 'Direct connection to internet51Testing软件测试网*xOS/JLHo
Inet1.requesttimeout = 60 'in seconds51Testing软件测试网y.fweAD#wm
u5]u6K
Inet1.URL = strURL
[LNP#Bw0strHTML = Inet1.OpenURL 'grab HTML page51Testing软件测试网!G1wN7|~H(pIv T-}
现在strHTML保存着strURL指向的整个页面的HTML内容。要建立一个常规网络蜘蛛,你现在只需要调用 instr() 功能来看看你寻找的串是否在当前位置即可。你也可以按照href标记寻找,解析当前的 URL,然后把它设置到Internet 控件的属性中去,接着再继续打开另一个页面。用来查看所有链接的最 好方法是使用递归。
j cb3N
A051Testing软件测试网8g{ lF9n[
要注意的是,尽管这种方法很易于实行,却不是非常准确和强大。今天的许多搜索引擎都可以进行额外的 逻辑检查,例如计算一个页面中某一短语重复的次数,相关字词的近似程度等,有些甚至可以用来判断所搜寻 的语段与上下文的关系。
用VB构造网络蜘蛛
51Testing软件测试网/A}1Sd T t 蜘蛛程序网站层次及其工作原理描述:51Testing软件测试网D$SS'}`
序号 网站 层次 父序号
j^#Poq"a4l w*V-r051Testing软件测试网d YQ.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
M l"OJ7BrCc03 http://www.cnnic.cn/ 2 1
`g$hy1z-nZ0
wM 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
"o P6O8w*~0 蜘蛛程序首先从层次1(http://www.netfox.cn/)开始提取所有的网站链接,把所有网站链接记录到数据库(或者大数组等),并把这些网站链接标识为层次2;51Testing软件测试网Xd8rx4r7Asfv
s'?m!W[?051Testing软件测试网%~;A'q:`t!E4l:d E
当把层次2全部记录到数据库后,开始从层次2中顺序为第一的(这里指序号为2的网站)网站链接开始提取其下面的的所有链接记录到数据库,并把这些网站链接标识为层次3;然后依次把层次为2的网站的所有链接记录到数据库,同时把他们的层次标识为层次3;
8E7}4`7d [v&SD0iV t[4c#^
|6OY051Testing软件测试网P&q(B0G] f'O'A5S.|ly
当层次3全部记录数据库后,开始从层次3中顺序为第一的网站链接开始提取,依次类推即可!
N8xs9b@q!S&b051Testing软件测试网q8_d#R8d^Ql8i
2DbWAAH2R U1C0 注意:程序要保留一个指针记录当前正在操作的序号!另外您也可以增加一个父序号字段来记录他们之间的继承关系! 51Testing软件测试网 d*E3TeH
f6P9nN F
51Testing软件测试网IaT,{(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'[hDim Web(4,10000) ‘//建立数组
k/I
~E{8c$mF051Testing软件测试网I.SJ(ja k0`m~CDim Pointer ‘//建立指针,记录当前种子51Testing软件测试网,bA8O{ c)onv
51Testing软件测试网G;SzvA&sDim Id ‘//建立序号,记录当前抓区网站的序号
!Q1GN0e+OM0rYqsGb f0Dim Layer ‘//建立层次,记录当前正在运行种子的层次
v-mo/\/h0l9mv s,]n3K\-aa ^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"w D2p){%e[051Testing软件测试网:UamN9n&G Web(3,0) = 0 ‘//父序号,0表示为网络原始种子51Testing软件测试网qr Y-g#x5\IB vb
L Xi+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? |:RijuaW
51Testing软件测试网/X&fSy0\1{y1t\l Web(3,1) = 0
J
U#`5W&D