zoukankan      html  css  js  c++  java
  • Linux企业级项目实践之网络爬虫(20)——扩展成为规则插件模式



    为了方便我们爬虫功能的扩展,最好使用插件机制。
    使用插件技术能够在分析、设计、开发、项目计划、协作生产和产品扩展等很多方面带来好处:
    (1)结构清晰、易于理解。由于借鉴了硬件总线的结构,而且各个插件之间是相互独立的,所以结构非常清晰也更容易理解。
    (2)易修改、可维护性强。由于插件与宿主程序之间通过接口联系,就像硬件插卡一样,可以被随时删除,插入和修改,所以结构很灵活,容易修改,方便软件的升级和维护。
    (3)可移植性强、重用力度大。因为插件本身就是由一系列小的功能结构组成,而且通过接口向外部提供自己的服务,所以复用力度更大,移植也更加方便。
    (4)结构容易调整。系统功能的增加或减少,只需相应的增删插件,而不影响整个体系结构,因此能方便的实现结构调整。:
    (5)插件之间的耦合度较低。由于插件通过与宿主程序通信来实现插件与插件,插件与宿主程序间的通信,所以插件之间的耦合度更低。
    (6)可以在软件开发的过程中修改应用程序。由于采用了插件的结构,可以在软件的开发过程中随时修改插件,也可以在应用程序发行之后,通过补丁包的形式增删插件,通过这种形式达到修改应用程序的目的。
    (7)灵活多变的软件开发方式。可以根据资源的实际情况来调整开发的方式,资源充足可以开发所有的插件,资源不充足可以选择开发部分插件,也可以请第三方的厂商开发,用户也可以根据自己的需要进行开发。


    vector<Module *> modules_pre_surl;
    vector<Module *> modules_post_header;
    vector<Module *> modules_post_html;
    
    Module * dso_load(const char *path, const char *name)
    {
        void *rv = NULL;
        void *handle = NULL;
        Module *module = NULL;
    
        char * npath = strcat2(3, path, name, ".so");
    
        if ((handle = dlopen(npath, RTLD_GLOBAL | RTLD_NOW)) == NULL) {	
            SPIDER_LOG(SPIDER_LEVEL_ERROR, "Load module fail(dlopen): %s", dlerror());
        }
        if ((rv = dlsym(handle, name)) == NULL) {
            SPIDER_LOG(SPIDER_LEVEL_ERROR, "Load module fail(dlsym): %s", dlerror());
        }
        module = (Module *)rv;
        module->init(module);
    
        return module;
    }
    


    #include "dso.h"
    #include "socket.h"
    #include <fcntl.h>
     
    static int handler(void * data) {
        Response *r = (Response *)data;
        
        if (strstr(r->header->content_type, "text/html") == NULL)
            return MODULE_ERR;
    
        char *fn = url2fn(r->url);
        int fd = -1;
        if ((fd = open(fn, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
            return MODULE_ERR;
        }
    
        int left = r->body_len;
        int n = -1;
        while (left) {
            if ((n = write(fd, r->body, left)) < 0) {
                // error
                close(fd);
                unlink(fn);
                free(fn);
                return MODULE_ERR;
            } else {
                left -= n;
            }
        }
        close(fd);
        free(fn);
        return MODULE_OK;
    }
    
    static void init(Module *mod)
    {
        SPIDER_ADD_MODULE_POST_HTML(mod);
    }
    
    Module savehtml = {
        STANDARD_MODULE_STUFF,
        init,
        handler
    };
    



  • 相关阅读:
    解决SVN创建补丁乱码问题
    一款监控网络状态的好工具 Smokeping
    微软“2052”文件夹什么意思
    SVN目录大小写漏洞
    探索Emberjs——了解Emberjs
    第一次尝试三层架构<实现简单的增、删、查、改>
    站内搜索1之开篇介绍
    原生的几个javascript常用特效
    如果你喜欢上了一个程序员小伙>献给所有的程序员女友
    站内搜索3之Lucene.Net使用
  • 原文地址:https://www.cnblogs.com/new0801/p/6176991.html
Copyright © 2011-2022 走看看