如何优雅地使用c语言编写爬虫

如何优雅地使用c语言编写爬虫,第1张

前言

大家在平时或多或少地都会有编写网络爬虫的需求。一般来说,编写爬虫的首选自然非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<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 = 0i <sizei++) {

//将获取到的电影名称,持久化

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 (MacintoshIntel Mac OS X 10.10rv:42.0) Gecko/20100101 Firefox/42.0"

//char *cookie = "bid=s3/yuH5Jd/Ill=108288viewed=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=/loginps=yue=965166527@qq.comdbcl2=58742090:QgZ2PSLiDLQck=T9Wnpush_noty_num=0push_doumail_num=7ap=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)即可启动爬虫。

具体的API参数可在这里查看

总结

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

望采纳,谢谢

能够做网络爬虫的编程语言很多,包括PHP、Java、C/C++、Python等都能做爬虫,都能达到抓取想要的绝银明数据资源。针对不同的环境,我们需要了解他们做爬虫的优缺点,才能选出合适的开发环境。

(一)PHP

网络爬虫需要快速的从服务器中抓取需要的数据,有时数据量较大时需要进行多线程抓取。PHP虽然是世界上最好的语言,但是PHP对多线程、异步支持不足,并发不足,而爬虫程序对速度和效率要求极高,所以说PHP天生不是做爬虫的。

(二)C/C++

C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发,运行效率和性能是最强大的,但是它的学习成本非常高,需要有很好地编程知识基础,对于初学者或者编程知识不是很好地程序员来说,不是一个很好的选择。当然,能够用C/C++编写爬虫程序,足以说明能力很强,但是绝不是最正确的选择。

(三)Java

在网络爬虫方面,作为Python最大的对手Java,拥有强大的生态圈。但是Java本身很笨重,代码量大。由于爬虫与反爬虫的较量是持久的,也是频繁的,刚写好的爬虫程序很可能就不能用了。爬虫程序需要经常性的修改部分代码。而Java的重构成本比较高,任何修改都会搏陵导致大量代码的变动。

(四)Python

Python在设计上坚持了清晰划一的风格,易读、易维护,语法并告优美、代码简洁、开发效率高、第三方模块多。并且拥有强大的爬虫Scrapy,以及成熟高效的scrapy-redis分布式策略。实现同样的爬虫功能,代码量少,而且维护方便,开发效率高。

获取cspider_t。

自定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。

添加初始要抓取的url到任务队列。

编写解析函数和数据持久化函数。

启动爬虫。

例子

先链仿培来看下简单的爬虫例子,会在后面详细讲解例子。

#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 = 0i <sizei++) {

//将获取到的电影名称,持久化

 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 (MacintoshIntel Mac OS X 10.10rv:42.0) Gecko/20100101 Firefox/42.0"

//char *cookie = "bid=s3/yuH5Jd/Ill=108288viewed=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=/loginps=yue=965166527@qq.comdbcl2=58742090:QgZ2PSLiDLQck=T9Wnpush_noty_num=0push_doumail_num=7ap=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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12533989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存