![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux系统编程项目实践
尹成
尹成微信18510341407,助理微信18514203048
展开
-
Linux企业级项目实践之网络爬虫(2)——网络爬虫的结构与工作流程
网络抓取系统分为核心和扩展两部分。核心部分是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能。目标是尽量的模块化,并体现爬虫的功能特点。这部分提供简单、灵活的API,在基本不改变开发模式的情况下,编写一个爬虫。扩展部分提供一些扩展的功能,内置了一些常用的组件,便于对爬虫进行功能扩展。原创 2014-08-28 01:10:34 · 3963 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(16)——使用base64传输二进制数据
用http传输二进制的数据时,需要将二进制做一下转化,例如传输的int类型,将int类型之间转为char以后,丢失掉了长度的信息,如数字123456,本来只有4个字节,但是转化成文本的“123456”是有7个字节。在int类型的时候固然好办,但是一个数组的时候,经过转化以后,在转化回来就很麻烦了。同时对于一些数字,二进制传输Server是没法处理的。如int 1,二进制数据是0x00000001,原创 2014-08-31 23:02:05 · 1751 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(20)——扩展成为规则插件模式
vector modules_pre_surl;vector modules_post_header;vector modules_post_html;Module * dso_load(const char *path, const char *name){ void *rv = NULL; void *handle = NULL; Module *module原创 2014-08-31 23:15:40 · 1979 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(22)——编写爬虫系统服务控制脚本
需求:1、可通过 service spider start|stop|status|restart 命令对服务进行控制2、spider服务可开机自启动start(){ echo "start spider" /home/projects/spider/spider -d & exit 0;}stop(){ echo -n "stop spider"原创 2014-08-31 23:25:33 · 2081 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(15)——区分文本文件和二进制文件
HTTP协议支持文本和二进制文件传输。最常见的html格式de原创 2014-08-31 22:56:57 · 1838 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(18)——队列处理
所有的URL都接受管理,并在此进行流动。URL从管理模块的存储空间开始,一直到最后输出给磁盘上的URL索引,都由此部分调度。首先,给出URL调度的一般过程,如图所示。其流程的各个具体操作,后面详述。要实现前面DNS的无重复有效请求,那么在这个部分里设置一个Nsite类,实现这样的功能:当一个站点请求过DNS后,就把返回的IP保存到这个类里,那么再有这个站点内的URL出现(域名部分相同),就可以使用原创 2014-08-31 23:07:48 · 1936 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(13)——处理user-agent
User Agent即用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计。浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言)原创 2014-08-31 22:43:19 · 1884 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(17)——存储页面
在爬虫系统中数据的流量相当大,要处理的数据内容不仅包括爬虫系统的各种数据结构空间,而且包括从外部节点中得到的各种数据,比如HTTP请求,HTML页面,ROBOT.TXT等等。如果对这些内容处理不当,那么不仅造成空间的冗余浪费,使爬虫程序效率降低,而且还可能会使系统崩溃。所以,要有合适的空间分配策略。空间分配与管理方案。在内存中使用缓冲空间,以快速的得到、存储数据。统一各种请求的结构,应该合理利用并原创 2014-08-31 23:05:32 · 1777 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(23)——系统测试:找出系统中的bug
为了验证爬虫的业务流程、性能和健壮性需要进行测试。的速度。测试方法:在基本参数如测试时间等,一致的情况下 ,通过设置是否为页面抓取多线程而把两组其他参数完全相同的测试实例分组测试,然后对其结果做比较分析。改变页面连接数参数和DNS请求数参数,然后把这组测试实例进行测试,并和对应没有改变参数的实例的测试结果做比较、分析。测试内容:测试时间TIME,爬行深度DEPT,是否多线程MTHD,最大连接数 C原创 2014-08-31 23:31:21 · 2477 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(25)——管理源代码之SVN
软件项目开发中,一般会用到源代码管理工具SVN。版本控制是管理数据变更的一种技术。对于程序员来说,它已经成为不可或缺的工具,因为他们经常修改软件代码,产生部分的变更,然后第二天再取消所有的变更。想象有一群程序员同时工作的情况你就能理解,为什么需要一个良好的系统来管理可能出现的混乱。 TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录。原创 2014-08-31 23:45:48 · 2275 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(19)——epoll接口
由于要实现爬虫程序的快速抓取,显然如果采用阻塞型的I/O方式,那么系统可能很长时间都处在等待内核响应的状态中,这样爬虫程序将大大地降低效率。然而,如果采用非阻塞I/O,那么就要一直调用应用进程,反复对内核进行轮询。为了实现发送出系统调用请求,而不必一直返回进行查询,最合适的方案应该是采用poll函数,对系统调用实行轮询,即I/O复用模式。原创 2014-08-31 23:09:16 · 2544 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(21)——扩展为多任务爬虫
高效的网络爬虫是搜索引擎的重要基础。采用多任务并发执行,实现类似于CPU的流水线(pipeline)运行方式,可极大地提高网络和计算资源的利用率等性能。#include "threads.h"#include "spider.h"#include "confparser.h" /* the number of current running thread */int g_cur_thre原创 2014-08-31 23:19:13 · 2158 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(24)——定制规则扩展为垂直爬虫
在垂直搜索的索引建立之前,我们需要到垂直网站上抓取资源并做一定的处理。垂直搜索与通用搜索不同之处在于,通用搜索不需要理会网站哪些资源是需要的,哪些是不需要的,一并抓取并将其文本部分做索引。而垂直搜索里,我们的目标网站往往在某一领域具有其专业性,其整体网站的结构相当规范(否则用户体验也是个灾难,想想东一篇文章西一篇文章基本没人会喜欢),并且垂直搜索往往只需要其中一部分具有垂直性的资源,所以垂直爬虫相原创 2014-08-31 23:37:34 · 2193 阅读 · 1 评论 -
Linux企业级项目实践之网络爬虫(26)——线程池
一旦有一个抓取请求开始,就创建一个新的线程,由该线程执行任务,任务执行完毕之后,线程就退出。这就是"即时创建,即时销毁"的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数非常频繁,那么服务器就将处于一个不停的创建线程和销毁线程的状态。这笔开销是不可忽略的,尤其是线程执行的时间非常非常短的情况。 线程池就是为了解决上述问题的,它的实现原理是原创 2014-09-04 00:22:39 · 1892 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(30)——通过查阅RFC文档扩充更加复杂的功能
HTTP是一种很简单的请求、响应式协议,客户端发送一个请求、服务器返回一个响应。HTTP 1.1 版本规范由 RFC2616 定义。了解了 HTTP请求、响应消息在TCP数据流中的格式,很容易使用纯 socket 模拟HTTP客户端、HTTP服务器发送接收数据。 RFC文档全是ASCII码,txt格式,但有其标准格式,用户可通过官方网站查阅(http://www.rfc-editor.org/)原创 2014-09-04 00:43:29 · 2151 阅读 · 0 评论 -
Linux系统编程(25)——终端
在Linux系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端。控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个终端。默认情况下(没有重定向),每个进程的标准输入、标准输出和标准错误输出都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到原创 2014-09-04 00:46:04 · 2353 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(27)——多路IO复用
与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。主要应用:(1)客户程序需要同时处理交互式的输入和服务器之间的网络连接(2)客户端需要对多个网络连接作出反应(3)TCP服务器需要同时处理多个处于监听状态和多个连接状态的套接字(4)服务器需要处理多个网络协议的套接字(5)服务器需要同时处理不同的网络服务和协议 select()函原创 2014-09-04 00:26:20 · 2171 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(29)——遵守robots.txt
Linux企业级项目实践之网络爬虫(29)——遵守robots.txtRobots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。robots.txt文件是一个文本文件。robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt原创 2014-09-04 00:27:59 · 2421 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(11)——处理http请求头
http请求头,HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST)。如有必要,客户程序还可以选择发送其他的请求头。大多数请求头并不是必需的,但Content-Length除外。对于POST请求来说Conte原创 2014-08-31 22:35:22 · 1999 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(12)——处理HTTP应答头
Web服务器的HTTP应答一般由以下几项构成:一个状态行,一个或多个应答头,一个空行,内容文档。设置HTTP应答头往往和设置状态行中的状态代码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。应答头可原创 2014-08-31 22:35:40 · 1898 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(5)——处理配置文件
配置文件在Linux下使用得非常普遍,但是Linux下没有统一个配置文件标准。我们把配置文件的规则制定如下:1、把“#”视作注释开始2、所有的配置项都都是以键值对的形式出现3、严格区分大小写4、允许数据类型为整型的配置项5、允许数据类型为字符串类型的配置项6、允许数据类型为逻辑型的配置项,取值为yes或者no。 同时我们需要对配置文件做初始化和载入两个操作。 代码如下:/* confparser.原创 2014-08-28 01:31:47 · 2394 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(1)——项目概述及准备工作
我们在学习了Linux系统编程之后,需要一些实战项目来提高自己的水平,本系列我们通过编写一个爬虫程序,将我们学习的知识进行综合应用,同时在实现项目的过程中逐渐养成一些有用的思维方式,并具有初步的软件开发思想。网络爬虫是搜索引擎的一个重要基本功能。由于互联网上的信息非常庞大,我们借助搜索引擎很容易得到自己需要的信息。搜索引擎首先需要一个信息采集系统,即网络爬虫,将互联网上的网页或其它信息收集到本地,原创 2014-08-28 01:11:04 · 4487 阅读 · 1 评论 -
Linux企业级项目实践之网络爬虫(4)——主程序流程
当我们设计好程序框架之后就要开始实现它了。第一步当然是要实现主程序的流程框架。 主程序的流程如下:1、 解析命令行参数,并根据参数跳转到相应的处理分支2、 解析配置文件3、 载入处理模块4、 加载种子URL5、 启动抓取线程原创 2014-08-28 01:14:01 · 2368 阅读 · 2 评论 -
Linux企业级项目实践之网络爬虫(3)——设计自己的网络爬虫
网络抓取系统分为核心和扩展组件两部分。核心部分是一个精简的、模块化的爬虫实现,而扩展部分则包括一些便利的、实用性的功能。目标是尽量的模块化,并体现爬虫的功能特点。这部分提供简单、灵活的API,在基本不改变开发模式的情况下,编写一个爬虫。扩展组件部分提供一些扩展的功能,内置了一些常用的组件,便于对爬虫进行功能扩展。 蜘蛛主要功能模块如下: 调度器调度器负责管理待抓取的URL,以及去重的工作。调度器使原创 2014-08-28 01:15:10 · 2934 阅读 · 0 评论 -
Linux企业级开发技术(1)——epoll企业级开发之简介
Epoll是当前在 Linux 下开发大规模并发网络程序的热门人选, Epoll 在 Linux2.6 内核中正式引入。和 select 相似,是高效 I/O 多路复用技术。其实在 Linux 下设计并发网络程序,有多种模型:如典型的 Apache 模型( Process Per Connection ,简称 PPC ), TPC ( Thread PerConnection )模型,以及 sel原创 2014-09-23 14:55:30 · 2396 阅读 · 0 评论 -
Linux企业级开发技术(3)——epoll企业级开发之epoll模型
EPOLL事件有两种模型:Edge Triggered (ET) 边缘触发 只有数据到来,才触发,不管缓存区中是否还有数据。Level Triggered (LT) 水平触发 只要有数据都会触发。 假如有这样一个例子:1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符2. 这个时候从管道的另一端被写入了2KB的数据3. 调用epoll_wait(2),并且它会返原创 2014-09-23 14:56:21 · 1741 阅读 · 0 评论 -
Linux企业级开发技术(5)——libevent企业级开发之简介
Libevent是一个用于编写高速可移植非阻塞IO应用的库,它的设计目标是: 可移植性:使用libevent编写的程序应该可以在libevent支持的所有平台上工作。即使没有好的方式进行非阻塞IO,libevent也应该支持一般的方式,让程序可以在受限的环境中运行。速度:libevent尝试使用每个平台上最高速的非阻塞IO实现,并且不引入太多的额外开销。可扩展性:libevent被设计为程序即使需原创 2014-09-23 15:01:11 · 2791 阅读 · 0 评论 -
Linux企业级开发技术(2)——epoll企业级开发之epoll接口
epoll的接口非常简单,总共只有三个函数: 1、int epoll_create(intsize); 生成一个 Epoll 专用的文件描述符,size用来告诉内核这个监听的数目一共有多大。这个参数不同于select()中的第一个参数,给出最大监听的fd+1的值。需要注意的是,当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看/proc/进程id/fd/,是能够看到这个fd的原创 2014-09-23 14:56:38 · 1863 阅读 · 0 评论 -
Linux企业级开发技术(4)——epoll企业级开发之epoll例程
为了使大家更加深入了解epoll模型在企业应用中的使用,下面给出一段基于epoll的服务器代码,并在代码中添加了详细注释: #include #include #include #include #include #include #include #include #include #include #include #include #include #incl原创 2014-09-23 14:59:13 · 1939 阅读 · 0 评论 -
Linux企业级开发技术(6)——libevent企业级开发之内存管理
默认情况下,libevent使用C库的内存管理函数在堆上分配内存。通过提供malloc、realloc和free的替代函数,可以让libevent使用其他的内存管理器。希望libevent使用一个更高效的分配器时;或者希望libevent使用一个工具分配器,以便检查内存泄漏时,可能需要这样做。接口void event_set_mem_functions(void*(*malloc_fn)(size原创 2014-09-23 15:06:26 · 2208 阅读 · 0 评论 -
Linux企业级开发技术(7)——libevent企业级开发之锁和线程
编写多线程程序的时候,在多个线程中同时访问同样的数据并不总是安全的。libevent的结构体在多线程下通常有三种工作方式:1、某些结构体内在地是单线程的:同时在多个线程中使用它们总是不安全的。2、某些结构体具有可选的锁:可以告知libevent是否需要在多个线程中使用每个对象。3、某些结构体总是锁定的:如果libevent在支持锁的配置下运行,在多个线程中使用它们总是安全的。为获取锁,在调用分配需原创 2014-09-23 15:06:20 · 1918 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(6)——将程序设计成为守护进程
在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程。为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统。 守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。原创 2014-08-31 21:58:14 · 2356 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(7)——DNS解析
DNS 是Domain Name Service的缩写。域名系统为Internet上的主机分配域名地址和IP地址。IP地址不易于记忆,然而域名地址相比较而言是方便于记忆的。用户如果使用域名地址,当想获得IP地址时,就要向域名服务器发送请求。这个域名服务器就会自动把域名地址转为IP地址返回给用户。爬虫程序优化DNS请求的必要性当爬虫程序从HTML页面上提取URL时,一般情况下,应该有很多都是这个站点原创 2014-08-31 22:06:39 · 2813 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(8)——认识URL
URL是Uniform Resource Location的缩写,译为“统一资源定位符”。也可以说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。URL的格式由三部分组成:第一部分是协议(或称为服务方式)。第二部分是存有该资源的主机IP地址,包括端口号,默认为80。第三原创 2014-08-31 22:08:27 · 2155 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(9)——通过URL抓取网页内容
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志爬虫系统要处理的URL是指使用超文本传输协议HTTP的URL。URL分为绝对URL和相对URL绝对URL显示文件的完整路径,这意味着绝对URL本原创 2014-08-31 22:19:53 · 2764 阅读 · 1 评论 -
Linux企业级项目实践之网络爬虫(10)——处理HTTP状态码
HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。所有状态码的第一个数字代表了响应的五种状态之一。他们分别是:消息(1字头)成功(2字头)这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。重定向(3字头)这类状态码代表需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向,后续的请求地址(重定向目标)在本次响应的 Locat原创 2014-08-31 22:25:20 · 2458 阅读 · 0 评论 -
Linux企业级项目实践之网络爬虫(14)——使用正则表达式抽取HTML正文和URL
正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。正则引擎主要可以分为两大类:一种是DFA,一种是NFA。这两种引擎都有了很久的历史(至今二十多年),当原创 2014-08-31 22:50:41 · 2003 阅读 · 1 评论 -
Linux企业级项目实践之网络爬虫(28)——爬虫socket处理
Socket是进程之间交换数据的机制。这些进程即可以是同一台机器上的,也可以是通过网络连接起来的不同机器。一旦一个Socket连接建立,那么数据就能够双向传输,直到其中一端关闭连接。 通常,请求数据的应用程序叫做客户端Client,而为请求服务叫做服务器Server。基本上说,首先,服务器监听一个端口,并且等待来自客户端的连接。之后客户端创建一个,并且尝试连接服务器。接着,服务器接受了来自客户端的原创 2014-09-04 00:27:34 · 2216 阅读 · 0 评论