仇兆存
摘要:为了使用户更加方便地查看新闻信息,不受时间或是网络资源等条件的制约,也可以做为自动生成新闻网页的新闻类网站提供信息来源,该系统以面向对象的设计思想,采用Java语言,凭借Eclipse3.1的开发工具,对网站新闻信息进行了搜集。在可移植性和可维护性等方面有较好的体现。其中运用了多线程的方法对新闻信息进行了快速的下载、整理与收集,为用户查阅新闻信息提供了方便,节省了大量时间。
关键词:面象对象;多线程;新闻搜集;正则表达式
中图分类号:TP311文献标识码:A文章编号:1009-3044(2012)05-1098-04
The Design and Implementation of News-gathering System for Website
QIU Zhao-cun
(Jiangsu Radio and Television University Jiangdu College, Yangzhou 225200, China)
Abstract: To enable users to more easily view news and information, without the restriction of time or network resources and other condi? tions, the system can provide original information for the news website that can automatically generate news pages. The system relys on the object-oriented design idea, Java language, and the development tools of Eclipse3.1, to gather information for the site. It has better perfor? mance in portability and maintainability and other aspects. The system can realize fast download, arrangement and collection of the news and information by using multi-threaded approach, and make it convenient for users to access news and information.
Key words: object-oriented; multi-threading; news gathering; regular expression
如今,网络在人们生活和工作中起着越来越重要的作用,而从网上获取新闻信息更是成了很多人获知新闻的主要渠道。如果拥有自己的网站,为了让更多的人来浏览,就必须进行及时更新,可以从那些大的网站中找出想要的新闻信息然后转载过来,然而,这些网站上的信息量巨大,如果仅仅靠人工方式进行机械的拷贝,那将显得效率太低且繁琐,其实,我们可以编写程序让程序来完成这些工作。
1需求分析
1.1现状分析
现代人的生活已经越来越离不开互联网络了。我们的语言中已经由于网络而增加了许多新鲜的血液,通讯交流由于网络而变得更加方便快捷,知识的更新速度也由于网络而加快……中国互联网的发展迅速,为了对中文信息处理作一些研究,我们需要先从网络中收集部分相关的信息。163和TOM两个网站的信息量较大,故将这两个网站作为目标站点,从中收集原始数据。
1.2设计目标
研究目标是:对面向对象编程的整个过程有一个全面的了解;熟练使用Java语言进行编程,尤其要掌握用Java进行网络编程的方法;能在Eclipse环境中进行Java项目的开发;了解Html标记语言,能通过程序分析找出Html标记当中的超链接。
设计内容:网络信息收集系统的开发。首先,通过在硬盘上建一个根目录,在这个根目录下新建一个子目录,子目录名为程序运行的日期,然后在子目录下建立163、TOM两个目录,在目录下分别建立政治、体育、财经等十个目录;将163、TOM网站的新闻主页下载下来,存放在各自的根目录下;通过分析新闻主页的Html代码,找出要下载的超链接;再对这些超链接进行分析,将其分类并下载下来,分别存放到已经建立的目录下。
1.3平台选择
操作系统:WindowsXP
开发语言:Java
开发平台:JDK5.0、Eclipse
2系统实现技术
2.1系统总体结构设计
本程序中共有两个包:command和main,command包中的类是实现整个系统功能的类,main包中的类调用command包中类的方法作为程序的入口。command包中有11个类,分别是Analyze163、AnalyzeTOM、Downloads、DownPath、MainVariable、MkDir、NetSite、NewsPage和SubStr,其中类Analyze163用来对163网站进行分类下载,类AnalyzeTOM用来对TOM网站进行分类下载,类Downloads用来进行单个网页的下载,类DownPath用来保存各个网站下载的路径,类MainVariable用来保存程序中要用到的相当于全局变量作用的变量,类MkDir用来建立多个目录,类NetSite用来对网站进行分析和分类下载,类NewsPage用来分析网站的新闻主页,类Sub? Str用来截取目标字符串,用正则表达式对截取后的目标字符串进行匹配,并对匹配成功的链接进行下载。main包中只有一个类NetInfoCollect,用来作为程序的入口,调用类NetSite的AnalyzeDown方法对多个网站进行分析并分类下载。
程序流程:由main包的NetInfoCollect类进入程序,NetInfoCollect的main方法调用类NetSite的AnalyzeDown方法对多个网站进行分析并分类下载,在AnalyzeDown方法中,先调用类MkDir的Makedirs方法建立要下载网站的下载目录,再调用类Downloads的NetPageDown方法下载网站的新闻主页,并将下载下来的新闻主页保存到网站的根目录下,然后调用NewsPage的AnalyzeNewspage方法对新闻主页进行分析,找出要下载的超链接并保存到网站根目录的URL.txt文件中,最后调用Analyze163的StapleDown163方法实现163网站的分类下载,调用AnalyzeSina的StapleDownSina方法实现SINA网站的分类下载,调用AnalyzeSohu的StapleDownSohu方法实现SOHU网站的分类下载,调用AnalyzeTOM的StapleDownTOM方法实现TOM网站的分类下载。程序的流程图如图1所示。
图1程序流程图
2.2系统中的关键技术
2.2.1核心技术
1)正则表达式
正则表达式(regular expression,简称regexes)是操作和检验字符串数据的一种强大的工具,是用来描述字符串集的字符串。在用正则表达式对网页源文件进行成功匹配后,将得到这个网页中有用的超链接地址,也就是要进行下载的网页地址,这时就可以调用进行下载的类将这些匹配成功的网页下载下来。
2)StringTokenizer类
StringTokenizer类允许应用程序将字符串分解为标记,StringTokenizer方法不区分标识符、数和带引号的字符串,它们也不识别并跳过注释。可以在创建时指定,也可以根据每个标记来指定分隔符(分隔标记的字符)集合。
3)String类
在Java语言中,String类代表字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例来实现。
4)输入与输出
由于本程序中要将网页下载下来保存到硬盘中,还要从文件中读出要下载的链接地址,因此输入输出也是本程序的一个重点。
①基本输入/输出流类
流是数据的有序序列,它既可以是未加工的原始二进制数据,也可以是经过一定编码处理后的符合某种规定格式的特定数据,如字节流序列、字符流序列等。数据的性质、格式不同,则对流的处理方法也不同,因此,Java的输入/输出类库中有不同的流类来对应不同性质的输入/输出流。在java.io包中基本输入/输出流类可按读写数据的不同类型分为两种:字节流和字符流。
②文件的输入/输出
Java语言的java.io包中的File类是专门用来管理磁盘文件和目录的。每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文件或目录的相关信息,如文件或目录的名称、文件的长度、目录中所含文件的个数等。调用File类的方法则可以完成对文件或目录的常用管理操作,如创建文件或目录、删除文件或目录、查看文件的有关信息等。
2.2.2使用到的Java包介绍
1)java.io包
java.io包用来通过数据流、序列和文件系统为系统提供输入输出。
2)java.net包
java.net包支持TCP/IP网络协议,并包含Socket类及URL相关的类,是网络编程中要使用到的。
3)java.util包
java.util包包含集合框架、遗留的collection类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
4)java.text包
java.text包提供以与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。
2.3系统各部分的实现方法
2.3.1 command包的设计与实现
1)MainVariable类的设计与实现
类MainVariable用来保存程序中要用到的相当于全局变量作用的变量,这个类中只有一个静态String变量HOME_PATH,它是整个程序输出的根目录,HOME_PATH的值是"C:\MyProgram"字符串。
2)MkDir类的设计与实现
类MkDir用来建立多个目录,这个类中要引入java.io包、java.util包和java.text.SimpleDateFormat包,在这个类中包括一个静态String变量dirName以及四个静态方法formatTime、Makedir、Makedirs和deletePath。其中,静态String变量dirName用来保存程序运行日期的字符串形式,它的值是静态方法formatTime的返回值,作为日期目录的目录名。
3)Downloads类的设计与实现
类Downloads用来下载网页,这个类中要引入java.net包和java.io包,这个类中只有一个静态方法NetPageDown,它用来下载网页,它有两个参数url和fileName,其中参数url是要下载的网页的地址,参数fileName是下载下来的网页在硬盘上对应的文件。
4)DownPath类的设计与实现
类DownPath是各个网站下载的路径,这个类包括十个String变量:tmpPath、Politics、ChinaPolitics、WorldPolitics、Sports、ChinaS? ports、WorldSports、Finance、ChinaFinance、WorldFinance和Society,以及一个DownPath方法。其中,String变量tmpPath是各个网站下载的根目录,String变量Politics是政治新闻下载目录,String变量ChinaPolitics是国内政治新闻下载目录等等。方法DownPath用来对下载路径进行初始化,它有一个参数net,是要下载的网站的网站名,其它类调用该方法给上面的十个String变量重新赋值,让它们指向当前下载的网站的路径。
5)NewsPage类的设计与实现
类NewsPage用来分析新闻主页,这个类中要引入5个包,分别是java.io.BufferedWriter包,java.io.File包,java.io.FileWriter包,ja? va.util.regex.Matcher包和java.util.regex.Pattern包。这个类只有一个静态方法AnalyzeNewspage,它用来找出新闻主页中与正则表达式匹配的链接,并将这些链接保存到文件中。
6)SubStr类的设计与实现
类SubStr用来截取目标字符串,用正则表达式对截取后的目标字符串进行匹配,并对匹配成功的链接进行下载,这个类中要引入6个包,分别是java.io.File包,java.io.FileInputStream包,java.net.URL包,java.util.StringTokenizer包,java.util.regex.Matcher包和java.util. regex.Pattern包。这个类中有两个静态变量totalNum和downNum,一个初始化方法SubStr,一个静态方法getFileToString,一个静态方法StapleDown,以及两个subStr方法。其中,静态变量totalNum是要下载的网页的总数,静态变量downNum是已经下载的网页的个数。
7)AnalyzeSina类的设计与实现
类AnalyzeSina用来分类下载SINA,这个类要引入三个包,分别是java.net包,java.io包和java.util包。这个类中只有一个静态方法StapleDownSina,它用来读取保存的链接,对链接进行分类并下载保存到分类后的目录内。
2.3.2 main包的设计与实现
1)NetInfoCollect类的设计与实现
类NetInfoCollect调用类NetSite的AnalyzeDown方法对多个网站进行分析并分类下载,这个类中要引入command包和java.io包,在这个类只有一个方法main方法。首先判断C盘根目录下是否有MyProgram目录,如果没有则创建,然后调用类NetSite的Analyze? Down方法对SINA、163、TOM和SOHU四个网站进行分类下载。
3系统测试与评价
3.1测试环境介绍
操作系统:WindowsXP
运行环境:JRE5.0、Windows命令行
3.2实例测试
首先,在环境变量path中设置JDK的bin目录的位置,再在classpath中设置程序源文件所在路径,这里设置为C:MyProgramInfo?Collectionsrc目录,打开Windows命令行,在命令行窗口中输入cd C:MyProgramInfoCollectionsrcmain,改变目录到main包下,然后输入javac NetInfoCollect.java,编译java源文件,再输入cd..,将路径改变为C:MyProgramInfoCollectionsrc,输入java main.NetInfoCol? lect运行程序,就可以看到程序的运行情况了。
图2 TOM网站信息搜集测试
3.3评价分析
这个程序已经基本实现了网络信息收集的功能,可以对多个网站进行分类下载,但是由于每一个网站要下载的网页数目众多,而且每个网页下载前先要与网站进行连接等待,因此下载所花费的时间会有一些长,在程序的改进中应考虑引入多线程进行下载,减少等待时间,提高下载速度。另外,由于对163网站和TOM网站的分类都是根据网页的特征进行人工分类的,因此不能保证所有的网页都被正确的归类,但大多数网页都能够划分到正确的类别当中。
参考文献:
[1] Eckel B.Java编程思想(英文版)[M].3版.北京:机械工业出版社,2004.
[2] Gallardo D,Burnette E,McGovern R.Eclipse in Action[M].Manning Publications,2003.
[3]计算机世界网.Java正则表达式详解[EB/OL].[2006-04].http://www.ccw.com.cn/htm/app/aprog/01_7_31_4.asp.
[4]魔法博客天空.正则表达式简介[EB/OL].[2006-04].http://magichere.blogchina.com/4057133.html.
[5]我要学习网.正则表达式的基本语法[EB/OL].(2006-04).http://woyaoxuexi.net/web/PHP/biaoda/200504/27291.html.
[6]朱喜福,林建民,唐永新.Java程序设计[M].北京:人民邮电出版社,2004.
[7] SUN.JAVA官方在线JDK帮助文档[EB/OL].[2006-04].http://java.sun.com/j2se/1.5.0/docs/api/.
[8]强锋科技,陈刚.Eclipse从入门到精通[M].北京:清华大学出版社,2005.
[9] Horstmann C S,Cornell G.JAVA2核心技术卷I:基础知识[M].叶乃文,译.7版.北京:机械工业出版社,2006.
[10] Arnold K,Gosling J,Holmes D.Java程序设计语言(英文版)[M].4版.北京:人民邮电出版社,2006.