配置文件在Linux下使用得非常普遍,但是Linux下没有统一个配置文件标准。

我们把配置文件的规则制定如下:

1、把“#”视作注释开始

2、所有的配置项都都是以键值对的形式出现

3、严格区分大小写

4、允许数据类型为整型的配置项

5、允许数据类型为字符串类型的配置项

6、允许数据类型为逻辑型的配置项,取值为yes或者no。

同时我们需要对配置文件做初始化和载入两个操作。

代码如下:

  1. /* confparser.c*/
  2.  
  3. #ifndef CONFPARSER_H
  4. #define CONFPARSER_H
  5.  
  6. #include <vector>
  7. using namespace std;
  8.  
  9. #define MAX_CONF_LEN 1024
  10. #define CONF_FILE "spider.conf"
  11.  
  12. /* see the spiderq.conf to get meaning foreach member variable below */
  13. typedef struct Config {
  14. int max_job_num;
  15. char *seeds;
  16. char *include_prefixes;
  17. char *exclude_prefixes;
  18. char *logfile;
  19. int log_level;
  20. int max_depth;
  21. int make_hostdir;
  22. int stat_interval;
  23.  
  24. char * module_path;
  25. vector<char *> modules;
  26. vector<char *> accept_types;
  27. };
  28.  
  29. extern Config * initconfig();
  30.  
  31. extern void loadconfig(Config *conf);
  32.  
  33. #endif

  1. /* confparser.c*/
  2.  
  3. #include "spider.h"
  4. #include "qstring.h"
  5. #include "confparser.h"
  6.  
  7. #define INF 0x7FFFFFFF
  8.  
  9. Config * initconfig()
  10. {
  11. Config *conf = (Config *)malloc(sizeof(Config));
  12.  
  13. conf->max_job_num = 10;
  14. conf->seeds = NULL;
  15. conf->include_prefixes = NULL;
  16. conf->exclude_prefixes = NULL;
  17. conf->logfile = NULL;
  18. conf->log_level = 0;
  19. conf->max_depth = INF;
  20. conf->make_hostdir = 0;
  21. conf->module_path = NULL;
  22. conf->stat_interval = 0;
  23. //conf->modules
  24.  
  25. return conf;
  26. }
  27.  
  28. void loadconfig(Config *conf)
  29. {
  30. FILE *fp = NULL;
  31. char buf[MAX_CONF_LEN+1];
  32. int argc = 0;
  33. char **argv = NULL;
  34. int linenum = 0;
  35. char *line = NULL;
  36. const char *err = NULL;
  37.  
  38. if ((fp = fopen(CONF_FILE, "r")) == NULL) {
  39. SPIDER_LOG(SPIDER_LEVEL_ERROR, "Can't load conf_file %s",CONF_FILE);
  40. }
  41.  
  42. while (fgets(buf, MAX_CONF_LEN+1, fp) != NULL) {
  43. linenum++;
  44. line = strim(buf);
  45.  
  46. if (line[0] == '#' || line[0] == '\0') continue;
  47.  
  48. argv = strsplit(line, '=', &argc, 1);
  49. if (argc == 2) {
  50. if (strcasecmp(argv[0], "max_job_num") == 0) {
  51. conf->max_job_num =atoi(argv[1]);
  52. } else if (strcasecmp(argv[0], "logfile") == 0) {
  53. conf->logfile =strdup(argv[1]);
  54. } else if (strcasecmp(argv[0], "include_prefixes") == 0) {
  55. conf->include_prefixes =strdup(argv[1]);
  56. } else if (strcasecmp(argv[0], "exclude_prefixes") == 0) {
  57. conf->exclude_prefixes =strdup(argv[1]);
  58. } else if (strcasecmp(argv[0], "seeds") == 0) {
  59. conf->seeds =strdup(argv[1]);
  60. } else if (strcasecmp(argv[0], "module_path") == 0) {
  61. conf->module_path =strdup(argv[1]);
  62. } else if (strcasecmp(argv[0], "load_module") == 0) {
  63. conf->modules.push_back(strdup(argv[1]));
  64. } else if (strcasecmp(argv[0], "log_level") == 0) {
  65. conf->log_level =atoi(argv[1]);
  66. } else if (strcasecmp(argv[0],"max_depth") == 0) {
  67. conf->max_depth =atoi(argv[1]);
  68. } else if (strcasecmp(argv[0], "stat_interval") == 0) {
  69. conf->stat_interval =atoi(argv[1]);
  70. } else if (strcasecmp(argv[0], "make_hostdir") == 0) {
  71. conf->make_hostdir =yesnotoi(argv[1]);
  72. } else if (strcasecmp(argv[0], "accept_types") == 0) {
  73. conf->accept_types.push_back(strdup(argv[1]));
  74. } else {
  75. err = "Unknowndirective"; goto conferr;
  76. }
  77. } else {
  78. err = "directive must be 'key=value'"; goto conferr;
  79. }
  80.  
  81. }
  82. return;
  83.  
  84. conferr:
  85. SPIDER_LOG(SPIDER_LEVEL_ERROR, "Bad directive in %s[line:%d]%s", CONF_FILE, linenum, err);
  86. }

Linux企业级项目实践之网络爬虫(5)——处理配置文件的更多相关文章

  1. Linux企业级项目实践之网络爬虫(1)——项目概述及准备工作

    我们在学习了Linux系统编程之后,需要一些实战项目来提高自己的水平,本系列我们通过编写一个爬虫程序,将我们学习的知识进行综合应用,同时在实现项目的过程中逐渐养成一些有用的思维方式,并具有初步的软件开 ...

  2. Linux企业级项目实践之网络爬虫(29)——遵守robots.txt

    Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以 ...

  3. Linux企业级项目实践之网络爬虫(21)——扩展为多任务爬虫

    高效的网络爬虫是搜索引擎的重要基础.采用多任务并发执行,实现类似于CPU的流水线(pipeline)运行方式,可极大地提高网络和计算资源的利用率等性能. #include "threads. ...

  4. Linux企业级项目实践之网络爬虫(2)——网络爬虫的结构与工作流程

    网络爬虫是捜索引擎抓取系统的重要组成部分.爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份. 一个通用的网络爬虫的框架如图所示:

  5. Linux企业级项目实践之网络爬虫(23)——系统测试:找出系统中的bug

    为了验证爬虫的业务流程.性能和健壮性需要进行测试. 软件测试是描述一种用来促进鉴定软件的正确性.完整性.安全性和质量的过程.软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件 ...

  6. Linux企业级项目实践之网络爬虫(28)——爬虫socket处理

    Socket是进程之间交换数据的机制.这些进程即可以是同一台机器上的,也可以是通过网络连接起来的不同机器.一旦一个Socket连接建立,那么数据就能够双向传输,直到其中一端关闭连接. 通常,请求数据的 ...

  7. Linux企业级项目实践之网络爬虫(19)——epoll接口

    由于要实现爬虫程序的快速抓取,显然如果采用阻塞型的I/O方式,那么系统可能很长时间都处在等待内核响应的状态中,这样爬虫程序将大大地降低效率.然而,如果采用非阻塞I/O,那么就要一直调用应用进程,反复对 ...

  8. Linux企业级项目实践之网络爬虫(6)——将程序设计成为守护进程

    在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统. ...

  9. Linux企业级项目实践之网络爬虫(3)——设计自己的网络爬虫

    网络抓取系统分为核心和扩展组件两部分.核心部分是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.目标是尽量的模块化,并体现爬虫的功能特点.这部分提供简单.灵活的API,在基本不 ...

  10. Linux企业级项目实践之网络爬虫(30)——通过查阅RFC文档扩充更加复杂的功能

    HTTP是一种很简单的请求.响应式协议,客户端发送一个请求.服务器返回一个响应.HTTP 1.1 版本规范由 RFC2616 定义.了解了 HTTP请求.响应消息在TCP数据流中的格式,很容易使用纯 ...

随机推荐

  1. [LeetCode] 128. Longest Consecutive Sequence 解题思路

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  2. [LeetCode] Search in Rotated Sorted Array I (33) && II (81) 解题思路

    33. Search in Rotated Sorted Array Suppose a sorted array is rotated at some pivot unknown to you be ...

  3. 简易封装一个带有占位文字的TextView

    在实际iOS应用开发中我们经常会用到类似于下图所示的界面,即带有占位文字的文本框:

  4. 菜单栏始终浮动在顶部 js

    //菜单栏始终浮动在顶部var navH = $(".trade-tab-bot").offset().top;//获取要定位元素距离浏览器顶部的距离//滚动条事件$(window ...

  5. lession2:使用HTTP Cookie 管理器来传递cookies值

    在实际进行压力测试的时候,经常会出现使用cookie传递值的情况,此时就需要使用[HTTP Cookie 管理器]来传递cookie值. 1.参照lession1中,创建线程组.sampler及聚合报 ...

  6. Objective-C基础学习笔记——对象初始化

    obj中创建新对象有两种方式:[classname new]和[[classname alloc] init].两种方法等价,Cocoa惯例是使用alloc和init. 1.分配对象: allocat ...

  7. [原创作品]一个实用的js倒计时器 postby:zhutty.cnblogs.com

    今天做了一个手机短信发送倒计时,额,就是每隔多长时间可以重新发送的功能.贡献出来给园有吐槽点评. //倒计时,time:时长(秒),scb:每秒回调,cb:计时完成回调 var timing = fu ...

  8. 常见算法:C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

  9. 完全卸载sql2005

    转自:http://www.cnblogs.com/mytechblog/articles/1883961.html 1.Stop 所有服务 2.在控制面板中卸载所有与SQL Server 2005相 ...

  10. 【转】MVP和MVC的区别

    转自:http://www.cnblogs.com/end/archive/2011/06/02/2068512.html MVC和MVP到底有什么区别呢? 从这幅图可以看到,我们可以看到在MVC里, ...