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

news/2024/7/19 11:33:35 标签: 爬虫



为了方便我们爬虫功能的扩展,最好使用插件机制。
使用插件技术能够在分析、设计、开发、项目计划、协作生产和产品扩展等很多方面带来好处:
(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
};



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


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

相关文章

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…

在线处理网站

1. 分帧软件 2.pdf转换分割网站 3.提高图片分辨率网站 https://waifu2x.booru.pics/

vue完整模版,可以加入ide做快捷代码片段

ide代码片段。比如&#xff0c;输入vue&#xff0c;可以输出下面vue模版 <template><div></div> </template> <script>//这里导入其他文件(组件&#xff0c;工具js模块,第三方js模块,json文件,图片,样式等)//import 组件名称 from 组件路径expo…

晨枫U盘启动盘制作工具V4.0-安装原版Win7

第一类方法&#xff08;32位64位系统通用&#xff09;&#xff1a; 【1】找到Windows7系统的iso镜像&#xff0c;用UltraISO或者WinRAR打开iso镜像&#xff0c;然后提取/解压所有文件到你的U盘根目录。 【2】在你的U盘里找到名为bootmgr的文件&#xff0c;将bootmgr重命名为win…