web音乐搜索软件的设计与实现—免费计算机毕业设计论文内容摘要:

else{ (url)。 sea=new Search(url)。 String pageContents =()。 //downloadPage(verifiedUrl)。 if (pageContents != null amp。 amp。 () 0){ // 从页面中获取有效的链接 ana=new Analyzer(pageContents,url)。 ArrayList links =()。 //retrieveLinks(verifiedUrl, pageContents, crawledList,limitHost) List mp3link= ()。 (links)。 for(Iterator its=()。 ()。 ){ m= (mp3)()。 String sql=INSERT INTO `mappingmusic` ( `m_url` , `m_name` , `m_type`,`m_date` )VALUES (39。 +()+39。 , 39。 +()+39。 , 39。 +()+39。 ,39。 +date+39。 )。 (sql)。 dispalystr+= 名字 :+()+\n+ 类型 :+()+\n+ 地址 :+()+\n。 第 8 页 共 21 页 (dispalystr)。 // ( 名字 :+()+\n+ 地址 :+()+\n+ 类型 :+())。 } (url)。 (正在解析: +url)。 (300)。 } n++。 } } (已经完成采集任务共分析 +n+地址 )。 (共分析 +n+地址 )。 } 模拟浏览器 模拟浏览器主要是从 web 服务器上获取网页并 把网页保存到本地缓冲区中 ,方便后续程序分析分类。 模拟浏览器 主要通过 类来实现。 网络 API 通过提供 URL 类让 用户 能在源代码层使用 URL, 每一个 URL 对象都封装了资源的标识符和协议处理程序。 获得 URL对象的途径之一是调用 URI对象的 toURL()方法。 但是这种选择不一定方便 , 作为代替 , 可以调用 URL 构造函数来建立 URL 对象 , 也可以调用 URL 的方法来提取 URL的组件,打开一个输入流( input stream)从资源中读取信息,获得某个能方便检索资源数据的对象的引用,比较两个 URL对象中的 URL,获得到资源的连接对象,该连接对象允许代码了解(并写入)更多的资源的信息。 URL类有六个构造函数。 其中最简单的是 URL(String url),它有一个 String类型的参数,把 URL分解为自己的组件,并把这些组件存储在一个新的 URL对象中。 如果某个 URL没有包含协议处理程序或该 URL的协议是未知的,其它的五个构造函数会产生一个 对象。 下面的代码展示了 网络爬虫调用网络 API 提供的 URL类 从目标服务器获取数据保存到缓冲区中的过程。 模拟浏览器源程 序 如下所示: boolean messagedig() throws Exception { URL url。 第 9 页 共 21 页 HttpURLConnection。 urlstream = null。 url = new URL()。 try { = (HttpURLConnection) ()。 (UserAgent, Mozilla/)。 ()。 urlstream = ()。 } catch (Exception e) { // TODO 自动生成 catch 块 (错误的 URL 地址 +url)。 return false。 } reader = new . BufferedReader(new (urlstream))。 String currentline=,sumstring =。 try{ while((currentline=())!=null){ sumstring+=currentline。 //保存在网络缓冲区中 } setMessage(sumstring)。 new String((),gbk)。 } catch( e){ (错误的文件格式: +())。 } return true。 } 正则表达式 正则表达式是一门语言。 有许多正则表达式语法、选项和特殊字符,在 源文件中大家可以查看。 可能比想象 中的要复杂。 组合逻辑是下一步的事情。 只要正确运用,正则表达式能够在字符串提取和文本修改中起到很大的作用。 第 10 页 共 21 页 正则表达式在本程序中的作用是分析网页 中存在的 超链接 并 保存到等待队列中 , 方便爬虫 遍历网页 获取数据 , 并把网页中存在的音乐信息提取出来为爬虫储存数据做准备。 ( 1) 句点符号 假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以“t”字母开头,以 “n”字母结束。 另外,假设有一本英文字典,你可以用正则表达式搜索它的全部内容。 要构造出这个正则表达式,你可以使用一个通配符 ——句点符号 “.”。 这样,完整的 表达式就是 “”,它匹配 “tan”、 “ten”、 “tin”和 “ton”,还匹配 “tn”、 “tpn”甚至 “t n”,还有其他许多无意义的组合。 这是因为句点符号匹配所有字符,包括空格、 Tab 字符甚至换行符 如: ① 正则表达式 : ② 匹配: tan,Ten,tin,ton,t n,tn,tpn,等。 ( 2) 方括号符号 为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号( “[]”)里面指定看来有意义的字符。 此时,只有方括号里面指定的字符才参与匹配。 也就是说,正则表达式 “t[aeio]n”只匹配 “tan”、 “Ten”、 “tin”和 “ton”。 但 “Toon”不匹配,因为在方括号之内你只能匹配单个字符: ① 正则表达式 :t[aeio]n ② 匹配 :tan,Ten,tin,ton ( 3) “或 ”符号 如果除了上面匹配的所有单词之外,你还想要匹配 “toon”,那么,你可以使用 “|”操作符。 “|”操作符的基本意义就是 “或 ”运算。 要匹配 “toon”,使用“t(a|e|i|o|oo)n”正则表达式。 这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号 “()”。 圆括号还可以用来分组,具体请参见后面介绍。 ① 正则表达式 :t(a|e|i|o|oo)n ② 匹配 :tan,Ten,tin,ton,toon ( 4) 表示匹配次数的符号 表 显示了表示匹配次数的符号,这些符号用来确定紧靠该符号左边的符号出现的次数。 表 表示次数的符号 符号 次数 0 次或者多次 + 1 次或者多次 ? 0 次或者一次 第 11 页 共 21 页 {n} 恰好 n 次 {n,m} 从 n 次到 m 次 假设要在文本文件中搜索美国的社会安全号码。 这个号码的格式是999999999。 用来匹配它的正则表达式如图一所示。 在正则表达式中,连字符( “”)有着特殊的意义,它表示一个范围,比如从 0 到 9。 因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符 “\”。 正则表达 源程序 如下: public class CompareStr { public boolean parestring(String oristring,String tostring) //判断是否存在指定表达式 { Pattern p=null。 //正则表达式 Matcher m=null。 //操作的 字符串 boolean b。 p = (oristring,)。 m = (tostring)。 b = ()。 return b。 } public String replace(String origin,String toString,String s){//替换字符 Pattern p=null。 Matcher m=null。 p=(origin,)。 m=(toString)。 return (s)。 } public String getString(String reg,String s){//返回得到的字符 String res。 Pattern p=null。 Matcher m=null。 p=(reg,)。 m=(s)。 if(()){ return ()。 第 12 页 共 21 页 } 数据分析 因为 Web 中的信息都是建立在 HTML 协议之上的,所以网络机器人在检索网页时的第一个问题就是如何解析 HTML。 在解决如何解析之前,先来介绍HTML中的几种数据。 ① 文本:除了脚本和标签之外的所有数据。 ② 注释:程序员留下的说明文字,对用户是不可见的。 ③ 简单标签:由单个表示的 HTML标签。 ④ 开始标签和结束标签:用来控制所包含的 HTML代码。 在进行解析的时候不用关心所有的标签,只需要对其中一种重要的进行解析即可。 本软件只关心 超连接标签 ,下面介绍了在本软件中如何使用。 ( 1) 超连接标签 超连接定义了 WWW通过 Inter 链接文档的功能。 他们的主要目的是使用户能够任意迁移到新的页面,这正是网络爬虫最关心的标签。 public ArrayList linkAnalyzer() //分析网页上存在的超链接 .保存在等待队列中 public List mp3analyzer() //分析网页上存在的音乐超链接和音乐名称 .保存到数据库中方便查询 ( 2) 超链接分析 以下是本软件所用到的 关键源程序 ( 超链接 ),代码如下: if((href,firstword)amp。 amp。 ({)0amp。 amp。 f(})0amp。 amp。 (39。 )0amp。 amp。 (。 )0amp。 amp。 (.css)0amp。 amp。 (.ico)0amp。 amp。 !(mp3)){ String out=null。 out=(href=|\,firstword,)。 if(( (out)。 } else{//相对的路径 try{ if((html)||(htm)){ int m=(/)。 String s=(0,m)。 第 13 页 共 21 页 webadd=s。 (debug+s+/+out)。 } } catch(StringIndexOutOfBoundsException e ){ } if((/)){ /*int m=(/)。 webadd=(0,m)。 (dafa+webadd)。 */ out=webadd+out。 (out)。 } else{ out=webadd+/+out。 (out)。 } } } i++。 } 采用 java 多线程技术 线程是 Java 的一大 特性 ,它可以是给定的指令序列、给定的方法中定义的变量或者一些共享数据 (类一级的变量 )。 在 Java中每个线程有自己的堆栈和程序计数器( PC),其中堆栈是用来跟踪线程的上下文(上下文。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。