262012
 

原创文章,转载请注明来自Sean的技术博客

经过之前的需求分析,整个软件的架构基本可以确定下来。考虑到用户对于存储方式的需求可能再次发生变化,在实现过程中,把整个程序分成若干模块,主程序仅提供互操作的接口。一旦需求变动,只需改动部分模块或者增删部分模块,而不必影响其他部分的代码。使得各个模块间的耦合度降低。

image

整个程序的流程图如上图,需要被加载的模块信息存储在一个配置文件中,每次执行数据抓取和存储之前,先通过配置文件获得要加载的模块。这些模块包括:

  1. mod_utils:通过基本库实现日志功能,网址生成,邮件发送,单位转换和配置文件读取。
  2. mod_rawdata:定义了数据获取,处理和存储的接口。由于本次需求对抓取的来源非常的单一,所以在内部实现了获取和处理两个接口,解析得到的JSON数据,过滤出有价值的信息,并把它们处理成便于存储的格式放在内存中。同时留出存储接口供下面的模块使用。
  3. mod_text:将内存中的数据以txt文件的形式存储。
  4. mod_excel:将内存中的数据以xls文件的形式存储。
  5. mod_sqlite:将内存中的数据存储到SQLite数据库中。

配置文件包括:

  1. zone.xml:储存区域的信息,不同的区域对应的URL是不同的,mod_utils中提供一个函数,将每个Zone映射到一个URL上。
  2. config.ini:里面包括三个字段,module字段指出哪些存储方式将被使用;interval字段指定了在非单次执行模式中,两次抓取之间的时间间隔(秒);email字段指定一个或多个电子邮件地址,将在程序的log模块中记录到异常时候发送邮件通知。

全局的模块就是Log模块,它在程序启动的第一时间加载,并全程记录信息抓取、数据存储的过程。如果过程顺利,则每次仅简单的指出Success信息;如果出错,将按照调用栈反向输出错误信息,便于分析问题的出处。

目录结构如下:

捕获

 Leave a Reply

(必须填写)

(必须填写,邮件地址不会被泄露)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>