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

jopen 9年前發布 | 33K 次閱讀 爬蟲 網絡爬蟲

前言

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

爬蟲的特性

  1. 配置方便。使用一句設置函數,即可定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。
  2. 程序邏輯獨立。用戶可以分別定義爬蟲的解析函數,和數據持久化函數。并且對于解析到的新url,用戶可以使用cspider提供的addUrl函數,將其加入到任務隊列中。
  3. 便捷的字符串處理。cspider中提供了基于pcre的簡單的正則表達式函數,基于libxml2的xpath解析函數,以及用于解析json的cJSON庫。
  4. 高效的抓取。cspider基于libuv調度抓取線程和解析線程,使用curl作為其網絡請求庫。
  5. </ol>

    使用cspider的步驟

    1. 獲取cspider_t。
    2. 自定義user agent,cookie,timeout,proxy以及抓取線程和解析線程的最大數量。
    3. 添加初始要抓取的url到任務隊列。
    4. 編寫解析函數和數據持久化函數。
    5. 啟動爬蟲。
    6. </ol>

      例子

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

      #include<cspider/spider.h>

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

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

      } / 數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進行進一步的保存/ void s(void str) { char get = (char *)str; printf("%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); cs_setopt_save(spider, s); //設置線程數量 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); }</pre>

      例子講解

      cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類函數可以用來進行初始化設置。其中要注意的是:cs_setopt_process(spider,p);與cs_setopt_save(spider,s);,它們分別設置了解析函數p和數據持久化函數s,這兩個函數需要用戶自己實現。在解析函數中,用戶要定義解析的規則,并對解析得到的字符串可以調用saveString進行持久化,或者是調用addUrl將url加入到任務隊列中。在saveString中傳入的字符串會在用戶自定義的數據持久函數中得到處理。此時,用戶可以選擇輸出到文件或數據庫等。
      最后調用cs_run(spider)即可啟動爬蟲。
      具體的API參數可在這里查看

      總結

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

      來自:https://github.com/luohaha/CSpider/wiki/如何優雅地使用c語言編寫爬蟲

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!