当前位置: 首页 > 软件库 > 应用工具 > 网络爬虫 >

TinySpider

网络数据抓取框架
授权协议 GPL
开发语言 Java
所属分类 应用工具、 网络爬虫
软件类型 开源软件
地区 国产
投 递 者 荆鸿畅
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

TinySpider是一个基于Tiny HtmlParser的网络数据抓取框架。

Maven引用坐标:

<dependency>
<groupId>org.tinygroup</groupId>
<artifactId>org.tinygroup.spider</artifactId>
<version>0.1.0-SNAPSHOT</version>
</dependency>




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

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

框架特性

  1. 强大的节点过滤能力

  2. 支持post与get两种数据提交方式

  3. 避免网页重复处理功能

  4. 支持多站点内容抓取功能

  5. 较强的Html容错处理

框架设计

网络爬虫

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, Mapparameter);


 /**
 * 设置URL仓库
 * 
 * @param urlRepository
 */
 void setUrlRepository(UrlRepository urlRepository);
}

一个爬虫,至少需要包含一个站点访问器,站点访问器用于对URL进行访问。如果没有匹配的站点访问器,URL将被忽略,不做继续处理。

一个爬虫至少需要包含一个监视器,监视器用于对URL中的内容进行过滤,并对命中的节点进行处理。如果没有监视器,爬虫爬回的内容就没有任何价值。

一个爬虫至少需要一个Url仓库,Url仓库用于对ur进行判断,是否已经抓取并处理过。如果没有url仓库,将无法判断url是否处理过,在非常多的时候,会造成死循环,无法退出。

当然,一个爬虫,也必须能够对url进行处理。

网站访问者

由于一个爬虫可以有多个站点访问器,因此,需要有isMatch方法告诉爬虫是否应该由自己进行处理。
访问方式,可以设置是通过get还是post方式获取数据。

URL仓库

public interface UrlRepository {
 /**
 * 返回url是否已经在仓库中存在
 * 
 * @param url
 * @return
 */
 boolean isExist(String url);


 /**
 * 返回url是否已经在仓库中存在,带有参数
 * 
 * @param url
 * @param parameter
 * @return
 */
 boolean isExist(String url, Mapparameter);


 /**
 * 如果不存在,则放放,如果已经存在,则替换
 * 
 * @param url
 * @param content
 */
 void putUrlWithContent(String url, String content);


 /**
 * 如果不存在,则放放,如果已经存在,则替换
 * 
 * @param url
 * @param parameter
 * @param content
 */
 void putUrlWithContent(String url, Mapparameter,
 String content);


 /**
 * 如果存在,则返回内容;如果不存在,则抛出运行时异常
 * 
 * @param url
 * @return
 */
 String getContent(String url);


 /**
 * 如果存在,则返回内容;如果不存在,则抛出运行时异常
 * 
 * @param url
 * @param parameter
 * @return
 */
 String getContent(String url, Mapparameter);
}

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

监视器

public interface Watcher {
 /**
 * 设置节点过滤器
 * 
 * @param filter
 */
 void setNodeFilter(NodeFilterfilter);


 /**
 * 获取节点过滤器
 * 
 * @return
 */
 NodeFiltergetNodeFilter();


 /**
 * 添加处理器
 * 
 * @param processor
 */
 void addProcessor(Processor processor);


 /**
 * 获取处理器列表
 * 
 * @return
 */
 ListgetProcessorList();
}

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

处理器

public interface Processor {
 /**
 * 处理节点
 * 
 * @param node
 */
 void process(HtmlNode node);
}

处理器非常简单, 就是对命中的节点进行处理即可。

示例

通过访问[http://www.oschina.net/question?catalog=1]可以看到,里面有许多技术问答的问题。
下面我们就来编写一段程序来把这些标题打出来:

编写爬虫

public static void main(String[] args) {
 Spinder spinder = new SpinderImpl();
 Watcher watcher = new WatcherImpl();
 watcher.addProcessor(new PrintOsChinaProcessor());
 QuickNameFilternodeFilter = new QuickNameFilter();
 nodeFilter.setNodeName("div");
 nodeFilter.setIncludeAttribute("class", "qbody");
 watcher.setNodeFilter(nodeFilter);
 spinder.addWatcher(watcher);
 spinder.processUrl("http://www.oschina.net/question?catalog=1");
 }

编写处理器

public class PrintOsChinaProcessor implements Processor {
  public void process(HtmlNode node) {
 FastNameFilterfilter = new FastNameFilter(node);
 filter.setNodeName("h2");
 filter.setIncludeNode("a");
 HtmlNode h3 = filter.findNode();
 if (h3 != null) {
 System.out.println(h3.getSubNode("a").getContent());
 }
 }
}

运行结果

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

约瑟夫环问题,一段代码求讲解
求推荐一款分享,回复的前端开源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行左右),就采集出了我们想要的数据,要想抓出更多的数据,只要逐层细化分析即可。

  • 两者都是可以用于网页数据抓取,都有良好的扩展性及架构设计,但是由于定位稍有差异,因此在开发的时候各有侧重点,今天就写一篇专门的文章进行比较,由于对WebMagic学习得还不够,因此有些地方可能是错误地,欢迎指正或板砖伺候。 一、扫描方法的差异 a.WebMagic的扫描 ? 1 2 3 4 5 WebMagic采用的是遍地撒网、愿者上勾的方式,怎么解释这个遍地撒网呢? 在进行内容抓取的时候,与事先

  • TinySpider是一个基于Tiny HtmlParser的网络数据抓取框架。 Maven引用坐标: ? 1 2 3 4 5 <dependency> < groupId>org.tinygroup</groupId> < artifactId>tinyspider</artifactId> < version>0.0.12</version> < /dependency> 网络爬虫,一般用在全

 相关资料
  • 在我的硕士论文中,我正在探索通过web自动化从网站中提取数据的可能性。步骤如下: 登录网站(https://www.metal.com/Copper/201102250376) 输入用户名和密码 单击登录 将日期更改为2020年1月1日 刮取生成的表格数据,然后将其保存到csv文件中 用我电脑上的特定名称保存到特定文件夹 运行相同的序列,在同一浏览器窗口的新选项卡中下载其他材料的其他历史价格数据

  • 主要内容:分析url规律,写正则表达式,编写程序代码本节编写一个快速下载照片的程序,通过百度图片下载您想要的前 60 张图片,并将其保存至相应的目录。本节实战案例是上一节《 Python Request库安装和使用》图片下载案例的延伸。 分析url规律 打开百度图片翻页版( 点击访问),该翻页版网址要妥善保留。其 url 规律如下: 百度为了限制爬虫,将原来的翻页版变为了“瀑布流”浏览形式,也就是通过滚动滑轮自动加载图片,此种方式在一定程度上限制了

  • 下面的例子中我们通过tcpdump查看workerman-chat应用通过websocket传输的数据。workerman-chat例子中服务端是通过7272端口对外提供websocket服务的,所以我们抓取7272端口上的数据包。 1、运行命令 tcpdump -Ans 4096 -iany port 7272 2、在浏览器地址栏输入 http://127.0.0.1:55151 3、输入昵称

  • 提示 视频 PPT 下载 背景介绍 在网络编程的过程中,经常需要利用抓包工具对开发板发出或接收到的数据包进行抓包分析。wireshark 是一个非常好用的抓包工具,使用 wireshark 工具抓包分析,是学习网络编程必不可少的一项技能。 准备工作 安装 wireshark 安装 wireshark,一路默认安装就行。程序安装完之后,打开 wireshark 软件。 选择与开发板相对应的网卡 打开

  • 未来你可能会用 Redis 服务器或者其他的消息队列系统来作为 logstash broker 的角色。不过 Logstash 其实也有自己的 TCP/UDP 插件,在临时任务的时候,也算能用,尤其是测试环境。 小贴士:虽然 LogStash::Inputs::TCP 用 Ruby 的 Socket 和 OpenSSL 库实现了高级的 SSL 功能,但 Logstash 本身只能在 SizedQu

  • 完全新的Java和J汤。我试图创建一个简单的程序,刮网络,给我Java股市的数据。我想从道琼斯股票开始,让它打印出52周的区间数据。它转到http://finance.yahoo.com/quote/AAPL?ltr=1,查看左下表(从上一次收盘价开始),然后下到第5个索引,从那里获取文本值。我得到的错误: 线程“main”组织中出现异常。jsoup。选择选择器$SelectorParseExce

  • 问题内容: 我的问题是:如何从网抓取数据,但是直到您单击例如“ Danhsáchchậm”,该数据才显示。我已经非常认真地尝试,当您单击“ Danhsáchchậm”时,这是onclick事件,它触发了一些javascript函数js函数之一是从服务器获取数据并将其插入到标签/占位符中,并在这时,您可以使用firefox之类的方法检查数据,是的,数据会在网页上显示给用户/查看者。因此,我们又该如何

  • 手机设置代理 连接好指定的 wifi 后,点击那个 wifi 里的设置,将「代理」那一项,设置为手动,然后输入ip(电脑上的ip)、端口号(8899)。然后就可以通过电脑上的 whistle 工具,查看手机的网页请求。注意,要保证手机和电脑在同一个网络下。 捕获和拦截https请求 whistle 安装证书后,可以拦截 https 请求。但是,我现在又不想拦截 https 请求了,该怎么卸载证书呢