c語言可以爬蟲,c語言爬蟲和python爬蟲

本文目錄一覽:

怎麼在DOS下用C語言寫網路爬蟲

獲取cspider_t。

自定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。

添加初始要抓取的url到任務隊列。

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

啟動爬蟲。

例子

先來看下簡單的爬蟲例子,會在後面詳細講解例子。

#includecspider/spider.h

/*

 自定義的解析函數,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; i size; i++) {

//將獲取到的電影名稱,持久化

 saveString(cspider, get[i]);

}

}

/*

 數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進行進一步的保存

*/

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”;

//設置要抓取頁面的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”);

//設置user agent

cs_setopt_useragent(spider, agent);

//cs_setopt_cookie(spider, cookie);

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

cs_setopt_process(spider, p, NULL);

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

cs_setopt_save(spider, s, stdout);

//設置線程數量

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);

}

如何優雅地使用c語言編寫爬蟲

前言

大家在平時或多或少地都會有編寫網路爬蟲的需求。一般來說,編寫爬蟲的首選自然非python莫屬,除此之外,java等語言也是不錯的選擇。選擇上述語言的原因不僅僅在於它們均有非常不錯的網路請求庫和字元串處理庫,還在於基於上述語言的爬蟲框架非常之多和完善。良好的爬蟲框架可以確保爬蟲程序的穩定性,以及編寫程序的便捷性。所以,這個cspider爬蟲庫的使命在於,我們能夠使用c語言,依然能夠優雅地編寫爬蟲程序。

爬蟲的特性

配置方便。使用一句設置函數,即可定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。

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

便捷的字元串處理。cspider中提供了基於pcre的簡單的正則表達式函數,基於libxml2的xpath解析函數,以及用於解析json的cJSON庫。

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

使用cspider的步驟

獲取cspider_t。

自定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。

添加初始要抓取的url到任務隊列。

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

啟動爬蟲。

例子

先來看下簡單的爬蟲例子,會在後面詳細講解例子。

#includecspider/spider.h

/*

自定義的解析函數,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; i size; i++) {

//將獲取到的電影名稱,持久化

saveString(cspider, get[i]);

}

}

/*

數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進行進一步的保存

*/

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”;

//設置要抓取頁面的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”);

//設置user agent

cs_setopt_useragent(spider, agent);

//cs_setopt_cookie(spider, cookie);

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

cs_setopt_process(spider, p, NULL);

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

cs_setopt_save(spider, s, stdout);

//設置線程數量

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這類函數可以用來進行初始化設置。其中要注意的是: cs_setopt_process(spider,p,NULL);與cs_setopt_save(spider,s,stdout);,它們分別設置了解析函數p和數據持久化函數s,這兩個函數需要用戶自己實現,還有用戶自定義的指向上下文信息user_data的指針。

在解析函數中,用戶要定義解析的規則,並對解析得到的字元串可以調用saveString進行持久化,或者是調用addUrl將url加入到任務隊列中。在saveString中傳入的字元串會在用戶自定義的數據持久函數中得到處理。此時,用戶可以選擇輸出到文件或資料庫等。

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

具體的API參數可在這裡查看

總結

趕快使用cspider爬蟲框架來編寫爬蟲吧!如果在使用過程中發現bug,歡迎反饋。

望採納,謝謝

為什麼c語言不適合寫爬蟲

有更加成熟的一種爬蟲腳本語言,而非框架。是通用的爬蟲軟體ForeSpider,內部自帶了一套爬蟲腳本語言。

從一個專業C++程序猿的角度說,網上流傳的各種Java爬蟲,Python爬蟲,Java需要運行於C++開發的虛擬機上,Python只是腳本語言,採集效率和性能如何能與強大的C++相提並論?C++直接控制系統的底層,對內存空間的控制和節省都是其他語言無法競爭的。首先,forespider的開發語言是C++,而且C++幾乎沒有現成的框架可以用,而火車採集器是用的C#。先從業界水平和良心來說,這個軟體可以做到從底層到上層都是他們的技術人員自己寫的,而非運用現成的框架結構。

其次,因為抓取金融行業的數據,數據量大,動態性強,而採集對象一般反爬蟲策略又很嚴格。所以,專門建立團隊開發不現實。請外包人員開發太貴。買現成的軟體,要考慮性價比。因為很多數據需要登錄,需要驗證碼,是JS生成的數據,是ajax,是https協議,有加密的key,有層層的驗證機制等等,分析市面上所有找得到的爬蟲軟體,沒有找到其他一家可以完全把我們列表上的網站採集下來的軟體。forespider功能強大,這是很重要的一點。

第三,forespider在台式機上運行一天可以采400萬條數據,在伺服器上一天可以采8000萬條數據。這樣一來,數據更新速度明顯比以前快了幾十倍。從前抓一個7500萬的網站需要好幾個月,等抓完數據早都變化的不成樣子了,這是很多爬蟲的痛處。但是現在的更新速度只有兩三天。forespider的性能強大,這也是非常好的一點。

第四,其實完全可視化的採集也不需要計算機專業的。大致學習了之後就可以上手采。而且forespider關於數據的管理做的很好。一是軟體可以集成資料庫,在採集之前就可以建表。二是數據可以自動排重,對於金融這樣數據更新要求很高的行業,就特別合適。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/240985.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:24
下一篇 2024-12-12 12:24

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論