1.0 写在配置之前:XML还是properties?
1.1 配置XML
1.1.1 config.xml的基本结构
1.1.2 WopaConfig
1.1.3 DownloadConfig
1.1.4 saverConfig
1.1.5 proxyConfig
1.1.6 FileSizeFilterConfig
1.1.7 FileFilterConfig
1.1.8 LinkFilterConfig
1.1.9 TagFilterConfig
1.2 配置properties
2 例子:图片网站的精确化下载
2.1 过滤各种网站图标
2.2 过滤不相关的栏目
2.3 分页
3 开发者文档
3.1 目录结构
3.2 编译环境
3.3 构建项目
4 扩展Wopa!
4.1 创建一个Downloader
4.2 创建一个Saver
4.3 扩展新的Filter
4.3.1 扩展LinkFilter
4.3.2 扩展TagFilter
4.3.3 扩展FileSizeFilter
4.3.4 扩展FileFilter
4.4 自定义输出
1 详细配置Wopa!
1.0 写在配置之前:XML还是properties?
在Java中,无论XML还是properties配置文件都能完成赋予他的任务。properties对于基于“键值对”的应用来说,无疑是最好的选择;而XML配置更加符合面向对象的设计思想。在Wopa!项目中,对于程序本身的配置,使用的是properties的配置方式,这个配置文件位于bin目录中,名称为wopa.properties;而对于下载项目的配置,则提供了XML和properties两种方式,这两个配置文件也都位于bin目录中,分别为config.xml和config.properties。切换这两种配置的方式也很简单:在wopa.properties中找到下面一行:
wopa.config.type=xml
xml对应了config.xml起作用,而properties则对应了cnofig.properties成为配置文件。我个人倾向于使用XML的方式来配置Wopa!项目。
1.1 配置XML
1.1.1 config.xml的基本结构
下面是config.xml的基本结构:下面逐一介绍各个节点。除有特殊说明,否则这些节点都是必要的。http://news.163.com/photo/ 1 20 net.sourceforge.wopa.picture.PictureDownloader D:\pics\ 20 10000 DIRECT hostname 80 net.sourceforge.wopa.picture.filter.MinFileFilter 40 KB net.sourceforge.wopa.picture.filter.MaxFileFilter 3 MB net.sourceforge.wopa.picture.filter.MustContainsWordsLinkFilter typeidnet.sourceforge.wopa.picture.filter.NotContainsWordsImageFilter typeid
1.1.2 WopaConfig
WopaConfig节点是config.xml的根节点。1.1.3 DownloadConfig
DownloadConfig节点对应着每个下载任务。如果启动一次程序对应多个下载任务,则要配置多个DownloadConfig节点。- name: 下载任务的名称。
- url: 下载任务的起始URL,所有下载的资源均来自该URL或其子URL。
- maxLevel: 最大下载子页面层级。-1表示不限;0表示仅下载当前页面的资源;正整数表示下载的子页面层级的最大值。比如,页面A有个链接可以链接到页面B,页面B有个链接可以链接到页面C,如果最大下载子层级为0,则只下载页面A的资源;如果为1,则下载页面A和页面B的资源;如果为-1,则下载A、B、C的资源以及A、B、C中所有链接页面的资源。
- threadCount: 最大同时下载线程数,必须为正整数。在下载资源时,每个线程对应一个资源的下载,某一个资源不会有多个线程同时对其下载。当同时下载线程数达到最大值,则新增下载线程需要排队等待前面的下载线程结束(或中断)。实际上,该实现基于JDK1.5的线程池:
java.util.concurrent.Executors.newFixedThreadPool(thread_count);
- className: 对应了下载器的实现类名称。如net.sourceforge.wopa.picture.PictureDownloader表示一个图片下载器。如果想使用自定义的下载器,请参照2.1 创建一个Downloader。
- saverConfig: 请参照1.1.4 saverConfig。
- linkFilterConfigs: LinkFilterConfig的集合。请参照1.1.8 LinkFilterConfig。
- tagFilterConfigs: TagFilterConfig的集合。请参照1.1.9 TagFilterConfig。
1.1.4 saverConfig
saverConfig代表一个保存器的配置,每个下载线程都对应一个保存器。该标签不需要指定保存器的类名称,因为要某个保存器是由下载器的实现决定的。- savePath: 本下载线程下载的资源要保存的位置。因为大多数时候,下载资源要保存的目录并不在Wopa!项目中,因此,建议此处填写绝对路径。如D:\pics\或/opt/resources/pics/。注意路径要以“/”或“\”结尾。
- bufferSize: 下载数据的缓冲区大小,单位为KB。
- timeout: 对下载资源对应URL建立连接的超时时间,单位为毫秒。
- proxyConfig: 请参照1.1.5 proxyConfig。
- fileSizeFilterConfigs: FileSizeFilterConfig的集合。请参照1.1.6 FileSizeFilterConfig。
- fileFilterConfigs: FileFilterConfig的集合。请参照1.1.7 FileFilterConfig。
1.1.5 proxyConfig
proxyConfig代表一个连接代理的配置,下载线程在下载资源时可以使用代理进行连接。如果不配置该标签,则不使用代理进行连接。- type: 代理类型,可选项为DIRECT、HTTP和SOCKS。如果选择DIRECT,则表示不使用代理进行连接。
- hostname: 该代理的主机地址。这里可以是域名或IP地址。
- port: 该代理的端口。
- username: 该代理的用户名。此标签可以不选。
- password: 该代理的密码。此标签可以不选。如果username和password都没有选,则表示该代理没有加密。
1.1.6 FileSizeFilterConfig
FileSizeFilterConfig表示一个资源长度过滤器的配置,该配置可以有多个,每个对应一个资源长度过滤器。下载线程在下载前加载该过滤器列表,如果HTTP HEADER中的Content-Length的长度满足该过滤器列表的要求,则继续下载,否则丢弃。- className: 资源长度过滤器的类名称。如net.sourceforge.wopa.picture.filter.MinFileFilter表示一个最小长度过滤器。如果想使用自定义的资源长度过滤器,请参照4.3.3 扩展新的FileSizeFilter。
- size: 满足条件的长度。
- sizeType: 满足条件的长度类型。可选项为B、KB、MB、GB。
1.1.7 FileFilterConfig
FileFilterConfig表示一个资源过滤器的配置,该配置可以有多个,每个对应一个资源过滤器。下载线程在下载后加载该过滤器列表,如果下载后的文件满足该过滤器列表的要求,则保留该文件,否则删除该文件。- className: 资源长度过滤器的类名称。如果想使用自定义的资源长度过滤器,请参照4.3.4 扩展新的FileFilter。
- param1: 过滤器的第一个参数。
- param2: 过滤器的第二个参数。
1.1.8 LinkFilterConfig
LinkFilterConfig表示一个链接过滤器的配置,该配置可以有多个,每个对应一个链接过滤器。页面分析器在分析页面时加载该过滤器列表,如果链接满足该过滤器列表的要求,则继续分析该链接的子链接,否则丢弃。- className: 链接过滤器的类名称。如net.sourceforge.wopa.picture.filter.NotContainsWordsLinkFilter表示一个黑名单关键字过滤器。如果想使用自定义的链接过滤器,请参照4.3.1 扩展新的LinkFilter。
- param: 过滤器的参数,如黑名单关键字列表,所有包含黑名单关键字的链接都将被丢弃。
1.1.9 TagFilterConfig
LinkFilterConfig表示一个标签过滤器的配置,该配置可以有多个,每个对应一个标签过滤器。页面分析器在分析页面时加载该过滤器列表,如果标签满足该过滤器列表的要求,则递交给保存器下载保存,否则丢弃。- className: 标签过滤器的类名称。如net.sourceforge.wopa.picture.filter.NotContainsWordsImageFilter表示一个黑名单关键字图片标签过滤器。如果想使用自定义的标签过滤器,请参照4.3.2 扩展新的TagFilter。
- param: 过滤器的参数,如黑名单关键字列表,所有包含黑名单关键字的图片标签都将被丢弃。
1.2 配置properties
由于properties配置简单且不符合面向对象的设计思想,故properties的配置省略。有兴趣的朋友可以参照JavaDoc中的Constants类。
2 例子:图片网站的精确化下载
2.1 过滤各种网站图标
2.2 过滤不相关的栏目
2.3 分页
3 开发者文档
3.1 目录结构
以下是Wopa!项目源代码的目录结构:- net.sourceforge.wopa: 基础类包,包括抽象的下载器和保存器、线程池等。
- net.sourceforge.wopa.config: 配置类包,所有的和下载项目有关的配置都被封装在一系列的POJO对象中。
- net.sourceforge.wopa.config.properties: properties配置加载类。
- net.sourceforge.wopa.xml: XML配置加载类。
- net.sourceforge.wopa.filter: 基础的过滤器包,包含项目中用到的过滤器的接口和抽象类。
- net.sourceforge.wopa.output: 输出包。项目中所有的输出均和该包有关,想自定义输出的内容,请参照4.4 自定义输出。
- net.sourceforge.wopa.picture: Wopa!项目自带的一个实现——图片下载器的基础类包。
- net.sourceforge.wopa.picture.filter: 图片下载器实现的过滤器。
- net.sourceforge.wopa.startup: 项目入口。
- net.sourceforge.wopa.tag: 重新包装了htmlparser的部分标签。
- net.sourceforge.wopa.ui: 目前为空,以后做为图形界面包。
- net.sourceforge.wopa.util: 工具包。
3.2 编译环境
由于Wopa!项目大量使用了泛型、枚举和foreach,因此需要JDK1.5.0以上的编译器。3.3 构建项目
Wopa!项目使用Apache Ant来构建。构建方法:
1.到Ant官方网站下载最新版的Ant。
2.将%ANT_HOME%\bin添加到环境变量中。
3.修改源代码根目录中的build.xml文件,修改一些路径到你电脑上指定的路径。
4.在命令行中进入源代码根目录,执行ant命令。
4 扩展Wopa!
4.1 创建一个Downloader
4.2 创建一个Saver
4.3 扩展新的Filter
4.3.1 扩展LinkFilter
4.3.2 扩展TagFilter
4.3.3 扩展FileSizeFilter
4.3.4 扩展FileFilter
4.4 自定义输出
在Wopa!项目中,所有的输出都是通过Output类来实现的。 在Output类中,默认实现了一个Writer接口来完成输出的工作:/** 默认的Writer接口实现 */ private static Writer WRITER = new Writer(){ public void write(Type type, String s){ String sysdate = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM).format(new Date()); System.out.println(sysdate + " [" + type + "]: " + s); } };如果你想使用日志来记录输出,甚至将输出显示在图形界面上,你只要创建一个实现了Writer接口的类,并且在使用Output前调用setWriter()方法即可。
Output.setWriter(new Writer(){ public void write(Type type, String s){ //你想要的输出 } });