
一只简单的网络爬虫(基于linux C/C++)
缱绻的西格玛
西格玛不离散
展开
-
一只简单的网络爬虫(基于linux C/C++)————读取命令行参数及日志宏设计
linux上面的程序刚开始启动的时候一般会从命令行获取某些参数,比如以守护进程运行啊什么的,典型的例子就是linux下的man,如下图所示 实现该功能可以使用getopt函数实现,该函数在头文件unistd.h定义 函数原型 int getopt(int argc,char * const argv[ ],const char * optstring); 函数说明原创 2015-09-22 11:55:27 · 3272 阅读 · 4 评论 -
一只简单的网络爬虫(基于linux C/C++)————利用正则表达式解析页面
我们向一个HTTP的服务器发送HTTP的请求后,服务器会返回可能一个HTML页面(当然也可以是其他的资源),我们可以利用返回的HTML页面,在其中寻找其他的Url,例如我们可以这样在浏览器上查看一下HTML页面: 右键——>查看源代码 出现的页面大致如下: 我们可以看到,一个HTML的页面内容是想当多的,如果我们使用之前查找字符串的方法一行一行查找的话,效率是想当低下的。同时我们可以看原创 2015-09-24 12:30:56 · 4837 阅读 · 2 评论 -
一只简单的网络爬虫(基于linux C/C++)————线程相关
爬虫里面采用了多线程的方式处理多个任务,以便支持并发的处理,把主函数那边算一个线程的话,加上一个DNS解析的线程,以及我们可以设置的max_job_num值,最多使用了1+1+max_job_num个线程。相关的线程封装如下: 创建线程int create_thread(void *(*start_func)(void *), void * arg, pthread_t *pid, pthread原创 2015-09-24 10:43:06 · 2771 阅读 · 0 评论 -
一只简单的网络爬虫(基于linux C/C++)————socket相关及HTTP
socket相关建立连接 网络通信中少不了socket,该爬虫没有使用现成的一些库,而是自己封装了socket的相关操作,因为爬虫属于客户端,建立套接字和发起连接都封装在build_connect中//建立连接int build_connect(int *fd, char *ip, int port){ struct sockaddr_in server_addr; bzero原创 2015-09-24 00:34:51 · 8458 阅读 · 2 评论 -
一只简单的网络爬虫(基于linux C/C++)————浅谈并发(IO复用)模型
Linux常用的并发模型Linux 下设计并发网络程序,有典型的 Apache 模型( Process Per Connection ,简称 PPC ), TPC ( Thread Per Connection )模型,以及 select 模型, poll 模型和epoll模型。 1 、PPC/TPC 模型 这两种模型思想类似,就是让每一个到来的连接一边自己做事去,别再来烦我 。只是 PPC 是原创 2015-09-23 16:01:23 · 3201 阅读 · 3 评论 -
一只简单的网络爬虫(基于linux C/C++)————Url处理以及使用libevent进行DNS解析
Url处理爬虫里使用了两个数据结构来管理Url 下面的这个数据结构用来维护原始的Url,同时有一个原始Url的队列//维护url原始字符串typedef struct Surl { char *url; int level;//url抓取深度 int type;//抓取类型} Surl;原始的Url队列static queue <Surl *> surl原创 2015-09-23 16:48:55 · 4959 阅读 · 1 评论 -
一只简单的网络爬虫(基于linux C/C++)————支持动态模块加载
插件在软件设计中有很大的好处为了方便我们爬虫功能的扩展,最好使用插件机制。,使用插件技术能够在分析、设计、开发、项目计划、协作生产和产品扩展等很多方面带来好处: (1)结构清晰、易于理解。由于借鉴了硬件总线的结构,而且各个插件之间是相互独立的,所以结构非常清晰也更容易理解。 (2)易修改、可维护性强。由于插件与宿主程序之间通过接口联系,就像硬件插卡一样,可以被随时删除,插入和修改,所以结构很灵活原创 2015-09-22 16:24:20 · 2940 阅读 · 0 评论 -
一只简单的网络爬虫(基于linux C/C++)————守护进程
守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程。它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程常常在系统引导装入时启动,在系统关闭时终止。Linux系统有很多守护进程,大多数服务都是通过守护进程实现的,同时,守护进程还能完成许多系统任务,例如,作业规划进程crond、打印进程lqd等(这里的结尾字母d就是Daemon的意原创 2015-09-22 15:24:40 · 2884 阅读 · 0 评论 -
一只简单的网络爬虫(基于linux C/C++)————开篇
最近学习开发linux下的爬虫,主要是参考了该博客及其他一些网上的资料。网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。目前有一些比较出名的一些开源爬虫,开源爬虫Labin,Nutch,Neritrix介绍和对比见这里 下面说的爬虫是作为一个原创 2015-09-22 10:31:06 · 7712 阅读 · 3 评论 -
一只简单的网络爬虫(基于linux C/C++)————配置文件设计及读取
一般来说linux下比较大型的程序都是以配置文件作为参数介质传递的,该爬虫也采用配置文件的方式来获取参数,配置文件格式大致如下:max_job_num=1#seeds=https://www.baidu.com#seeds=http://bbs.scut.edu.cn/classic/logfile=spiderq.log以“=”作为分割符,左边为key,右边为valve,主要包含的参数内容为原创 2015-09-22 11:02:07 · 3389 阅读 · 0 评论 -
一只简单的网络爬虫(基于linux C/C++)————主事件流程
该爬虫的主事件流程大致如下: 1.获取命令行参数,执行相应操作 2.读取配置文件,解析得到各种设置 3.载入各种模块 4.种子入队,开启DNS解析线程(原始队列不为空时解析) 5.创建epoll,开启任务,发起请求等等,关注事件 6.while大循环中使用epoll_wait返回活跃的事件,每个事件开启一个线程处理(线程中主要是解析页面,保存页面,url处理等),在线程结束的时候可能会开原创 2015-09-24 12:52:37 · 3913 阅读 · 3 评论