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
};
相關文章
- Linux企業級專案實踐之網路爬蟲(24)——定製規則擴充套件為垂直爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(21)——擴充套件為多工爬蟲Linux爬蟲套件
- Linux企業級專案實踐之網路爬蟲(28)——爬蟲socket處理Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(7)——DNS解析Linux爬蟲DNS
- Linux企業級專案實踐之網路爬蟲(19)——epoll介面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(6)——將程式設計成為守護程式Linux爬蟲程式設計
- Linux企業級專案實踐之網路爬蟲(4)——主程式流程Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(8)——認識URLLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(25)——管理原始碼之SVNLinux爬蟲原始碼
- Linux企業級專案實踐之網路爬蟲(5)——處理配置檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(17)——儲存頁面Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(18)——佇列處理Linux爬蟲佇列
- Linux企業級專案實踐之網路爬蟲(26)——執行緒池Linux爬蟲執行緒
- Linux企業級專案實踐之網路爬蟲(27)——多路IO複用Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(29)——遵守robots.txtLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(30)——通過查閱RFC文件擴充更加複雜的功能Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(13)——處理user-agentLinux爬蟲
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(11)——處理http請求頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(12)——處理HTTP應答頭Linux爬蟲HTTP
- Linux企業級專案實踐之網路爬蟲(14)——使用正規表示式抽取HTML正文和URLLinux爬蟲HTML
- Linux企業級專案實踐之網路爬蟲(9)——通過URL抓取網頁內容Linux爬蟲網頁
- Linux企業級專案實踐之網路爬蟲(22)——編寫爬蟲系統服務控制指令碼Linux爬蟲指令碼
- Linux企業級專案實踐之網路爬蟲(15)——區分文字檔案和二進位制檔案Linux爬蟲
- Linux企業級專案實踐之網路爬蟲(23)——系統測試:找出系統中的bugLinux爬蟲
- [外掛擴充套件]三級聯動外掛!!!!!!!!套件
- Linux企業級專案實踐之網路爬蟲(16)——使用base64傳輸二進位制資料Linux爬蟲
- 八個改變遊戲規則的chrome外掛擴充套件遊戲Chrome套件
- [Python] 網路爬蟲與資訊提取(1) 網路爬蟲之規則Python爬蟲
- 為擴充套件外掛實現 IDeliveryExtension 介面套件IDE
- jQuery擴充套件外掛jQuery套件
- jQuery外掛擴充套件jQuery套件
- [外掛擴充套件]更新IP外掛套件
- [外掛擴充套件]廣告外掛2.0套件
- [外掛擴充套件]附件Attachment外掛套件
- [外掛擴充套件]Ping外掛套件
- [外掛擴充套件]投票外掛1.0套件
- [外掛擴充套件]騰訊分析外掛套件