如何優(yōu)雅地使用c語(yǔ)言編寫爬蟲
大家在平時(shí)或多或少地都會(huì)有編寫網(wǎng)絡(luò)爬蟲的需求。一般來(lái)說(shuō),編寫爬蟲的首選自然非python莫屬,除此之外,java等語(yǔ)言也是不錯(cuò)的選擇。選擇上述語(yǔ)言的原因不僅僅在于它們均有非常不錯(cuò)的網(wǎng)絡(luò)請(qǐng)求庫(kù)和字符串處理庫(kù),還在于基于上述語(yǔ)言的爬蟲框架非常之多和完善。良好的爬蟲框架可以確保爬蟲程序的穩(wěn)定性,以及編寫程序的便捷性。所以,這個(gè)cspider爬蟲庫(kù)的使命在于,我們能夠使用c語(yǔ)言,依然能夠優(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的簡(jiǎn)單的正則表達(dá)式函數(shù),基于libxml2的xpath解析函數(shù),以及用于解析json的cJSON庫(kù)。
高效的抓取。cspider基于libuv調(diào)度抓取線程和解析線程,使用curl作為其網(wǎng)絡(luò)請(qǐng)求庫(kù)。
2、使用cspider的步驟
- 獲取cspider_t。
- 自定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數(shù)量。
- 添加初始要抓取的url到任務(wù)隊(duì)列。
- 編寫解析函數(shù)和數(shù)據(jù)持久化函數(shù)。
- 啟動(dòng)爬蟲。
3、例子
先來(lái)看下簡(jiǎn)單的爬蟲例子,會(huì)在后面詳細(xì)講解例子。
#include<cspider/spider.h>
/*
自定義的解析函數(shù),d為獲取到的html頁(yè)面字符串
*/
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è)置要抓取頁(yè)面的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);
//開(kāi)始爬蟲
return cs_run(spider);
}
例子講解
cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類函數(shù)可以用來(lái)進(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ù)庫(kù)等。
最后調(diào)用cs_run(spider)即可啟動(dòng)爬蟲。
趕快使用cspider爬蟲框架來(lái)編寫爬蟲吧!
- 教你如何編寫簡(jiǎn)單的網(wǎng)絡(luò)爬蟲
- Python爬蟲框架Scrapy安裝使用步驟
- 使用Python編寫簡(jiǎn)單網(wǎng)絡(luò)爬蟲抓取視頻下載資源
- 零基礎(chǔ)寫python爬蟲之使用urllib2組件抓取網(wǎng)頁(yè)內(nèi)容
- 零基礎(chǔ)寫python爬蟲之神器正則表達(dá)式
- 零基礎(chǔ)寫python爬蟲之爬蟲編寫全記錄
- 零基礎(chǔ)寫python爬蟲之使用Scrapy框架編寫爬蟲
- 零基礎(chǔ)寫Java知乎爬蟲之進(jìn)階篇
- NodeJS制作爬蟲全過(guò)程
- Python實(shí)現(xiàn)抓取頁(yè)面上鏈接的簡(jiǎn)單爬蟲分享
相關(guān)文章
c++中string類成員函數(shù)c_str()的用法
c_str()函數(shù)返回一個(gè)指向正規(guī)c字符串的指針,內(nèi)容和string類的本身對(duì)象是一樣的,通過(guò)string類的c_str()函數(shù)能夠把string對(duì)象轉(zhuǎn)換成c中的字符串的樣式2013-09-09
C++連接mysql數(shù)據(jù)庫(kù)的兩種方法小結(jié)
這篇文章主要介紹了C++連接mysql數(shù)據(jù)庫(kù)的兩種方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序的優(yōu)化算法
堆排序Heap?Sort就是利用堆進(jìn)行排序的方法,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之堆排序的優(yōu)化算法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
用c語(yǔ)言根據(jù)可變參數(shù)合成字符串的實(shí)現(xiàn)代碼
本篇文章是對(duì)用c語(yǔ)言根據(jù)可變參數(shù)合成字符串的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Visual C++程序設(shè)計(jì)中Windows GDI貼圖閃爍的解決方法
這篇文章主要介紹了Visual C++程序設(shè)計(jì)中Windows GDI貼圖閃爍的解決方法,分析了GDI貼圖閃爍的常見(jiàn)原因及其具體解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
c語(yǔ)言string.h頭文件中所有函數(shù)示例詳解
這篇文章詳細(xì)介紹了C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中的字符串和內(nèi)存操作函數(shù),以str開(kāi)頭的字符串處理函數(shù)和以mem開(kāi)頭的內(nèi)存處理函數(shù),每種函數(shù)都有詳細(xì)的原型、功能描述和示例代碼,需要的朋友可以參考下2024-11-11
C++實(shí)現(xiàn)LeetCode(114.將二叉樹展開(kāi)成鏈表)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(114.將二叉樹展開(kāi)成鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
C語(yǔ)言中函數(shù)棧幀的創(chuàng)建和銷毀的深層分析
在C語(yǔ)言中,每一個(gè)正在運(yùn)行的函數(shù)都有一個(gè)棧幀與其對(duì)應(yīng),棧幀中存儲(chǔ)的是該函數(shù)的返回地址和局部變量。從邏輯上講,棧幀就是一個(gè)函數(shù)執(zhí)行的環(huán)境:函數(shù)參數(shù)、函數(shù)的局部變量、函數(shù)執(zhí)行完后返回到哪里等等2022-04-04

