Linux企业级项目实践之网络爬虫(24)——定制规则扩展为垂直爬虫
在垂直搜索的索引建立之前,我们需要到垂直网站上抓取资源并做一定的处理。垂直搜索与通用搜索不同之处在于,通用搜索不需要理会网站哪些资源是需要的,哪些是不需要的,一并抓取并将其文本部分做索引。而垂直搜索里,我们的目标网站往往在某一领域具有其专业性,其整体网站的结构相当规范(否则用户体验也是个灾难,想想东一篇文章西一篇文章基本没人会喜欢),并且垂直搜索往往只需要其中一部分具有垂直性的资源,所以垂直爬虫相比通用爬虫更加精确。
垂直爬虫爬取资源步骤:
首先选定需要抓取的目标网站,输入数据库的站源表sitelist,然后url crawler会读取出来存入map,并提出对应站点的正则解析规则。
然后根据事先制定的url列表页正则表达式,url crawler到列表页爬取列表并提取出来存入资源url表urllist,当中涉及一些列表页分页功能,具体视每个网站分页url规则而定。
从数据库的资源url表读出urls及其资源页的爬取规则,存入一个同步的队列中(一般做法会将url做md5处理,用于去重,以免重复爬取相同url,浪费资源),多线程下的每个爬虫程序将从此队列读取urls(若队列为空线程将进入等待),然后爬取每个资源页并保持页面。
最后根据爬取到的页面,进行进一步的处理。
int extract_url(regex_t *re, char *str, Url *ourl)
{
const size_t nmatch = 2;
regmatch_t matchptr[nmatch];
int len; char *p = str;
while (regexec(re, p, nmatch, matchptr, 0) != REG_NOMATCH) {
len = (matchptr[1].rm_eo - matchptr[1].rm_so);
p = p + matchptr[1].rm_so;
char *tmp = (char *)calloc(len+1, 1);
strncpy(tmp, p, len);
tmp[len] = '\0';
p = p + len + (matchptr[0].rm_eo - matchptr[1].rm_eo); /* exclude binary file */
if (is_bin_url(tmp)) {
free(tmp);
continue;
} char *url = attach_domain(tmp, ourl->domain);
if (url != NULL) {
SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I find a url: %s", url);
Surl * surl = (Surl *)malloc(sizeof(Surl));
surl->level = ourl->level + 1;
surl->type = TYPE_HTML; /* normalize url */
if ((surl->url = url_normalized(url)) == NULL) {
SPIDER_LOG(SPIDER_LEVEL_WARN, "Normalize url fail");
free(surl);
continue;
} if (iscrawled(surl->url)) { /* if is crawled */
SPIDER_LOG(SPIDER_LEVEL_DEBUG, "I seen this url: %s", surl->url);
free(surl->url);
free(surl);
continue;
} else {
push_surlqueue(surl);
} }
} return (p-str);
}
Linux企业级项目实践之网络爬虫(24)——定制规则扩展为垂直爬虫的更多相关文章
- Linux企业级项目实践之网络爬虫(3)——设计自己的网络爬虫
网络抓取系统分为核心和扩展组件两部分.核心部分是一个精简的.模块化的爬虫实现,而扩展部分则包括一些便利的.实用性的功能.目标是尽量的模块化,并体现爬虫的功能特点.这部分提供简单.灵活的API,在基本不 ...
- Linux企业级项目实践之网络爬虫(1)——项目概述及准备工作
我们在学习了Linux系统编程之后,需要一些实战项目来提高自己的水平,本系列我们通过编写一个爬虫程序,将我们学习的知识进行综合应用,同时在实现项目的过程中逐渐养成一些有用的思维方式,并具有初步的软件开 ...
- Linux企业级项目实践之网络爬虫(23)——系统测试:找出系统中的bug
为了验证爬虫的业务流程.性能和健壮性需要进行测试. 软件测试是描述一种用来促进鉴定软件的正确性.完整性.安全性和质量的过程.软件测试的经典定义是:在规定的条件下对程序进行操作,以发现程序错误,衡量软件 ...
- Linux企业级项目实践之网络爬虫(30)——通过查阅RFC文档扩充更加复杂的功能
HTTP是一种很简单的请求.响应式协议,客户端发送一个请求.服务器返回一个响应.HTTP 1.1 版本规范由 RFC2616 定义.了解了 HTTP请求.响应消息在TCP数据流中的格式,很容易使用纯 ...
- Linux企业级项目实践之网络爬虫(29)——遵守robots.txt
Robots协议(也称为爬虫协议.机器人协议等)的全称是"网络爬虫排除标准"(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以 ...
- Linux企业级项目实践之网络爬虫(28)——爬虫socket处理
Socket是进程之间交换数据的机制.这些进程即可以是同一台机器上的,也可以是通过网络连接起来的不同机器.一旦一个Socket连接建立,那么数据就能够双向传输,直到其中一端关闭连接. 通常,请求数据的 ...
- Linux企业级项目实践之网络爬虫(21)——扩展为多任务爬虫
高效的网络爬虫是搜索引擎的重要基础.采用多任务并发执行,实现类似于CPU的流水线(pipeline)运行方式,可极大地提高网络和计算资源的利用率等性能. #include "threads. ...
- Linux企业级项目实践之网络爬虫(19)——epoll接口
由于要实现爬虫程序的快速抓取,显然如果采用阻塞型的I/O方式,那么系统可能很长时间都处在等待内核响应的状态中,这样爬虫程序将大大地降低效率.然而,如果采用非阻塞I/O,那么就要一直调用应用进程,反复对 ...
- Linux企业级项目实践之网络爬虫(6)——将程序设计成为守护进程
在linux或者unix操作系统中在系统的引导的时候会开启很多服务,这些服务就叫做守护进程.为了增加灵活性,root可以选择系统开启的模式,这些模式叫做运行级别,每一种运行级别以一定的方式配置系统. ...
随机推荐
- 深入理解linux网络技术内幕读书笔记(三)--用户空间与内核的接口
Table of Contents 1 概论 1.1 procfs (/proc 文件系统) 1.1.1 编程接口 1.2 sysctl (/proc/sys目录) 1.2.1 编程接口 1.3 sy ...
- ID3算法(决策树)
一,预备知识: 信息量: 单个类别的信息熵: 条件信息量: 单个类别的条件熵: 信息增益: 信息熵: 条件熵:(表示分类的类,表示属性V的取值,m为属性V的取值个数,n为分类的个数) 二.算法流程: ...
- C++ 命名规范小结
1. #defines and const test.h #ifndef TEST_H #define TEST_H #endif #define FALSE 0 #define TRUE (!FAL ...
- iOS--九宫格布局
[self rankWithTotalColumns: andWithAppW: andWithAppH:]; //九宫格布局 - (void)rankWithTotalColumns:(int)to ...
- JS中的Math.ceil和Math.floor函数的用法
Math.ceil(x) -- 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 Math.floor(x)--返回小于等于数字参数的最大整数,对数字进行下舍入 例如: document. ...
- firefox关于about:config的常用配置
about:config是火狐的设置页面,火狐提供了不少高级设置选项在这里以便让你可以更加详细地控制火狐的运行方式.(官方不推荐用户手工修改about:config的设置.所以,如果你对于你想修改的内 ...
- windows 7 SDK和DDK下载地址
查个小资料,得到地址,顺便记录一下. Windows Driver Kit Version 7.1.0 http://www.microsoft.com/downloads/details.aspx? ...
- [ES6] for..in && for..of
var ary = [ { id: 1, name: "Zhentian" }, { id: 2, name: "Alice" } ]; for..in Pri ...
- 收集的URL
*******************************************看文章的好地方************************************** http://www. ...
- [Python爬虫笔记][随意找个博客入门(一)]
[Python爬虫笔记][随意找个博客入门(一)] 标签(空格分隔): Python 爬虫 2016年暑假 来源博客:挣脱不足与蒙昧 1.简单的爬取特定url的html代码 import urllib ...