分享一个自己做的 c 语言爬虫框架 cspider - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
luohaha
V2EX    分享创造

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

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

    项目的地址在 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     Solana     5195 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 07:21 PVG 15:21 LAX 00:21 JFK 03:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86