Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案
配置檔案在Linux下使用得非常普遍,但是Linux下沒有統一個配置檔案標準。
我們把配置檔案的規則制定如下:
1、把“#”視作註釋開始
2、所有的配置項都都是以鍵值對的形式出現
3、嚴格區分大小寫
4、允許資料型別為整型的配置項
5、允許資料型別為字串型別的配置項
6、允許資料型別為邏輯型的配置項,取值為yes或者no。
同時我們需要對配置檔案做初始化和載入兩個操作。
程式碼如下:
/* confparser.c*/
#ifndef CONFPARSER_H
#define CONFPARSER_H
#include <vector>
using namespace std;
#define MAX_CONF_LEN 1024
#define CONF_FILE "spider.conf"
/* see the spiderq.conf to get meaning foreach member variable below */
typedef struct Config {
int max_job_num;
char *seeds;
char *include_prefixes;
char *exclude_prefixes;
char *logfile;
int log_level;
int max_depth;
int make_hostdir;
int stat_interval;
char * module_path;
vector<char *> modules;
vector<char *> accept_types;
};
extern Config * initconfig();
extern void loadconfig(Config *conf);
#endif
/* confparser.c*/
#include "spider.h"
#include "qstring.h"
#include "confparser.h"
#define INF 0x7FFFFFFF
Config * initconfig()
{
Config *conf = (Config *)malloc(sizeof(Config));
conf->max_job_num = 10;
conf->seeds = NULL;
conf->include_prefixes = NULL;
conf->exclude_prefixes = NULL;
conf->logfile = NULL;
conf->log_level = 0;
conf->max_depth = INF;
conf->make_hostdir = 0;
conf->module_path = NULL;
conf->stat_interval = 0;
//conf->modules
return conf;
}
void loadconfig(Config *conf)
{
FILE *fp = NULL;
char buf[MAX_CONF_LEN+1];
int argc = 0;
char **argv = NULL;
int linenum = 0;
char *line = NULL;
const char *err = NULL;
if ((fp = fopen(CONF_FILE, "r")) == NULL) {
SPIDER_LOG(SPIDER_LEVEL_ERROR, "Can't load conf_file %s",CONF_FILE);
}
while (fgets(buf, MAX_CONF_LEN+1, fp) != NULL) {
linenum++;
line = strim(buf);
if (line[0] == '#' || line[0] == '\0') continue;
argv = strsplit(line, '=', &argc, 1);
if (argc == 2) {
if (strcasecmp(argv[0], "max_job_num") == 0) {
conf->max_job_num =atoi(argv[1]);
} else if (strcasecmp(argv[0], "logfile") == 0) {
conf->logfile =strdup(argv[1]);
} else if (strcasecmp(argv[0], "include_prefixes") == 0) {
conf->include_prefixes =strdup(argv[1]);
} else if (strcasecmp(argv[0], "exclude_prefixes") == 0) {
conf->exclude_prefixes =strdup(argv[1]);
} else if (strcasecmp(argv[0], "seeds") == 0) {
conf->seeds =strdup(argv[1]);
} else if (strcasecmp(argv[0], "module_path") == 0) {
conf->module_path =strdup(argv[1]);
} else if (strcasecmp(argv[0], "load_module") == 0) {
conf->modules.push_back(strdup(argv[1]));
} else if (strcasecmp(argv[0], "log_level") == 0) {
conf->log_level =atoi(argv[1]);
} else if (strcasecmp(argv[0],"max_depth") == 0) {
conf->max_depth =atoi(argv[1]);
} else if (strcasecmp(argv[0], "stat_interval") == 0) {
conf->stat_interval =atoi(argv[1]);
} else if (strcasecmp(argv[0], "make_hostdir") == 0) {
conf->make_hostdir =yesnotoi(argv[1]);
} else if (strcasecmp(argv[0], "accept_types") == 0) {
conf->accept_types.push_back(strdup(argv[1]));
} else {
err = "Unknowndirective"; goto conferr;
}
} else {
err = "directive must be 'key=value'"; goto conferr;
}
}
return;
conferr:
SPIDER_LOG(SPIDER_LEVEL_ERROR, "Bad directive in %s[line:%d]%s", CONF_FILE, linenum, err);
}
相關文章
- Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(18)——佇列處理Linux爬蟲佇列
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(4)——主程式流程Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(8)——認識URLLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式Linux爬蟲套件模式
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- 網路爬蟲專案爬蟲
- 企業資料爬蟲專案爬蟲
- 網路爬蟲專案蒐集爬蟲
- 企業資料爬蟲專案(二)爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 專案--python網路爬蟲Python爬蟲
- 網路爬蟲(python專案)爬蟲Python
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 在scrapy框架下建立爬蟲專案,建立爬蟲檔案,執行爬蟲檔案框架爬蟲
- 精通Scrapy網路爬蟲【一】第一個爬蟲專案爬蟲