c語言寫爬蟲
㈠ 如何優雅地使用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到任務隊列。
編寫解析函數和數據持久化函數。
啟動爬蟲。
例子
先來看下簡單的爬蟲例子,會在後面詳細講解例子。
#include<cspider/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; [email protected]; 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編寫一個爬蟲程序,可是看完一本c語言教程後,還是覺得只會編寫一些計算類的小代碼,要學會編寫
想做爬蟲程序不是學完語言就行了,是要學很多東西的,你可以查一查大學計算機專業有哪些課程。
做爬蟲可以學學java語言。
《網路機器人Java編程指南》
開源的爬蟲產品
http://www.oschina.net/project/tag/64/spider?lang=19&os=0&sort=view&p=1
㈢ 為什麼c語言不適合寫爬蟲
開發效率低
㈣ c語言能幹什麼 C語言的這些用處你知道嗎
1、C語言可以做嵌入式開發。如51單片機、ARM等。
2、C語言可以寫漂亮的界面。以windows開發為例,你可以學習《windows程序設計(第五版)》,學完就可以寫出界面來。還有一些開源庫界面庫,例如soui也是用C寫出來的。
3、C語言可以做伺服器開發,現在的游戲伺服器端大多都是C/C++開發的。《windows核心編程》裡面的例子就是用C寫的。
4、C語言可以寫游戲。cocos2d—x就是C/C++寫的。DirectX也是。
5、C語言可以寫驅動程序。windows下各種硬體驅動都是C/C++寫的。騰訊游戲保護軟體(TP)也是驅動程序。
6、C語言可以寫外掛。想學寫外掛的童鞋們可以看看鬱金香的外掛編程視頻教程。
7、C語言可以做視頻圖片流媒體處理。有興趣的朋友可以學習一下ffmpeg、live555、sdl等開源庫。
8、C語言可以做網頁和爬蟲相關的編程。想了解的同學可以去看gsoap、libcur等相關開源庫。
9、C語言可以進行黑客編程。配合匯編獲取隨機地址、調shellcode等。
㈤ 除了python可以爬蟲還有哪些編程語言可以爬蟲
能夠做網路爬蟲的編程語言很多,包括PHP、Java、C/C++、Python等都能做爬蟲,都能達到抓取想要的數據資源。針對不同的環境,我們需要了解他們做爬蟲的優缺點,才能選出合適的開發環境。
(一)PHP
網路爬蟲需要快速的從伺服器中抓取需要的數據,有時數據量較大時需要進行多線程抓取。PHP雖然是世界上最好的語言,但是PHP對多線程、非同步支持不足,並發不足,而爬蟲程序對速度和效率要求極高,所以說PHP天生不是做爬蟲的。
(二)C/C++
C語言是一門面向過程、抽象化的通用程序設計語言,廣泛應用於底層開發,運行效率和性能是最強大的,但是它的學習成本非常高,需要有很好地編程知識基礎,對於初學者或者編程知識不是很好地程序員來說,不是一個很好的選擇。當然,能夠用C/C++編寫爬蟲程序,足以說明能力很強,但是絕不是最正確的選擇。
(三)Java
在網路爬蟲方面,作為Python最大的對手Java,擁有強大的生態圈。但是Java本身很笨重,代碼量大。由於爬蟲與反爬蟲的較量是持久的,也是頻繁的,剛寫好的爬蟲程序很可能就不能用了。爬蟲程序需要經常性的修改部分代碼。而Java的重構成本比較高,任何修改都會導致大量代碼的變動。
(四)Python
Python在設計上堅持了清晰劃一的風格,易讀、易維護,語法優美、代碼簡潔、開發效率高、第三方模塊多。並且擁有強大的爬蟲Scrapy,以及成熟高效的scrapy-redis分布式策略。實現同樣的爬蟲功能,代碼量少,而且維護方便,開發效率高。
㈥ C語言學到什麼程度學Python
指針之前?對程序的基本控制結構熟悉了python很容易上手。
python網上的電子書教程還是很多的,對著看一下基礎的,然後多找點實例練練。重點是了解python的各種庫各種模塊
㈦ 爬蟲里printf(res)有什麼作用和print(res.text)有什麼區別
很多計算機語言都可以寫爬蟲,這兩個都有列印輸出的意思,下面那個應該是xpath清洗後轉字元串,python爬蟲就是這樣,不明白你說的是那個語言寫的爬蟲。
㈧ 可以一邊學python爬蟲一邊學c語言嗎
不建議這個學習規劃。
建議先學習C語言,但不用學的很深。C語言是面向過程的,這思想適用於任何程序語言。
然後大致學習一下python的基礎語法,再了解一下面向對象的編程思想。
最後再來學習爬蟲,期間還需要了解html/js/css
當然這個屬於系統的學習,可以深度的掌握爬蟲技術。
如果你只是先爬一下簡單的數據,使用度不高,那就無所謂,一些爬蟲框架,其實就是配置一些簡單的參數,使用節點提取函數,如果自學能力強,確實是很簡單,可以直接學習。
㈨ 怎麼在DOS下用C語言寫網路爬蟲
獲取cspider_t。
自定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。
添加初始要抓取的url到任務隊列。
編寫解析函數和數據持久化函數。
啟動爬蟲。
- #include<cspider/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 ", 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; [email protected]; 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);
- }
例子
先來看下簡單的爬蟲例子,會在後面詳細講解例子。