如何優(yōu)雅地使用c語(yǔ)言編寫(xiě)爬蟲(chóng)
大家在平時(shí)或多或少地都會(huì)有編寫(xiě)網(wǎng)絡(luò)爬蟲(chóng)的需求。一般來(lái)說(shuō),編寫(xiě)爬蟲(chóng)的首選自然非python莫屬,除此之外,java等語(yǔ)言也是不錯(cuò)的選擇。選擇上述語(yǔ)言的原因不僅僅在于它們均有非常不錯(cuò)的網(wǎng)絡(luò)請(qǐng)求庫(kù)和字符串處理庫(kù),還在于基于上述語(yǔ)言的爬蟲(chóng)框架非常之多和完善。良好的爬蟲(chóng)框架可以確保爬蟲(chóng)程序的穩(wěn)定性,以及編寫(xiě)程序的便捷性。所以,這個(gè)cspider爬蟲(chóng)庫(kù)的使命在于,我們能夠使用c語(yǔ)言,依然能夠優(yōu)雅地編寫(xiě)爬蟲(chóng)程序。
1、爬蟲(chóng)的特性
配置方便。使用一句設(shè)置函數(shù),即可定義user agent,cookie,timeout,proxy以及抓取線(xiàn)程和解析線(xiàn)程的最大數(shù)量。
程序邏輯獨(dú)立。用戶(hù)可以分別定義爬蟲(chóng)的解析函數(shù),和數(shù)據(jù)持久化函數(shù)。并且對(duì)于解析到的新url,用戶(hù)可以使用cspider提供的addUrl函數(shù),將其加入到任務(wù)隊(duì)列中。
便捷的字符串處理。cspider中提供了基于pcre的簡(jiǎn)單的正則表達(dá)式函數(shù),基于libxml2的xpath解析函數(shù),以及用于解析json的cJSON庫(kù)。
高效的抓取。cspider基于libuv調(diào)度抓取線(xiàn)程和解析線(xiàn)程,使用curl作為其網(wǎng)絡(luò)請(qǐng)求庫(kù)。
2、使用cspider的步驟
- 獲取cspider_t。
- 自定義user agent,cookie,timeout,proxy以及抓取線(xiàn)程和解析線(xiàn)程的最大數(shù)量。
- 添加初始要抓取的url到任務(wù)隊(duì)列。
- 編寫(xiě)解析函數(shù)和數(shù)據(jù)持久化函數(shù)。
- 啟動(dòng)爬蟲(chóng)。
3、例子
先來(lái)看下簡(jiǎn)單的爬蟲(chóng)例子,會(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++) { //將獲取到的電影名稱(chēng),持久化 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è)置線(xiàn)程數(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)始爬蟲(chóng) return cs_run(spider); }
例子講解
cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類(lèi)函數(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ù)需要用戶(hù)自己實(shí)現(xiàn),還有用戶(hù)自定義的指向上下文信息user_data的指針。在解析函數(shù)中,用戶(hù)要定義解析的規(guī)則,并對(duì)解析得到的字符串可以調(diào)用saveString進(jìn)行持久化,或者是調(diào)用addUrl將url加入到任務(wù)隊(duì)列中。在saveString中傳入的字符串會(huì)在用戶(hù)自定義的數(shù)據(jù)持久函數(shù)中得到處理。此時(shí),用戶(hù)可以選擇輸出到文件或數(shù)據(jù)庫(kù)等。
最后調(diào)用cs_run(spider)即可啟動(dòng)爬蟲(chóng)。
趕快使用cspider爬蟲(chóng)框架來(lái)編寫(xiě)爬蟲(chóng)吧!
上一篇:C++實(shí)現(xiàn)自底向上的歸并排序算法
欄 目:C語(yǔ)言
下一篇:MySQL的內(nèi)存表的基礎(chǔ)學(xué)習(xí)教程
本文標(biāo)題:如何優(yōu)雅地使用c語(yǔ)言編寫(xiě)爬蟲(chóng)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/2607.html
您可能感興趣的文章
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10如何判斷一個(gè)數(shù)是否為2的冪次方?若是,并判斷出來(lái)是多少次方
- 01-10如何判斷一個(gè)數(shù)是否為4的冪次方?若是,并判斷出來(lái)是多少次方
- 01-10如何查看進(jìn)程實(shí)際的內(nèi)存占用情況詳解
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10解析如何在C語(yǔ)言中調(diào)用shell命令的實(shí)現(xiàn)方法
- 01-10如何用C語(yǔ)言去除字符串兩邊的空字符
- 01-10如何判斷一個(gè)整數(shù)的二進(jìn)制中有多少個(gè)1
- 01-10如何用C語(yǔ)言生成簡(jiǎn)單格式的xml
- 01-10如何求連續(xù)幾個(gè)數(shù)之和的最大值


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫(xiě)分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫(xiě)函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒(méi)有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文