TinySpider开源喽

TinySpider是一个基于Tiny HtmlParser的网络数据抓取框架。 Maven引用坐标: 
?

1
2
3
4
5
<dependency>
< groupId>org.tinygroup</groupId>
< artifactId>tinyspider</artifactId>
< version>0.0.12</version>
< /dependency>

网络爬虫,一般用在全文检索或内容获取上面。

Tiny框架对此也做了有限的支持,虽然功能不多,但是想做全文检索或从网页上获取数据也是非常方便的。 
框架特性

  • 强大的节点过滤能力
  • 支持post与get两种数据提交方式
  • 避免网页重复处理功能
  • 支持多站点内容抓取功能
  • 较强的Html容错处理

框架设计   网络爬虫 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public interface Spinder {
/**
* 添加站点访问器

* @param siteVisitor
*/
void addSiteVisitor(SiteVisitor siteVisitor);

/**
* 添加监视器

* @param watcher
*/
void addWatcher(Watcher watcher);

/**
* 处理url

* @param url
*/
void processUrl(String url);

/**
* 处理url
* @param url
* @param parameter
*/
void processUrl(String url, Map<String, Object> parameter);

/**
* 设置URL仓库

* @param urlRepository
*/
void setUrlRepository(UrlRepository urlRepository);
}

一个爬虫,至少需要包含一个站点访问器,站点访问器用于对URL进行访问。如果没有匹配的站点访问器,URL将被忽略,不做继续处理。 
一个爬虫至少需要包含一个监视器,监视器用于对URL中的内容进行过滤,并对命中的节点进行处理。如果没有监视器,爬虫爬回的内容就没有任何价值。 
一个爬虫至少需要一个Url仓库,Url仓库用于对ur进行判断,是否已经抓取并处理过。如果没有url仓库,将无法判断url是否处理过,在非常多的时候,会造成死循环,无法退出。 
当然,一个爬虫,也必须能够对url进行处理。 
网站访问者 由于一个爬虫可以有多个站点访问器,因此,需要有isMatch方法告诉爬虫是否应该由自己进行处理。
访问方式,可以设置是通过get还是post方式获取数据。 
URL仓库 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
public interface UrlRepository {
/**
* 返回url是否已经在仓库中存在

* @param url
* @return
*/
boolean isExist(String url);

/**
* 返回url是否已经在仓库中存在,带有参数

* @param url
* @param parameter
* @return
*/
boolean isExist(String url, Map<String, Object> parameter);

/**
* 如果不存在,则放放,如果已经存在,则替换

* @param url
* @param content
*/
void putUrlWithContent(String url, String content);

/**
* 如果不存在,则放放,如果已经存在,则替换

* @param url
* @param parameter
* @param content
*/
void putUrlWithContent(String url, Map<String, Object> parameter,
String content);

/**
* 如果存在,则返回内容;如果不存在,则抛出运行时异常

* @param url
* @return
*/
String getContent(String url);

/**
* 如果存在,则返回内容;如果不存在,则抛出运行时异常

* @param url
* @param parameter
* @return
*/
String getContent(String url, Map<String, Object> parameter);
}

url仓库用于对url及其内容进行管理。由于方法都简单明了,因此不做更多介绍。 
监视器 ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public interface Watcher {
/**
* 设置节点过滤器

* @param filter
*/
void setNodeFilter(NodeFilter<HtmlNode> filter);

/**
* 获取节点过滤器

* @return
*/
NodeFilter<HtmlNode> getNodeFilter();

/**
* 添加处理器

* @param processor
*/
void addProcessor(Processor processor);

/**
* 获取处理器列表

* @return
*/
List<Processor> getProcessorList();
}

一个监视器,必须一个节点过滤器,但是可以有多个处理器。 
处理器 ?

1
2
3
4
5
6
7
8
public interface Processor {
/**
* 处理节点

* @param node
*/
void process(HtmlNode node);
}

处理器非常简单, 就是对命中的节点进行处理即可。 
示例 通过访问[http://www.oschina.net/question?catalog=1]可以看到,里面有许多技术问答的问题。
下面我们就来编写一段程序来把这些标题打出来: 
编写爬虫 

1
2
3
4
5
6
7
8
9
10
11
public static void main(String[] args) {
Spinder spinder = new SpinderImpl();
Watcher watcher = new WatcherImpl();
watcher.addProcessor(new PrintOsChinaProcessor());
QuickNameFilter<HtmlNode> nodeFilter = new QuickNameFilter<HtmlNode>();
nodeFilter.setNodeName("div");
nodeFilter.setIncludeAttribute("class", "qbody");
watcher.setNodeFilter(nodeFilter);
spinder.addWatcher(watcher);
spinder.processUrl("http://www.oschina.net/question?catalog=1");
}

编写处理器 

1
2
3
4
5
6
7
8
9
10
11
public class PrintOsChinaProcessor implements Processor {
  public void process(HtmlNode node) {
FastNameFilter<HtmlNode> filter = new FastNameFilter<HtmlNode>(node);
filter.setNodeName("h2");
filter.setIncludeNode("a");
HtmlNode h3 = filter.findNode();
if (h3 != null) {
System.out.println(h3.getSubNode("a").getContent());
}
}
}

运行结果 输出结果可能与结果不相同,因为数据是一直在变化的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
约瑟夫环问题,一段代码求讲解
求推荐一款分享,回复的前端开源js
MySQL什么情况使用MyISAM,什么时候使用InnoDB?
phpstorm中使用搜狗输入中文出现乱行问题怎样解决?
Android中如何实现快播中娱乐风向标的效果
使用java做手机后台开发!
Chrome 29的alert对话框好漂亮,有木有啊有木有
Eclipse+ADT+Android环境配置问题
关于android holderview的疑惑
蛋疼  从一个公司到另外一个公司都是一个人开发   有木有
wsunit 官方访问不了
android求大神给我看看什么问题
关于Hibernate search 查询结果与数据库不相符的问题
求推荐Oracle好的书籍或PDF
关于"记事本"的 "自动换行" 的实现
swing在线html文本编辑器
android下网络阻塞问题
文件上线系统该如何做(代码上线)
ztree节点设置成check多选框的时候如何只获取叶节点,不要其他节点
怎么设置上传的图片不自动压缩
js 正则表达式问题
eclipse 经常loading descriptor for XXX ,然后卡死
关于android开发xml显示问题
RMI远程对象是共享的吧?
参与开源项目如何进行文档编写
php如何以文件图标的形式列出服务器上的所有文件?
php中一个简单的问题?请帮助解决一下,菜鸟
请教 solr query分词查询,结果为空的问题
这段代码有问题吗,怎么我运行报错?
jquery mobile 页面中切换闪屏问题
你帮我改好,我给你讲个笑话可好TUT
asp.net问题:Js如何获取cookie中的值?
android  电话拦截并处理
iis7 下 php 如何显示报错?
安装virtualbox的时候提示要安装通用串行总线控制器,这个要安装吗?
API获取新浪微博消息
工厂该不该有默认行为
如何处理开发过程中遗留无用的代码
ireport 设计时报表模板时,无法使用sybase驱动com.sybase.jdbc3.jdbc.SybDriver?
关于 使用druid后的一些问题.

小结 从示例可以看出,要从网页里获取数据,确实是非常容易的一件事情,只寥寥几行(20行左右),就采集出了我们想要的数据,要想抓出更多的数据,只要逐层细化分析即可。

时间: 2024-11-05 02:31:51

TinySpider开源喽的相关文章

TinyHtmlParser开源喽

优点:  高效.简单.易用的Html解析器. 学习时间,分分钟. 解析速度超过,查找速度超快,支持格式化. 有强悍的容错性,即使HTML标签不规范,也会尽可以进行匹配,弥补,正确纠错率达95%以上.即使不能正确纠错,也不会导致解析不下去. 支持大小写混合匹配,即开始标签与结束标签为<HTML>和</html>也可以正确的进行匹配. Maven引用坐标: 1 <dependency> 2 <groupId>org.tinygroup</groupId&g

TinyXmlParser开源喽

优点:  高效.简单.易用的Xml解析器. 学习时间,分分钟. 支持中文标签名与属性名,支持下划线,减号等分隔符. 解析速度超过,查找速度超快,支持格式化. 缺点:不支持Xml Schema,DTD校验. Maven引用坐标: 12345 <dependency>< groupId>org.tinygroup</groupId>< artifactId>xmlparser</artifactId>< version>0.0.12<

爆料喽!!!开源日志库Logger的使用秘籍

导读 日志对于开发来说是非常重要的,不管是调试数据查看.bug问题追踪定位.数据信息收集统计,日常工作运行维护等等,都大量的使用到.今天介绍著名开源日志库Logger的使用,库的地址:https://github.com/orhanobut/logger 在Android Studio中的gradle中加入,就可以引用依赖logger库: dependencies { compile 'com.orhanobut:logger:1.15' } Logger库能提供的功能: 线程的信息 类的信息

GitHub 开源工具整理

技术站点 Hacker News:非常棒的针对编程的链接聚合网站 Programming reddit:同上 MSDN:微软相关的官方技术集中地,主要是文档类 infoq:企业级应用,关注软件开发领域 OSChina:开源技术社区,开源方面做的不错哦 cnblogs,51cto,csdn:常见的技术社区,各有专长 stackoverflow:IT技术问答网站 GitHub:全球最大的源代码管理平台,很多知名开源项目都在上面,如Linux内核, OpenStack等免费的it电子书:http://

开源一个自己写的APP:装哔指南-记车标

想想我做安卓开发到现在也快两年了,所在的公司基本都是在做企业内部应用,自己每次做的一些小应用,都是做到一半或者快完成的时候放着积灰了.感觉很没有成就感啊!这两天心血来潮写了一个小应用:装哔指南-记车标 ,(花了两天,其中一天在搜集车标数据弄数据库 0.0 )顺便发出来给一些新手们学习学习(我也新手=.=   大神请绕道.) 下面简单介绍一下应用里面用到的知识点: 1. android SQLite 的简单使用. 2. listview和gridview 配合 BaseAdapter的使用方法.

开源蜘蛛集合(转自haizhiguang博客,链接:http://blog.csdn.net/haizhiguang/article/details/20209573)

各种蜘蛛: Heritrix   点击次数:1458 Heritrix是一个开源,可扩展的web爬虫项目.Heritrix设计成严格按照robots.txt文件的排除指示和META robots标签.  WebSPHINX   点击次数:777 WebSPHINX是一个Java类包和Web爬虫的交互式开发环境.Web爬虫(也叫作机器人或蜘蛛)是可以自动浏览与处理Web页面的程序.WebSPHINX由两部分组成:爬虫工作平台和WebSPHINX类包.  J-Spider   点击次数:1008 J

NodeJs随心学习(一)之UEditor开源项目部署

作为NodeJs的初学者+6年的码农,我觉得从基础看起太慢了,还是直接上Demo好玩一些. 嗯,直接开玩..今天在GitHub上看到了UEditor之NodeJs版的开源项目激起了我浓厚的兴趣,随后决定部署一下,玩一玩[先上项目,再看语法~] 1.NodeJs环境当然必不可少喽~[不知道的同学请去搜基础教程,就是个安装嘛..] 2.安装UEditor模块~ 3.当然,从GitHub上下载的源码必不可少[https://github.com/netpi/ueditor] hello.js是我测试的

【转】44款Java 网络爬虫开源软件

原帖地址 http://www.oschina.net/project/lang/19?tag=64&sort=time 极简网络爬虫组件 WebFetch WebFetch 是无依赖极简网页爬取组件,能在移动设备上运行的微型爬虫. WebFetch 要达到的目标: 没有第三方依赖jar包 减少内存使用 提高CPU利用率 加快网络爬取速度 简洁明了的api接口 能在Android设备上稳定运行 小巧灵活可以方便集成的网页抓取组件 使用...更多WebFetch信息 开源爬虫框架 Guozhong

几个开源分词系统所使用标注集的来源

http://www.hankcs.com/nlp/corpus/several-revenue-segmentation-system-used-set-of-source-tagging.html 我发现几个民间的分词项目的词典很乱,ansj分词的作者承认arrays.dic是从结巴分词抄过来的,结巴的作者说词典是98年人民日报+ictclas切割小说统计出来的,那么可以推断这两个分词的标注集应该和ictclas是一样的. 按照ictclas的官方说法,其采用的标注集是ICTPOS3.0词性