基于网络爬虫的搜索引擎设计与实现—毕业设计论文内容摘要:

kground=images/ width=162 height=71 /td td img src=images/ width=1 height=71 alt=/td /tr tr td colspan=4 rowspan=2 /td td img src=images/ width=1 height=31 alt=/td /tr tr td img src=images/ width=1 height=495 alt=/td /tr /table ! End ImageReady Slices /form /body /html servlet 的实现 用 Servlet 来响应用户的请求,实现搜索参数的传入。 具体代码设计为: package crawer。 import .*。 import .*。 import .*。 import .*。 import .*。 public class MyServlet extends HttpServlet { private static final String CONTENT_TYPE = text/html。 charset=GBK。 public Timer timer。 myspider crawler。 ArrayList String myresult。 //搜索到的结果 //Initialize global variables public void init() throws ServletException { } //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String var0 = (param0)。 if (var0 == null) { var0 =。 } (CONTENT_TYPE)。 PrintWriter out = ()。 byte[] bytes=(ISO88591)。 String search=new String(bytes,GB2312)。 crawler = new myspider( //Thread search=new Thread(crawler)。 // ()。 //此处开始爬行 ()。 //启动定时器,在时间内检查是否有结果,并显示 myresult=new ArrayList String()。 //搜索到的结果 myresult=()。 (html)。 (headtitle爬虫演示 /title/head)。 (p注意默认起始站点为: 10/p)。 (p搜索 +search+结果 :/p)。 (body bgcolor=\c0c0c0\)。 String te。 for(int i=0。 i()。 i++){ te=(i+1)。 (p+te+、 +(i)+/p)。 //输出结果 } if(()==0){ (p对不起 ,没有找到结果 /p)。 } (/body)。 (/html)。 ()。 } //Clean up resources public void destroy() { } } 网页的解析实现 网页的分析 网页文档作为 一 种半结构化文本是一种界于自由文本和结构化文本之间的数据,它通常没有严格的格式。 对于这类文本一般是通过分析文本中特有的标志性字符进行爬行处理,具体而言就是分析 HTML 语言中的各种标记之间的 关系。 网页信息的载体是网页文本,用超文本标记语言编写。 由 HTML 标准定义了一组元素类型,不同类型的元素分别描述文本、图像和超文本链接等。 一个元素的描述一般由开始标记 (Start Tag)、内容 (Content)、结束标记 (End Tag)所组成。 元素名称出现在开始标记中,在 HTML 语言中标记为 元素名称 ,对应的结束标记为 /元素名称 ,内容出现在开始标记和结束标记之间。 通过构造网页标记树的方法可反映网页的结构特点,下 图是一个简单的动态网页标记树 h t m lh e a d b o d yt a b l et i t l el i n k 1 l i n k 2 网页的处理队列 页面处理队列中保存的是页面的 URL,它实际上是由等待队列、处理队列、错误队列、完成队列组成。 正是通过它们,某个具体的移动 Spider 得以完成对该 Spider 所对应 web 的全部搜索任务。 页面队列中保存的页面的 URL 都是属于内链接。 (1)等待队列 (WaitURL)。 在这个队列中, URL 等待被移动 Spider 程序处理。 新发现的 URL 被加入到这个队列中。 (2)处理队列 (Proces— sUI )。 当移动 Spider 程序开始处理 URL 时,它们被传送到这一队列,但同一个 URL 不能被多次 处理,因为这样是浪费资源。 当一个 URL 被处理过后,它将被移送到错误队列或者是完成队列。 (3)错误队列 (ErrorURL)。 如果在处理某一页面时发生错误,它的 URL 将被加入到错误队列,该URL 到达这一队列后将不再移人其他队列。 一旦网页移入错误队列,移动 Spider 程序将不会再对它作进一步处理。 (4)完成队列 (LaunchURL)。 如果在处理网页时没有发生错误,处理完毕时,该 URL 将被加入到完成队列,该 URL 到达这一队列后将不再移人其他队列。 同一时间一个 URL 只能在一个队列中,这也叫做 URL 的状态,这是因 为人们常常使用状态图描述计算机程序,程序按照状态图从一个状态变换到下一个状态实际上,当发现 URL(内链接 )时,移动 Spider 会检查该 URL 是否已经存在于完成队列或错误队列中,如果已经存在于上述两种队列的任何一个队列中,那么移动 Spider 将不会对此 URL 进行任何处理。 由此,可避免某个页面被重复处理,防止陷入死循环。 搜索字符串的匹配 对于要搜索的字符串,必须在抓取的网页中进行匹配检查,如果存在于该网页中,则把地址添加到输出队列中。 网页分析类的实现 package crawer。 //html 文件解析类 import。 import。 import。 import。 import。 import。 import。 import。 import。 import。 import。 import。 import。 //类实体 public class HtmlParser { ArrayList String fafa=new ArrayList String()。 URL base = null。 // 基本 URL public HtmlParser (String PageContent) { int state = 0。 StringBuffer sb = new StringBuffer()。 int i = ()。 //(循环读取解析 )。 for (int j = 0。 j i。 j++) { //循环读取解析 / switch (state) { case 0: if ((j) == 39。 39。 ) state = 39。 39。 break。 case 39。 39。 : if ((j) == 39。 39。 ) { state = 0。 analyze(())。 (0)。 } else { ((char) (j))。 } } } } public void analyze(String param) { StringTokenizer st = new StringTokenizer(param)。 if (() 2) return。 String first_word = ().toLowerCase()。 if ((a)) { analyzeAnchor(())。 } else if ((frame)) { analyzeFrame(())。 } else if ((base)) { extractBase(())。 } } /**分析 a分析 . */ void analyzeAnchor(String anchor) { String href = extract(anchor, href)。 if (href == null) return。 addURL( href)。 } /**分析 frame 分析 . */ void analyzeFrame(String frame) { String src = extract(frame, src)。 if (src == null) return。 addURL(src)。 } /** 由 base标记中分离 url. */ void extractBase(String b) { String b2 = extract(b, href)。 if (b2 != null) { try { base = new URL( b2)。 } catch (MalformedURLException e) { ()。 } } } String extract(String line, String key) { try { key = ()。 String lower_case = ()。 int i = (key)。 if (i 0) return null。 i += ()。 if ((i) != 39。 =39。 ) return null。 i++。 int i2。 if ((i) == 39。 39。 ) { i++。 i2 = (39。 39。 , i)。 if (i2 0) { return (i)。 } else { return (i, i2)。 } } else { int targ = ()。 for (i2 = i。 i targ。 i++) { if (((i))) break。 } return (i, i2)。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。