如何优雅地使用c语言编写爬虫
大家在平时或多或少地都会有编写网络爬虫的需求。一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择。选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库和字符串处理库,还在于基于上述语言的爬虫框架非常之多和完善。良好的爬虫框架可以确保爬虫程序的稳定性,以及编写程序的便捷性。所以,这个cspider爬虫库的使命在于,我们能够使用c语言,依然能够优雅地编写爬虫程序。
1、爬虫的特性
配置方便。使用一句设置函数,即可定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。
程序逻辑独立。用户可以分别定义爬虫的解析函数,和数据持久化函数。并且对于解析到的新url,用户可以使用cspider提供的addUrl函数,将其加入到任务队列中。
便捷的字符串处理。cspider中提供了基于pcre的简单的正则表达式函数,基于libxml2的xpath解析函数,以及用于解析json的cJSON库。
高效的抓取。cspider基于libuv调度抓取线程和解析线程,使用curl作为其网络请求库。
2、使用cspider的步骤
- 获取cspider_t。
- 自定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。
- 添加初始要抓取的url到任务队列。
- 编写解析函数和数据持久化函数。
- 启动爬虫。
3、例子
先来看下简单的爬虫例子,会在后面详细讲解例子。
#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; 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, 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)即可启动爬虫。
赶快使用cspider爬虫框架来编写爬虫吧!
上一篇:C++实现自底向上的归并排序算法
栏 目:C语言
下一篇:MySQL的内存表的基础学习教程
本文标题:如何优雅地使用c语言编写爬虫
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/2607.html
您可能感兴趣的文章
- 01-10深入理解约瑟夫环的数学优化方法
- 01-10如何判断一个数是否为2的幂次方?若是,并判断出来是多少次方
- 01-10如何判断一个数是否为4的幂次方?若是,并判断出来是多少次方
- 01-10如何查看进程实际的内存占用情况详解
- 01-10如何寻找数组中的第二大数
- 01-10解析如何在C语言中调用shell命令的实现方法
- 01-10如何用C语言去除字符串两边的空字符
- 01-10如何判断一个整数的二进制中有多少个1
- 01-10如何用C语言生成简单格式的xml
- 01-10如何求连续几个数之和的最大值
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 01-11ajax实现页面的局部加载
- 04-02jquery与jsp,用jquery
- 01-10C#中split用法实例总结
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-10SublimeText编译C开发环境设置
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文