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

2015-12-13 18:05:03 +08:00
 luohaha
###项目的地址在 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. 启动爬虫。

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

```c
#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 ,欢迎反馈。
3406 次点击
所在节点    分享创造
7 条回复
jise
2015-12-14 15:06:08 +08:00
试了一下,感觉还不错,用起来很方便。。来赞一个。。。
luohaha
2015-12-14 15:31:10 +08:00
多谢支持啊
pepsin
2015-12-15 19:03:06 +08:00
看起来很不错呀
luohaha
2015-12-15 19:19:43 +08:00
@pepsin 多谢支持,如果在用的过程中,发现 bug 或其它问题,那就更好啦
pepsin
2015-12-15 19:57:03 +08:00
@luohaha 下回想抓点啥就拿你这个弄哈哈
luohaha
2015-12-15 20:31:02 +08:00
@pepsin 多谢多谢
hustlike
2016-01-25 12:38:05 +08:00
依赖太多了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243241

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX