构建网络爬虫?so easy

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

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

框架特性

  1. 强大的节点过滤能力
  2. 支持post与get两种数据提交方式
  3. 避免网页重复处理功能
  4. 支持多站点内容抓取功能
  5. 较强的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-09-13 17:51:39

构建网络爬虫?so easy的相关文章

Python网络爬虫反爬破解策略实战

​​作者:韦玮 转载请注明出处 我们经常会写一 些网络爬虫,想必大家都会有一个感受,写爬虫虽然不难,但是反爬处理却很难,因为现在大部分的网站都有自己的反爬机制,所以我们要爬取这些数据会比较难.但是,每一种反爬机制其实我们都会有相应的解决方案,作为爬虫方的我们,重点需要处理这些反爬机制,所以,今天我们在这里就为大家分析常见的反爬策略以及破解的手段. 1. 知己知彼-常见的反爬策略有哪些? 首先,既然要破解这些常见的反爬策略,就首先需要知道常见的反爬策略有哪些,所谓知己知彼,百战百胜. 常见的反爬策

网络爬虫的实现

摘要-万维网是一个通过HTML格式使数十亿的文件产生联系的集合 ,然后如此规模庞大的数据已经成为信息检索的障碍,用户为了查找自己想要的资料可能要翻转数页.网络爬虫是搜索引擎的核心部分,网页爬虫持续不断的在互联网上爬行来寻找任何新的增加到网络中的页面和已经从网上删除页面.由于网页的持续的增长和动态性,遍历网络中所有的网址并处理已成为一种挑战.一个集中性的爬虫就是一个爬取特定话题,访问并收集相关网页的代理.这篇论文中会讲到我做过的一些网络爬虫的设计来检索版权侵权的工作.我们将用一个种子URL作为输入

【Python爬虫1】网络爬虫简介

调研目标网站背景 1 检查robotstxt 2 检查网站地图 3 估算网站大小 4 识别网站所有技术 5 寻找网站所有者 第一个网络爬虫 1 下载网页 重试下载 设置用户代理user_agent 2 爬取网站地图 3 遍历每个网页的数据库ID 4 跟踪网页链接 高级功能 解析robotstxt 支持代理Proxy 下载限速 避免爬虫陷阱 最终版本 1 调研目标网站背景 1.1 检查robots.txt http://example.webscraping.com/robots.txt # se

一个使用 asyncio 协程的网络爬虫(一)

介绍 经典的计算机科学强调高效的算法,尽可能快地完成计算.但是很多网络程序的时间并不是消耗在计算上,而是在等待许多慢速的连接或者低频事件的发生.这些程序暴露出一个新的挑战:如何高效的等待大量网络事件.一个现代的解决方案是异步 I/O. 这一章我们将实现一个简单的网络爬虫.这个爬虫只是一个原型式的异步应用,因为它等待许多响应而只做少量的计算.一次爬的网页越多,它就能越快的完成任务.如果它为每个动态的请求启动一个线程的话,随着并发请求数量的增加,它会在耗尽套接字之前,耗尽内存或者线程相关的资源.使用

《用Python写网络爬虫》——1.3 背景调研

1.3 背景调研 在深入讨论爬取一个网站之前,我们首先需要对目标站点的规模和结构进行一定程度的了解.网站自身的robots.txt和Sitemap文件都可以为我们提供一定的帮助,此外还有一些能提供更详细信息的外部工具,比如Google搜索和WHOIS. 1.3.1 检查robots.txt 大多数网站都会定义robots.txt文件,这样可以让爬虫了解爬取该网站时存在哪些限制.这些限制虽然仅仅作为建议给出,但是良好的网络公民都应当遵守这些限制.在爬取之前,检查robots.txt文件这一宝贵资源

Java实现爬虫给App提供数据(Jsoup 网络爬虫)_java

一.需求 最近基于 Material Design 重构了自己的新闻 App,数据来源是个问题. 有前人分析了知乎日报.凤凰新闻等 API,根据相应的 URL 可以获取新闻的 JSON 数据.为了锻炼写代码能力,笔者打算爬虫新闻页面,自己获取数据构建 API. 二.效果图 下图是原网站的页面 爬虫获取了数据,展示到 APP 手机端 三.爬虫思路 关于App 的实现过程可以参看这几篇文章,本文主要讲解一下如何爬虫数据. Android下录制App操作生成Gif动态图的全过程 :http://www

实现网络爬虫与搜索引擎技术都需要配备什么样的资源?

问题描述 公司准备做一个关于搜索引擎方面的东西,但是本人对这块不是熟悉,都需要配备什么样的资源,比如人才,软件(开源或商业的,开源优先),硬件,网络等,请大家不吝赐教.大致的要求是能有一个爬虫去一些网站爬数据抓取回来,然后存储在本地.在用搜素技术搜索这些数据和分析这个这些对这些数据进行加工处理,方便用户使用.我们只是要求搜索某一行业的数据,而不是像百度这样可以搜索全网的数据. 解决方案 我以前做过信息检索,写过爬虫解析过网页,可能可以给您一些提示.首先流程正如@y_x 所说,各个阶段需要用到的工

“网络爬虫+相似矩阵”技术运作流程

今日头条这类资讯聚合平台是基于数据挖掘技术,筛选和推荐新闻:"它为用户推荐有价值的.个性化的信息,提供连接人与信息的新型服务,是国内移动互联网领域成长最快的产品服务之一".自从2012年3月创建以来,今日头条至今已经累计激活用户3.1亿,日活跃用户超过3000万. 本文尝试从技术层面分析今日头条的传播机制和相关原理. 网络爬虫:抓取新闻的基本技术 今日头条是一个典型的数据新闻平台,其新闻来源除了合作媒体之外,很大一部分来自于搜索引擎的网络爬虫. 网络爬虫是什么? STEP 1:从互联网

有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取

本文讲的是有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取,[编者的话]Prerender 服务能够为网络爬虫提供预先渲染的动态页面内容,解决了用 JavaScript 框架构建的 Web 站点不支持爬虫抓取的问题.本文详细描述了一种解决方案,尤其是提供了集成 Prerender 服务的 Docker 容器镜像. 如果你正在使用 AngularJS 构建一个面向大众消费者的应用,你肯定希望用户能把它分享到社交媒体上.对于特定的应用而言,丰富的