Linux企業級專案實踐之網路爬蟲(4)——主程式流程
當我們設計好程式框架之後就要開始實現它了。第一步當然是要實現主程式的流程框架。之後我們逐漸填充每個流程的細節和其需要呼叫的模組。
主程式的流程如下:
1、 解析命令列引數,並根據引數跳轉到相應的處理分支
2、 解析配置檔案
3、 載入處理模組
4、 載入種子URL
5、 啟動抓取任務
主程式的程式碼如下:
int main(int argc, void *argv[])
{
struct epoll_event events[10];
int daemonized = 0;
char ch;
while ((ch = getopt(argc, (char* const*)argv, "vhd")) != -1) {
switch(ch) {
case 'v':
version();
break;
case 'd':
daemonized = 1;
break;
case 'h':
case '?':
default:
usage();
}
}
g_conf = initconfig();
loadconfig(g_conf);
set_nofile(1024);
vector<char *>::iterator it = g_conf->modules.begin();
for(; it != g_conf->modules.end(); it++) {
dso_load(g_conf->module_path, *it);
}
if (g_conf->seeds == NULL) {
SPIDER_LOG(SPIDER_LEVEL_ERROR, "Wehave no seeds, Buddy!");
} else {
int c = 0;
char ** splits =strsplit(g_conf->seeds, ',', &c, 0);
while (c--) {
Surl * surl = (Surl*)malloc(sizeof(Surl));
surl->url =url_normalized(strdup(splits[c]));
surl->level = 0;
surl->type = TYPE_HTML;
if (surl->url != NULL)
push_surlqueue(surl);
}
}
if (daemonized)
daemonize();
chdir("download");
int err = -1;
if ((err = create_thread(urlparser, NULL, NULL, NULL)) < 0) {
SPIDER_LOG(SPIDER_LEVEL_ERROR,"Create urlparser thread fail: %s", strerror(err));
}
int try_num = 1;
while(try_num < 8 && is_ourlqueue_empty())
usleep((10000 << try_num++));
if (try_num >= 8) {
SPIDER_LOG(SPIDER_LEVEL_ERROR, "NOourl! DNS parse error?");
}
if (g_conf->stat_interval > 0) {
signal(SIGALRM, stat);
set_ticker(g_conf->stat_interval);
}
int ourl_num = 0;
g_epfd = epoll_create(g_conf->max_job_num);
while(ourl_num++ < g_conf->max_job_num) {
if (attach_epoll_task() < 0)
break;
}
int n, i;
while(1) {
n = epoll_wait(g_epfd, events, 10,2000);
printf("epoll:%d\n",n);
if (n == -1)
printf("epollerrno:%s\n",strerror(errno));
fflush(stdout);
if (n <= 0) {
if (g_cur_thread_num <= 0&& is_ourlqueue_empty() && is_surlqueue_empty()) {
sleep(1);
if (g_cur_thread_num <= 0&& is_ourlqueue_empty() && is_surlqueue_empty())
break;
}
}
for (i = 0; i < n; i++) {
evso_arg * arg = (evso_arg*)(events[i].data.ptr);
if ((events[i].events &EPOLLERR) ||
(events[i].events &EPOLLHUP) ||
(!(events[i].events &EPOLLIN))) {
SPIDER_LOG(SPIDER_LEVEL_WARN,"epoll fail, close socket %d",arg->fd);
close(arg->fd);
continue;
}
epoll_ctl(g_epfd, EPOLL_CTL_DEL,arg->fd, &events[i]); /* del event */
printf("helloepoll:event=%d\n",events[i].events);
fflush(stdout);
create_thread(recv_response, arg,NULL, NULL);
}
}
SPIDER_LOG(SPIDER_LEVEL_DEBUG, "Task done!");
close(g_epfd);
return 0;
}
相關文章
- Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(8)——認識URLLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(18)——佇列處理Linux爬蟲佇列
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(20)——擴充套件成為規則外掛模式Linux爬蟲套件模式
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- 網路爬蟲專案爬蟲
- 企業資料爬蟲專案爬蟲
- 網路爬蟲專案蒐集爬蟲
- 企業資料爬蟲專案(二)爬蟲
- Java網路爬蟲實操(4)Java爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 專案--python網路爬蟲Python爬蟲
- 網路爬蟲(python專案)爬蟲Python
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- Java 爬蟲專案實戰之爬蟲簡介Java爬蟲
- 網路爬蟲流程總結爬蟲