V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
luohaha
V2EX  ›  分享创造

分享一个自己做的 c 语言爬虫框架 cspider

  •  2
     
  •   luohaha · 2015-12-13 18:05:03 +08:00 · 3364 次点击
    这是一个创建于 3268 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目的地址在 https://github.com/luohaha/CSpider ,欢迎大伙来尝试。

    大家在平时或多或少地都会有编写网络爬虫的需求。一般来说,编写爬虫的首选自然非 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 作为其网络请求库。

    使用 cspider 的步骤

    1. 获取 cspider_t 。
    2. 自定义 user agent , cookie , timeout , proxy 以及抓取线程和解析线程的最大数量。
    3. 添加初始要抓取的 url 到任务队列。
    4. 编写解析函数和数据持久化函数。
    5. 启动爬虫。

    例子(抓取优酷电影第一页的所有电影名称)

    #include<cspider/spider.h>
    
    void p(cspider_t *cspider, char *d, void *user_data) {
    
      char *get[100];
      int size = xpath(d, "//div[@id='listofficial']/div[@class='yk-row yk-v-80']/div[@class='yk-col3']/div[@class='p p-small']/div[@class='p-meta pa']/div[@class='p-meta-title']/a/@title", get, 100);
    
      int i;
      for (i = 0; i < size; i++) {
        saveString(cspider, get[i]);
      }
    
    }
    
    void s(void *str, void *user_data) {
      char *get = (char *)str;
      FILE *file = (FILE*)user_data;
      fprintf(file, "%s\n", get);
      return;
    }
    
    int main() {
      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";
    
      cs_setopt_url(spider, "http://www.youku.com/v_olist/c_96_s_0_d_0_g_0_a_0_r_0_u_0_pt_0_av_0_ag_0_sg_0_mt_0_lg_0_q_0_pr_0_h_0_p_1.html");
    
      cs_setopt_useragent(spider, agent);
      //指向自定义的解析函数,和数据持久化函数
      cs_setopt_process(spider, p, NULL);
      cs_setopt_save(spider, s, stdout);
      //设置抓取线程数量,和数据持久化的线程数量
      cs_setopt_threadnum(spider, DOWNLOAD, 2);
      cs_setopt_threadnum(spider, SAVE, 2);
    
      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 ,这两个函数需要用户自己实现。在解析函数中,用户要定义解析的规则,并对解析得到的字符串可以调用 saveString 进行持久化,或者是调用 addUrl 将 url 加入到任务队列中。在 saveString 中传入的字符串会在用户自定义的数据持久函数中得到处理。此时,用户可以选择输出到文件或数据库等。
    最后调用 cs_run(spider)即可启动爬虫。
    具体的 API 参数可在 https://github.com/luohaha/CSpider 查看

    总结

    赶快使用 cspider 爬虫框架来编写爬虫吧!如果在使用过程中发现 bug ,欢迎反馈。

    7 条回复    2016-01-25 12:38:05 +08:00
    jise
        1
    jise  
       2015-12-14 15:06:08 +08:00   ❤️ 1
    试了一下,感觉还不错,用起来很方便。。来赞一个。。。
    luohaha
        2
    luohaha  
    OP
       2015-12-14 15:31:10 +08:00
    多谢支持啊
    pepsin
        3
    pepsin  
       2015-12-15 19:03:06 +08:00
    看起来很不错呀
    luohaha
        4
    luohaha  
    OP
       2015-12-15 19:19:43 +08:00
    @pepsin 多谢支持,如果在用的过程中,发现 bug 或其它问题,那就更好啦
    pepsin
        5
    pepsin  
       2015-12-15 19:57:03 +08:00
    @luohaha 下回想抓点啥就拿你这个弄哈哈
    luohaha
        6
    luohaha  
    OP
       2015-12-15 20:31:02 +08:00
    @pepsin 多谢多谢
    hustlike
        7
    hustlike  
       2016-01-25 12:38:05 +08:00
    依赖太多了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1063 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:13 · PVG 03:13 · LAX 11:13 · JFK 14:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.