當前位置:成語大全網 - 書法字典 - 如何用C語言優雅地寫壹個爬蟲

如何用C語言優雅地寫壹個爬蟲

每個人在平時或多或少都會有寫壹個網絡爬蟲的需求。壹般來說,python是寫爬蟲的首選。除此之外,java等語言也是不錯的選擇。之所以選擇上述語言,不僅僅是因為它們都有優秀的網絡請求庫和字符串處理庫,還因為基於上述語言的爬蟲框架很多,也很完善。壹個好的爬蟲框架可以保證爬蟲程序的穩定性和編程的方便性。所以這個cspider爬蟲庫的使命就是,我們可以使用C語言,仍然可以優雅地編寫爬蟲程序。

爬行動物的特征

配置方便。您可以通過使用設置函數來定義用戶代理、cookie、超時、代理以及獲取線程和解析線程的最大數量。

程序邏輯是獨立的。用戶可以分別定義爬蟲的解析功能和數據持久化功能。並且對於解析後的新url,用戶可以使用cspider提供的addUrl函數將其添加到任務隊列中。

方便的字符串處理。Cspider提供了基於pcre的簡單正則表達式函數,基於libxml2的xpath解析函數,以及解析json的Cjson庫。

高效抓取。Cspider基於libuv調度抓取線程和解析線程,使用curl作為其網絡請求庫。

使用cspider

獲取cspider _ t。

自定義用戶代理、cookie、超時、代理以及抓取線程和解析線程的最大數量。

將最初要爬網的url添加到任務隊列中。

編寫解析函數和數據持久化函數。

啟動爬蟲。

例子

我們先來看壹個簡單的爬蟲例子,稍後我們會詳細解釋這個例子。

# include & ltcs pider/spider . h & gt;

/*

自定義解析函數,其中d是獲取的html頁面字符串。

*/

void p(cspider_t *cspider,char *d,void *user_data) {

char * get[100];

//xpath解析html

int size = xpath(d,"//body/div[@ class = ' wrap ']/div[@ class = ' sort-column area ']/div[@ class = ' column-BD cfix ']/ul[@ class = ' ST-list cfix ']/Li/strong/a ",get,100);

int I;

for(I = 0;我& lt尺寸;i++) {

//持久化獲取的電影名稱。

saveString(cspider,get[I]);

}

}

/*

數據持久性函數進壹步保存由上述解析函數中調用的saveString()函數傳入的數據。

*/

void s(void *str,void *user_data) {

char * get =(char *)str;

FILE * FILE =(FILE *)user _ data;

fprintf(文件," %s\n ",get);

返回;

}

int main() {

//初始化蜘蛛

cs pider _ t * spider = init _ cs pider();

char * agent = " Mozilla/5.0(Macintosh;英特爾Mac OS X 10.10;rv:42.0)壁虎/20100101火狐/42.0”;

//char * cookie = " bid = S3/yuh 5 JD/I;ll = 108288;已查看= 1130500 _ 24708145 _ 6433169 _ 4843567 _ 1767120 _ 5318823 _ 1899158 _ 12765438_ _ utma = 30149280.927537245.1446813674.1446983217.1449139583.4;_ _ utmz = 30149280.1449139583 . 4 . 4 . UTM CSR = accounts . douban . com | ut mccn =(referral)| ut mcmd = referral | ut mcct =/log in;PS = y;ue=965166527@qq.com;DBC L2 = 58742090:qgz 2 pslidq;ck = T9Wnpush _ noty _ num = 0;push _ doumail _ num = 7;AP = 1;_ _ utmb = 30149280 . 0 . 10.1449139583;_ _ utmc = 30149280 ";

//設置要抓取的頁面的url。

cs_setopt_url(spider," so . TV . Sohu . com/list _ p 100 _ P20 _ P3 _ u 5185 _ u 5730 _ p40 _ P5 _ P6 _ p77 _ p80 _ p9 _ 2d 1 _ p 101 _ p 1 . html);

//設置用戶代理

cs_setopt_useragent(蜘蛛,代理);

//cs_setopt_cookie(蜘蛛,cookie);

//傳入指向解析函數和數據持久化函數的指針。

cs_setopt_process(spider,p,NULL);

//s函數的user_data指針指向stdout。

cs_setopt_save(spider,s,stdout);

//設置線程數

cs_setopt_threadnum(蜘蛛,下載,2);

cs_setopt_threadnum(spider,SAVE,2);

//FILE *fp = fopen("log "," w b+ ");

//cs_setopt_logfile(spider,FP);

//啟動爬蟲

返回cs_run(蜘蛛);

}

示例說明

cs pider _ t * spider = init _ cs pider();獲取初始cspider。cs_setopt_xxx等函數可用於初始化設置。需要註意的是:cs _ setopt _ process (spider,p,null);以及cs_setopt_save(spider,s,stdout);,他們分別設置了解析函數P和數據持久化函數S,需要用戶自己實現,還有自定義的指向上下文信息user_data的指針。

在解析函數中,用戶要定義解析規則,解析後的字符串可以通過調用saveString,或者調用addUrl將Url添加到任務隊列中來持久化。saveString中傳遞的字符串將在用戶定義的數據持久性函數中進行處理。此時,用戶可以選擇輸出到文件或數據庫。

最後調用cs_run(spider)啟動爬蟲。

具體的API參數可以在這裏查看。