破釜沉舟论坛 » 编程开发 » 论坛数据采集程序--设计

2006-4-6 21:03 祥子
论坛数据采集程序--设计

  因为每个论坛的规则都不一样,所以这里可以模仿工厂模式来设计。

先抽象出所有论坛的同性,建成基类(其实是一个接口)。
主程序选择不同的论坛而创建不同的实例对象。而这些实例对象都是该基类的子类。

基类要包含所有论坛的共同特征及一些共用的处理函数。
如何抽象将确定肯定程序的合理性与健壮性。从设计的角度出发,如果要对所有的论坛子类增加一个功能或删除一个功能,只要改基类;如果对某个论坛子类做修改,只要改子类。同时要尽可能地做到代码重用率最高。

同时考虑到网速的原因。如果是单线程,肯定有会很大一部分时间浪费在了和论坛服务器的通信上了,而这个时候,CPU的资源就被浪费掉了。所以要使用多线程,几个线程轮流下载。有点像网际快车那样。

因为每个贴子都有ID,这个ID会在URL中体现出来。所以如何给线程分配ID是很重要的。同时有了多线程就一定得考虑临界资源,要防止脏读,把线程要访问到的资源全部放到临界区去。

考虑到断点续传的问题,所以要先取得所有要下载贴子的ID,然后一个一个地发给线程,交由线程去下载。同时保存下一个要下载ID在数据库中的序号,续传的时候直接由那个序号取得ID,继续分配ID

而取ID最好的办法就是先取得论坛的所有版块,然后把每个版块里的贴子ID全下载下来,这样,分配ID的时候,就可以先查ID表,取出所有ID,再来分配。

基于以上思路,主程序就应该要有以下模块:登陆模块、下载版块模块、生成版块列表模块、下载ID列表模块、下载贴子模块。

登陆模块在上一篇初级准备中已经介绍。

下载版块很简单,单线程就足够了。在查看贴子的页面中都会有“跳转至....”可以从那里取得所有的版块及其版块ID。

生成版块列表也很简单,直接从数据库中取出版块列出来就OK了,由用户选择需要下贴子ID表的版块。

下载ID列表模版比较类似下载贴子模块。由于每个论坛的贴子有很多,所以可以考虑给线程分配版块ID,然后在线程里下载该版块内的所有贴子ID。

主程序最后的问题就是信息的返回,要给用户一个输出信息,知道每个线程的状态,下载的进度。所以要在线程类中使用回调函数,调用主程序的更新显示(要记得放在临界区)。



论坛基类:

从登陆入手(这里考虑使用WEBBROWSER的情况)。

登陆方法:PUBLIC,每个论坛登陆成功后都会有个退出的的超级链接,找到它就说明登陆成功,否则失败。因为每个论坛都有,所以这个方法因该是基类的虚方法。如果没有特殊情况,子类就直接继承。

取得贴子ID对应的URL:PUBLIC,因为在线程中要用到,而因为每个论坛的URL给定方式不一样,所以要是抽象方法,由子类去实现。

取得贴子ID对应的总页数:PUBLIC,抽象的

解析贴子ID的主题内容:PUBLUIC,抽象的

解析贴子ID的回复内容:PUBLUIC,虚的。因为每个论坛的回复解析方法都与解析主题方法基本一样,所以如果没有特殊情况,子类可以继承基类的方法实现

生成要取得所有版块信息的页面的URL: PUBLIC,虚的。

解析版块: PUBLIC,抽象的

生成ID列表的URL: PUBLIC,虚的

解析ID列表: PUBLIC,抽象的

取得给定版块的ID列表的总页数: PUBLIC,抽象的

删除起始符与结束符之间的内容:protected

取得起始符与结束符之间的内容:protected

文本内容修正:protected

保存贴子主题内容:protected,回调函数

保存贴子回复内容:protected,回调函数

保存用户信息:protected,回调函数

保函版块信息:protected,回调函数

保存ID列表:protected,回调函数

至于具体如何实现,我已经做好,但出于某些原因,我不能完全公布出来。

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.