欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何優(yōu)雅地使用c語言編寫爬蟲

 更新時(shí)間:2015年12月10日 16:56:42   投稿:lijiao  
如何優(yōu)雅地使用c語言編寫爬蟲,本文介紹cspider爬蟲庫,這個(gè)cspider爬蟲庫的使命在于,我們能夠使用c語言,依然能夠優(yōu)雅地編寫爬蟲程序,需要的朋友可以參考下

大家在平時(shí)或多或少地都會(huì)有編寫網(wǎng)絡(luò)爬蟲的需求。一般來說,編寫爬蟲的首選自然非python莫屬,除此之外,java等語言也是不錯(cuò)的選擇。選擇上述語言的原因不僅僅在于它們均有非常不錯(cuò)的網(wǎng)絡(luò)請(qǐng)求庫和字符串處理庫,還在于基于上述語言的爬蟲框架非常之多和完善。良好的爬蟲框架可以確保爬蟲程序的穩(wěn)定性,以及編寫程序的便捷性。所以,這個(gè)cspider爬蟲庫的使命在于,我們能夠使用c語言,依然能夠優(yōu)雅地編寫爬蟲程序。

1、爬蟲的特性

配置方便。使用一句設(shè)置函數(shù),即可定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數(shù)量。
程序邏輯獨(dú)立。用戶可以分別定義爬蟲的解析函數(shù),和數(shù)據(jù)持久化函數(shù)。并且對(duì)于解析到的新url,用戶可以使用cspider提供的addUrl函數(shù),將其加入到任務(wù)隊(duì)列中。
便捷的字符串處理。cspider中提供了基于pcre的簡單的正則表達(dá)式函數(shù),基于libxml2的xpath解析函數(shù),以及用于解析json的cJSON庫。
高效的抓取。cspider基于libuv調(diào)度抓取線程和解析線程,使用curl作為其網(wǎng)絡(luò)請(qǐng)求庫。
2、使用cspider的步驟

  • 獲取cspider_t。
  • 自定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數(shù)量。
  • 添加初始要抓取的url到任務(wù)隊(duì)列。
  • 編寫解析函數(shù)和數(shù)據(jù)持久化函數(shù)。
  • 啟動(dòng)爬蟲。

3、例子

先來看下簡單的爬蟲例子,會(huì)在后面詳細(xì)講解例子。

#include<cspider/spider.h>

/*
  自定義的解析函數(shù),d為獲取到的html頁面字符串
*/
void p(cspider_t *cspider, char *d, void *user_data) {

 char *get[100];
 //xpath解析html
 int size = xpath(d, "http://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; i < size; i++) {
 //將獲取到的電影名稱,持久化
  saveString(cspider, get[i]);
 }

}
/*
  數(shù)據(jù)持久化函數(shù),對(duì)上面解析函數(shù)中調(diào)用的saveString()函數(shù)傳入的數(shù)據(jù),進(jìn)行進(jìn)一步的保存
*/
void s(void *str, void *user_data) {
 char *get = (char *)str;
 FILE *file = (FILE*)user_data;
 fprintf(file, "%s\n", get);
 return;
}

int main() {
 //初始化spider
 cspider_t *spider = init_cspider();
 char *agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0";
 //char *cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qq.com; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280";

 //設(shè)置要抓取頁面的url
 cs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");
 //設(shè)置user agent
 cs_setopt_useragent(spider, agent);
 //cs_setopt_cookie(spider, cookie);
 //傳入解析函數(shù)和數(shù)據(jù)持久化函數(shù)的指針
 cs_setopt_process(spider, p, NULL);
 //s函數(shù)的user_data指針指向stdout
 cs_setopt_save(spider, s, stdout);
 //設(shè)置線程數(shù)量
 cs_setopt_threadnum(spider, DOWNLOAD, 2);
 cs_setopt_threadnum(spider, SAVE, 2);
 //FILE *fp = fopen("log", "wb+");
 //cs_setopt_logfile(spider, fp);
 //開始爬蟲
 return cs_run(spider);
}

例子講解

cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類函數(shù)可以用來進(jìn)行初始化設(shè)置。其中要注意的是: cs_setopt_process(spider,p,NULL);cs_setopt_save(spider,s,stdout);,它們分別設(shè)置了解析函數(shù)p和數(shù)據(jù)持久化函數(shù)s,這兩個(gè)函數(shù)需要用戶自己實(shí)現(xiàn),還有用戶自定義的指向上下文信息user_data的指針。在解析函數(shù)中,用戶要定義解析的規(guī)則,并對(duì)解析得到的字符串可以調(diào)用saveString進(jìn)行持久化,或者是調(diào)用addUrl將url加入到任務(wù)隊(duì)列中。在saveString中傳入的字符串會(huì)在用戶自定義的數(shù)據(jù)持久函數(shù)中得到處理。此時(shí),用戶可以選擇輸出到文件或數(shù)據(jù)庫等。
最后調(diào)用cs_run(spider)即可啟動(dòng)爬蟲。

趕快使用cspider爬蟲框架來編寫爬蟲吧!

相關(guān)文章

  • C語言內(nèi)嵌匯編API內(nèi)存搜索引擎實(shí)例

    C語言內(nèi)嵌匯編API內(nèi)存搜索引擎實(shí)例

    這篇文章主要介紹了C語言內(nèi)嵌匯編API內(nèi)存搜索引擎實(shí)例,涉及匯編語言與內(nèi)存相關(guān)操作,需要的朋友可以參考下
    2014-10-10
  • C++11的for循環(huán)的新用法(推薦)

    C++11的for循環(huán)的新用法(推薦)

    C++11這次的更新帶來了令很多C++程序員期待已久的for range循環(huán),每次看到j(luò)avascript, lua里的for range,心想要是C++能有多好,心里別提多酸了。這次C++11不負(fù)眾望,再也不用羨慕別家人的for range了。下面看下C++11的for循環(huán)的新用法
    2021-11-11
  • C++使用循環(huán)計(jì)算標(biāo)準(zhǔn)差的代碼實(shí)現(xiàn)

    C++使用循環(huán)計(jì)算標(biāo)準(zhǔn)差的代碼實(shí)現(xiàn)

    在C++中,計(jì)算標(biāo)準(zhǔn)差可以使用循環(huán)來實(shí)現(xiàn),本文給大家介紹了一個(gè)示例代碼,演示了如何使用循環(huán)計(jì)算標(biāo)準(zhǔn)差,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • C++自定義函數(shù)判斷某年某月某日是這一年中第幾天

    C++自定義函數(shù)判斷某年某月某日是這一年中第幾天

    這篇文章主要介紹了C++自定義函數(shù)判斷某年某月某日是這一年中第幾天的方法,涉及C++日期與時(shí)間操作相關(guān)技巧,需要的朋友可以參考下
    2016-06-06
  • C++ 中繼承與動(dòng)態(tài)內(nèi)存分配的詳解

    C++ 中繼承與動(dòng)態(tài)內(nèi)存分配的詳解

    這篇文章主要介紹了C++ 中繼承與動(dòng)態(tài)內(nèi)存分配的詳解的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • C++實(shí)現(xiàn)讀寫文件的示例代碼

    C++實(shí)現(xiàn)讀寫文件的示例代碼

    這篇文章主要介紹了C++實(shí)現(xiàn)讀寫文件的示例代碼,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(二)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之排序總結(jié)(二)

    這篇文章住要介紹的是選擇類排序中的簡單、樹形和堆排序,歸并排序、分配類排序的基數(shù)排序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2021-12-12
  • C語言 詳細(xì)講解邏輯運(yùn)算符的使用

    C語言 詳細(xì)講解邏輯運(yùn)算符的使用

    在C語言中,邏輯運(yùn)算符有&&、||、!;&&表示“與”的意思,需要兩端的表達(dá)式的值都為true,該式的值才為true。||表示“或”的意思,兩端的表達(dá)式的值只要有一端為true,該式的值就為true。!表示“非”的意思,將該式的真值換成相反的真值,即false和true互換
    2022-04-04
  • 利用Matlab制作三子棋游戲的示例代碼

    利用Matlab制作三子棋游戲的示例代碼

    三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對(duì)角線連起來,相對(duì)兩邊依次擺上三個(gè)雙方棋子,只要將自己的三個(gè)棋子走成一條線,對(duì)方就算輸了。本文將用Matlab制作這一經(jīng)典游戲,感興趣的可以試一試
    2022-03-03
  • C++中的const的使用詳解

    C++中的const的使用詳解

    這篇文章主要介紹了 C++中的const的使用詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評(píng)論