如何优雅地使用c语言编写爬虫
想做爬虫程序不是学完语言就行了,是要学很多东西的,你可以查一查大学计算机专业有哪些课程。
做爬虫可以学学java语言。
《网络机器人Java编程指南》
开源的爬虫产品
http://www.oschina.net/project/tag/64/spider?lang=19&os=0&sort=view&p=1
获取cspider_t。
自定义user agent,cookie,timeout,proxy以及抓取线程和解析线程的最大数量。
添加初始要抓取的url到任务队列。
编写解析函数和数据持久化函数。
启动爬虫。
例子
先来看下简单的爬虫例子,会在后面详细讲解例子。
#include/* 自定义的解析函数,d为获取到的html页面字符串*/void p(cspider_t *cspider, char *d, void *user_data) {char *get[100];//xpath解析htmlint 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
", get);return;}int main() {//初始化spidercspider_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";//设置要抓取页面的urlcs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");//设置user agentcs_setopt_useragent(spider, agent);//cs_setopt_cookie(spider, cookie);//传入解析函数和数据持久化函数的指针cs_setopt_process(spider, p, NULL);//s函数的user_data指针指向stdoutcs_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);}
大家在平时或多或少地都会有编写网络爬虫的需求。一般来说,编写爬虫的首选自然非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 = 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)即可启动爬虫。
具体的API参数可在这里查看
总结
赶快使用cspider爬虫框架来编写爬虫吧!如果在使用过程中发现bug,欢迎反馈。
望采纳,谢谢
啊哈C语言 第一、二章 入门
scanf函数则是计算机的输入接口,它接收用户的指令,如同信件中的地址,与printf形成鲜明的对应关系。3. 存储与变量的运用 编程中的“小房子”——变量,是数据的临时存储空间。通过声明和赋值,我们可以控制数据在程序中的流动,理解赋值号与等号的区别,是理解C语言的基础。三、优雅学习,享受编程之旅这...
仅从语法角度来讲,C#和C++哪个更优雅
1、 效率方面:C++注重运行效率,如果对实时性有较高要求,首选C++\/C语言。C#写成的代码,都是先被编译成中间语言(IL,Intermediate Language,在运行时,再由即时编译器(JIT,Just-In-Time)编译成本机代码,所以实时性上少欠一筹。2、依赖性:C++可以生成native(本地代码),不用依赖于.net ...
【C语言】符号的深入理解(第二期)
如果你渴望更深入地学习和交流,那么加入我们精心设计的学习社群吧,群号是214574728,这里有丰富的实践题目和共享的学习资源,让我们共同在符号的世界里探索前行。通过以上深入解读,你是否已经对C语言的符号有了更深的理解?继续探索,你会发现更多的编程乐趣和技巧。记住,每一次的符号操作,都是代码艺术...
C语言现在是不是被C++替代了
C在编程的地位无可替代,Java和C#在多媒体开发和超级计算面前显得是多么的无力,它具有汇编的高效和高级编程语言的通俗性,使其在各个领域表现非凡,你可以去看各种音视频,图像编码器均是C编写,c++的优秀体现在语法相比C语言优雅,面向对象的特性使其更加容易复用核心代码,但其程序运行效率相比C较低了...
c语言中feof是什么意思
如果想知道是否已经读取到文件的最后,调用feof函数就显得尤为重要。它能帮助程序员避免因试图继续读取已到达结尾的文件而引发的错误,从而提高了代码的健壮性。总结来说,feof就像一个文件操作的“哨兵”,在C语言的文件处理中扮演着检查边界的角色,使得程序能够优雅地处理文件的读取结束。
c语言中%符号的各种用法及其含义是什么?
对于数字精度,%f、%e和%g则是实数的三位高手。%f以小数形式展示,%e以指数表示,而%g则根据数值的特性,智能地选择f或e,避免不必要的零,让信息传递更为清晰<\/。至于变量地址,%p则是内存世界的地址标签。这些格式字符的强大功能,使得C语言能够精确控制输出的格式,无论你是要展示数值的细节,还是...
C语言重要吗?
5、程序执行效率高,一般比汇编程序生成的目标代码效率低 10%~20%。6、可移植性好,C 语言抽象了针对 CPU 编程的细节,能广泛应用于针对大型操作系统和系统软件的编写。7、具备强大的绘图功能,和 C++ 一样也可以写出很优雅的二维、三维图形和动画。有人说,C 是 C++ 的子集,C 能做到的事,C++ ...
C语言判断语句
深入解析C语言中的判断语句:精准控制程序流程 一、if语句:基础的单分支选择在C语言中,if(条件) {…}结构是编程的基石,用于根据条件执行特定操作。当条件为真(非零值)时,执行花括号内的语句:if (表达式) { 语句;}这里的表达式可以是简单的比较,如a非零(a!=0),或者利用flag变量的真值...
如何才能学好c语言?感觉好难啊
5.会调式程序,会调试程序==会写程序 6.放弃用IDE写傻瓜程序的机会,自个尝试手动预处理,编译,汇编,连接一个小程序。这样你会对程序的各个处理过程了如指掌,你就能区分那些是编译时错误,那些是链接时错误,那些是运行时错误。7.分析PE结构和ELF结构,你会学到程序的静态结构。8.分析C语言程序所...
java语言和c语言哪个实用java语言和c语言的区别
C.语言与JAVA的区别之我见 1. C是面向过程的语言,JAVA是面向对象的语言 2. JAVA必须运行在虚拟机的环境中,这就是很多桌面应用程序都不用JAVA写的原因, 但是,正是因为虚拟机,JAVA获得的平台无关性,而C的程序有可能需要重新修改编译才 能实现平台的移植;另一方面,C语言比JAVA语言更“底层”, C语言可以编写例如...
叱干刻止咳: 前言 大家在平时或多或少地都会有编写网络爬虫的需求.一般来说,编写爬虫的首选自然非python莫属,除此之外,java等语言也是不错的选择.选择上述语言的原因不仅仅在于它们均有非常不错的网络请求库和字符串处理库,还在于基于上述...
台安县15780477573: 我想用c编写一个爬虫程序,可是看完一本c语言教程后,还是觉得只会编写一些计算类的小代码,要学会编写 - ?
叱干刻止咳: 只用c语言,只能做一些计算类小题 必须结合其他库才能扩展其强大的功能 推荐一个:qt 百度一下你就知道了
台安县15780477573: 如何用C#语言构造蜘蛛程序 - ?
叱干刻止咳: "蜘蛛(Spider)是Internet上一种很有用的程序,搜索引擎利用蜘蛛程序将Web页面收集到数据库,企业利用蜘蛛程序监视竞争对手的网站并跟踪变动,个人用户用蜘蛛程序下载Web页面以便脱机使用,开发者利用蜘蛛程序扫描自己的Web检...
台安县15780477573: 如何编写网页爬虫搜索网页? ?
叱干刻止咳: 弄个搜索引擎的实例(java写的)(爬虫从网页上抓取内容再检索再lucene搜索出来)简单的最好 ivspider 一个C语言开发、封装为dll的爬虫引擎,如把网页或图,yGwGjp
台安县15780477573: C++如何实现Python爬虫功能 - ?
叱干刻止咳: iOS开发如果之前没接触过除了c和c++(c++太难了,不花个十来年基本不可能精通)的语言,第二门语言最好的选择就是python.原因就是 1.语法简单 2.库太多,随便想要什么功能的库都找得到,简直编程界的哆啦A梦. 3.语法优美,不信?你去看看python超过两千行的代码再回头看看用oc写的超过两千行的代码,oc写的简直丑到极致(没命名空间,点语法调用和括号调用混用)
台安县15780477573: 如何用c语言写网页脚本 - ?
叱干刻止咳: 网页里能用于编写脚本的语言目前来说只有Javascript(与Java没有关系) 以前有用Applet(采用Java创建的基于HTML的小应用程序)的,但现在几乎没人再用这个了 Java,以及ASP、ASP.NET、PHP等都是服务端的语言,是由服务器处理生成HTML再传输给客户端(也就是浏览器)的 只有Javascript,是在客户端(也就是浏览器)运行的,所以称之为脚本语言
台安县15780477573: 如何用C语言打开网页,并从网页上下载东西 - ?
叱干刻止咳: 这个似乎是做不到的,因为C语言的操作都十分底层,不能操作图形,鼠标.
台安县15780477573: 如何编写优雅的代码:01. 概述 - ?
叱干刻止咳: 笔者认为所谓优雅的代码包含三部分涵义:风格好、结构好和性能好的三好代码.所有的编程语言都适用,只不过每种语言的特性和语法不同,实践三好代码的方式和途径也不尽相同.需要注意的是,在有些时候这三种内涵之间是矛盾的.例如...
台安县15780477573: 用C语言编写一个随机点名程序 - ?
叱干刻止咳: 例: #include/*standardinput&output*/ #include/*standardlibary*/ #include/*string*/ #include/*ConsoleInput/Output*/ #include structstudentinfo/*学生信息的结构体*/ { charsNo[5];/*学生编号*/ charsxueNo[14];/*学号*/ charsname[20];/*学生的姓名*/...
台安县15780477573: 如何用C语言编软件??
叱干刻止咳: 要想用C编出一个想样的实用的软件,确实太费事了,C过于底层了,建议用Delphi,可以不敲一下键盘,不用2分钟就能编制出一个数据库应用程序,功能有编辑,增,删,改等.方法:启动delphi,选择菜单中的datebase=>form wirard下一步,下一步......不信试试.