前言大家在平常的时候或多或少都会存在编制网络爬虫的需求一般说来编写爬虫的首要选择自然是python除了这个之外java等语言也是挺好的选择选择上述语言的缘由不只是鉴于它们都拥有很不错的网络请求库以及字符串处理库还在于基于上述语言的爬虫框架数量极多且趋于完善良好的爬虫框架能够保证爬虫程序的稳定性以及编写程序的简便性。因此这个名为cspider的爬虫库所肩负的使命是我们借助c语言并且依旧能够以优雅的方式去编写爬虫程序。爬虫的特性其配置具备便利性借助一句设置函数实现对user agent的定义达成对cookie的设定完成对timeout的确定达成对proxy的设置实现对抓取线程最大数量的规定实现对解析线程最大数量的规定。程序的逻辑具备着独立性用户能够分别另行定义爬虫的那个解析函数以及又能去定义数据持久化函数并且针对于解析所得到的新的url情况下用户利用cspider所提供出来的addUrl函数把它添加进入到任务队列当中。能够带来便利的字符串处理方式。在cspider里面提供了以pcre作为基础的相对简单的正则表达式函数还有基于libxml2的xpath解析函数另外还有用于解析json的cJSON库。对于抓取而言有着高效的表现。cspider借助libuv来对抓取线程以及解析线程予以调度将curl用作它的网络请求库。使用cspider的步骤获取cspider_t。为自定义user agent设置cookie明确timeout规定proxy而且要给定抓取线程以及解析线程的最大数量。添加初始要抓取的url到任务队列。编写解析函数和数据持久化函数。启动爬虫。例子先来看下简单的爬虫例子会在后面详细讲解例子。#include /* 自定义的解析函数d为获取到的html页面字符串 */ void p(cspider_t *cspider, char *d) { char *get[100]; //xpath解析html int size xpath(d, //body/div[classwrap]/div[classsort-column area]/div[classcolumn-bd cfix]/ul[classst-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(%sn, 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 bids3/yuH5Jd/I; ll108288; viewed1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma30149280.927537245.1446813674.1446983217.1449139583.4; __utmz30149280.1449139583.4.4.utmcsraccounts.douban.com|utmccn(referral)|utmcmdreferral|utmcct/login; psy; ue965166527qq.com; dbcl258742090:QgZ2PSLiDLQ; ckT9Wn; push_noty_num0; push_doumail_num7; ap1; __utmb30149280.0.10.1449139583; __utmc30149280; //设置要抓取页面的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); }例子讲解那只被命名为spider的,cspider_t类型变量被赋值为调用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 的情形那么欢迎予以反馈哟