面向主题的网络蜘蛛爬虫研究与设计+流程图(4)_毕业论文

毕业论文移动版

毕业论文 > 计算机论文 >

面向主题的网络蜘蛛爬虫研究与设计+流程图(4)


4.2. SPIDER构造
构造SPIDER 程序有两种方式:(1)把SPIDER 程序设计为递归的程序;(2)编写一个非递归的程序,它要文护一个要访问的网页列表。考虑使用哪一种方式的前提是,构造的SPIDER 程序必须能够访问非常大的Web 站点。本系统中使用了非递归的程序设计方法。这是因为,当一个递归程序运行时要把每次递归压入堆栈,但在本系统设计中使用的是多线程,它允许一次运行多个任务,但是,多线程与递归是不兼容的。因为在这一过程中每一个线程都有自己的堆栈,而当一个方法调用它自身时,它们需要使用同一个堆栈。这就意着递归的SPIDER 程序不能使用多线程。
    每个SPIDER线程都会独立的去完成获取URLs的任务,并将获取到的URLs加入一个公共的URL等待队列中。假设线程1从URL队列中获取一条任务URL 1,然后它会下载对应的HTML,解析出里面包含URLs,然后再将这些URLs加入到URL队列中去。然后线程1会再从URL队列中获取新的URL,下载HTML代码,并解析出URLs,再加入到URL队列中去。而线程2同时也会下载它获取到的URL 2对应的HTML代码,解析出URLs加入到等待队列中。以此类推,多个线程并发地去完成爬虫工作。
4.3. URL解析
    从HTML代码中提取URLs,主要是通过检索字符串中的href字符串来实现的。对于一个HTML代码,我寻找其中的href=字符串,然后记录它的下表i。然后判断下表i+1位置上的字符是双引号,单引号或者两者皆不是,然后选择对应的字符作为截取URL的终止标记。截取过后的href标记就剔除它与它前面的部分,以便而后的操作可以继续检索href标记,直到整个HTML代码中所有的href标记都被解析过后,操作终止。
<a href="www.youerw.com" class="focu">首页</a>
<a href=’movie_2004/mlist/1_1.html’ target=_self>动作片</a>
<a href=movie_2004/mlist/2_1.html target=_self>恐怖片</a>
<a href=movie_2004/mlist/3_1.html >爱情片</a>
    例如上面那段HTML代码。我们先检索href=标记,然后判断出第i+1位为一个双引号,所以我们可以截取i+1位到第2个双引号的位置。之间的这段字符串即为URL。当完成这一步操作后,原字符串被截取从“   class=”开始。我们继续检索href=标签,判断它的第i+1位为一个单引号,所以我们又截取i+1位到第2个单引号的位置。这步以后原字符串又被截取为“   target=”开始,我们可以继续检索href=标签。这个地方href=没有接续任何符号,所以当我们没有发现单引号或双引号的时候,可以判断为这种情况。我们就去检索空格和<标签,以下标较小的字符作为截取URL的结束标记。
    在每个URL被截取出来之后,需要判断这些URL是相对地址,还是绝对地址。
   <a href=../mlist/1_1.html target=_self >动作片</a>
    
    例如上面的HTML代码,如果截取出来的URL为../mlist/1_1.html这种形式,即为相对地址。我们需要将其转化为绝对地址。假如这个相对地址的父URL为。根据相对地址的概念,../为返回上一层,所以可以得到这个相对地址的绝对地址为
l。比如像上面的第2种URL,它包含完整的协议信息,域名地址。可以判断它为绝对地址。
    当得到这些完整的URL地址以后,我们需要对其进行过滤。很多URL它们指向的文件不是HTML文件,而是一些CSS文件,或者RAR包文件,或者只是接续“#”符号,代表只是调用一段javascript代码。像这种情况我们就直接抛弃这些URLs。 (责任编辑:qin)