Linux企业级项目实践之网络爬虫(4)——主程序流程

news/2024/7/9 17:56:59 标签: 爬虫, 操作系统, epoll

当我们设计好程序框架之后就要开始实现它了。第一步当然是要实现主程序的流程框架。之后我们逐渐填充每个流程的细节和其需要调用的模块。

 

主程序的流程如下:

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;
}


转载于:https://www.cnblogs.com/new0801/p/6177008.html


http://www.niftyadmin.cn/n/824716.html

相关文章

yolov3使用问题总结

需要修改的地方 https://blog.csdn.net/weixin_36474809/article/category/7726484/5? 1.yolov3-voc.cfg文件 filter、class的值&#xff0c;训练或者测试需要修改注释 2.修改voc-label.py 生成训练集的路径文件 3.修改voc.data中的路径文件路径以及.names文件 yolo性能…

java基础类型包装类与自动打包解包

一基础类型包装类 基础数据类型存放在内存的栈区域&#xff0c;可以通过包装类将基础数据类型转换为引用数据类型&#xff0c;即存储在堆与栈中。 基础数据类型一共有8种&#xff0c;相对应的包装类也有8种。分别是Byte&#xff0c;Short&#xff0c;Integer&#xff0c;Long&a…

Linux企业级项目实践之网络爬虫(20)——扩展成为规则插件模式

为了方便我们爬虫功能的扩展&#xff0c;最好使用插件机制。使用插件技术能够在分析、设计、开发、项目计划、协作生产和产品扩展等很多方面带来好处&#xff1a;(1&#xff09;结构清晰、易于理解。由于借鉴了硬件总线的结构&#xff0c;而且各个插件之间是相互独立的&#xf…

Win10 下的Linux子系统

一、打开控制面板中的程序下的启动或关闭Windows功能 二、在应用商店中搜索WSL安装Ubuntu 三、移动Win10中linux子系统的位置 下载lxrunoffline并添加环境变量&#xff1a;https://github.com/DDoSolitary/LxRunOffline/releases 查看已安装的子系统版本 lxrunoffline list …

机器学习总纲

计算机视觉笔记及资料整理&#xff08;含图像分割、目标检测小方向学习&#xff09; 神经网络综述及发展历史 神经网络发展史

Unity3D研究院之脚本生成Android Google Project

一般安卓自动化打包直接会生成个APK出来&#xff0c;但是我不想生成APK&#xff0c;我想生成Eclipse项目。 然后在自动化完成后面的打包工作。 1234567891011using UnityEngine;using System.Collections;using UnityEditor;public class NewBehaviourScript : Editor {[MenuIt…

CUDA+CUDNN驱动及软件安装(Ubuntu)

参考链接&#xff1a; Ubuntu16.04下安装cuda和cudnn的三种方法&#xff08;亲测全部有效&#xff09; Ubuntu16.04LTS安装Nvidia显卡驱动cuda8.0cudnn 一、安装CUDA 1.下载cuda 2.禁用ubuntu自带的nouveau 终端中运行&#xff1a;$ lsmod | grep nouveau&#xff0c;如…

元素到页面的绝对距离

function getPos(obj){var iTop 0;while(obj){iTop obj.offsetTop;obj obj.offsetParent;}return iTop; } css 制作三角形 span{border-top:10px dashed transparent;border-left:10px dashed transparent;border-right:10px dashed transparent;border-bottom:10px solid r…