计算机软件技术分享–赠人玫瑰,手遗余香
一、Nutch介绍
What is Apache Nutch?
Apache Nutch is a highly extensible and scalable open source web crawlersoftware project. Stemming from Apache Lucene, the project has diversified and now comprises two codebases, namely:
Nutch 1.x:A well matured, production ready crawler. 1.x enables fine grained configuration, relying on Apache Hadoop data structures, which are great for batch processing.
Nutch 2.x:An emerging alternative taking direct inspiration from 1.x, but which differs in one key area; storage is abstracted away from any specific underlying data store by using Apache Gora for handling object to persistent mappings. This means we can implement an extremely flexibile model/stack for storing everything (fetch time, status, content, parsed text, outlinks, inlinks, etc.) into a number of NoSQL storage solutions.
Being pluggable and modular of course has it\’s benefits, Nutch provides extensible interfaces such as Parse, Index and ScoringFilter\’s for custom implementations e.g. Apache Tika for parsing. Additionally, pluggable indexing exists for Apache Solr, Elastic Search, etc.
Nutch can run on a single machine, but gains a lot of its strength from running in a Hadoop cluster
For more information about Apache Nutch, please see the Nutch wiki.
Nutch is a project of the Apache Software Foundation and is part of the larger Apache community of developers and users.
Nutch 是一个开源Java 实现的搜索引擎。它提供了我们运行自己
的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。
尽管Web搜索是漫游Internet的基本要求, 但是现有web搜索引擎的数目却在下降. 并且这很有可能进一步演变成为一个公司垄断了几乎所有的web搜索为其谋取商业利益.这显然 不利于广大Internet用户.
Nutch为我们提供了这样一个不同的选择. 相对于那些商用的搜索引擎, Nutch作为开放源代码 搜索引擎将会更加透明, 从而更值得大家信赖. 现在所有主要的搜索引擎都采用私有的排序算法, 而不会解释为什么一个网页会排在一个特定的位置. 除此之外, 有的搜索引擎依照网站所付的 费用, 而不是根据它们本身的价值进行排序. 与它们不同, Nutch没有什么需要隐瞒, 也没有 动机去扭曲搜索的结果. Nutch将尽自己最大的努力为用户提供最好的搜索结果.
二、Nutch工作流程
在创建一个WebDB之后(步骤1), “产生/抓取/更新”循环(步骤3-6)根据一些种子URLs开始启动。当这个循环彻底结束,Crawler根据抓取中生成的segments创建索引(步骤7-10)。在进行重复URLs清除(步骤9)之前,每个segment的索引都是独立的(步骤8)。最终,各个独立的segment索引被合并为一个最终的索引index(步骤10)。
其中有一个细节问题,Dedup操作主要用于清除segment索引中的重复URLs,但是我们知道,在WebDB中是不允许重复的URL存在的,那么为什么这里还要进行清除呢?原因在于抓取的更新。比方说一个月之前你抓取过这些网页,一个月后为了更新进行了重新抓取,那么旧的segment在没有删除之前仍然起作用,这个时候就需要在新旧segment之间进行除重。
Nutch和Lucene
Nutch是基于Lucene的。Lucene为Nutch提供了文本索引和搜索的API。
一个常见的问题是:我应该使用Lucene还是Nutch?
最简单的回答是:如果你不需要抓取数据的话,应该使用Lucene。
常见的应用场合是:你有数据源,需要为这些数据提供一个搜索页面。在这种情况下,最好的方式是直接从数据库中取出数据并用Lucene API 建立索引。
在你没有本地数据源,或者数据源非常分散的情况下,应该使用Nutch。
在分析了Crawler工作中设计的文件之后,接下来我们研究Crawler的抓取流程以及这些文件在抓取中扮演的角色。Crawler的工作原理:首先Crawler根据WebDB生成一个待抓取网页的URL集合叫做Fetchlist,接着下载线程Fetcher根据Fetchlist将网页抓取回来,如果下载线程有很多个,那么就生成很多个Fetchlist,也就是一个Fetcher对应一个Fetchlist。然后Crawler用抓取回来的网页更新WebDB,根据更新后的WebDB生成新的Fetchlist,里面是未抓取的或者新发现的URLs,然后下一轮抓取循环重新开始。这个循环过程可以叫做“产生/抓取/更新”循环。
指向同一个主机上Web资源的URLs通常被分配到同一个Fetchlist中,这可防止过多的Fetchers对一个主机同时进行抓取造成主机负担过重。另外Nutch遵守Robots Exclusion Protocol,网站可以通过自定义Robots.txt控制Crawler的抓取。
在Nutch中,Crawler操作的实现是通过一系列子操作的实现来完成的。这些子操作Nutch都提供了子命令行可以单独进行调用。下面就是这些子操作的功能描述以及命令行,命令行在括号中。
1. 创建一个新的WebDb (admin db -create).
2. 将抓取起始URLs写入WebDB中 (inject).
3. 根据WebDB生成fetchlist并写入相应的segment(generate).
4. 根据fetchlist中的URL抓取网页 (fetch).
5. 根据抓取网页更新WebDb (updatedb).
6. 循环进行3-5步直至预先设定的抓取深度。
7. 根据WebDB得到的网页评分和links更新segments (updatesegs).
8. 对所抓取的网页进行索引(index).
9. 在索引中丢弃有重复内容的网页和重复的URLs (dedup).
10. 将segments中的索引进行合并生成用于检索的最终index(merge).
SpringBoot+Uniapp实战开发全新仿抖音短视频App
来百度APP畅享高清图片
获课:chaoxingit.com/3216/
获取ZY↑↑方打开链接↑↑
整合 MinIO 与 Spring Boot 可以让你的应用程序轻松地存储、检索和管理对象存储中的文件。MinIO 是一个高性能的对象存储服务,兼容 Amazon S3 API,非常适合用于存储大量非结构化数据,如图片、视频或其他二进制大对象(BLOBs)。下面是整合 MinIO 与 Spring Boot 的步骤和一些关键点。
准备工作
安装 MinIO:
如果你是首次使用 MinIO,你需要下载并安装 MinIO 服务器。你可以从 MinIO 的官方网站下载适用于你的操作系统的二进制文件,并按照指南进行安装。
启动 MinIO 服务:
在本地测试环境中,你可以使用一条命令来启动 MinIO 服务器,如下所示:
sh
深色版本
minio server /tmp/data
这里 /tmp/data 是你想要用来存储数据的目录路径。
获取访问凭证:
你需要获取 MinIO 的访问密钥(Access Key)和秘密密钥(Secret Key),以便在 Spring Boot 应用程序中配置 MinIO 客户端。
配置 Spring Boot 应用
添加依赖:
在你的 Spring Boot 项目中,你需要添加 MinIO 客户端库的依赖。如果你使用的是 Maven,可以在 pom.xml 文件中添加如下依赖:
xml
深色版本
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
配置 MinIO 客户端:
在 Spring Boot 应用程序中,你可以通过配置文件(如 application.properties 或 application.yml)来配置 MinIO 客户端,如下所示:
properties
深色版本
minio.endpoint=http://localhost:9000
minio.accessKey=minioAccessKey
minio.secretKey=minioSecretKey
创建 MinIO 客户端 Bean:
在 Spring Boot 应用程序中,你可以创建一个 MinIO 客户端的 Bean,以便在整个应用程序享这个客户端实例。
java
深色版本
@Configuration
public class MinioConfig {
@Value(\”${minio.endpoint}\”)
private String endpoint;
@Value(\”${minio.accessKey}\”)
private String accessKey;
@Value(\”${minio.secretKey}\”)
private String secretKey;
@Bean
public MinioClient minioClient() throws IOException {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
使用 MinIO 客户端
创建存储桶:
在使用 MinIO 之前,你需要创建一个存储桶来存放文件。
java
深色版本
@Autowired
private MinioClient minioClient;
// 检查存储桶是否存在,不存在则创建
String bucketName = \”my-bucket\”;
boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
if (!isExist) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
}
上传文件:
使用 MinIO 客户端上传文件到存储桶。
java
深色版本
Path file = Paths.get(\”/path/to/your/file\”);
String objectName = \”file.txt\”;
minioClient.uploadObject(
UploadObjectArgs.builder()
.bucket(bucketName)
.object(objectName)
.filename(file.toFile().getAbsolutePath())
.build());
下载文件:
从存储桶中下载文件。
java
深色版本
String objectName = \”file.txt\”;
try (InputStream stream = minioClient.getObject(
GetObjectArgs.builder().bucket(bucketName).object(objectName).build())) {
Files.copy(stream, Paths.get(\”/path/to/downloaded/file\”), StandardCopyOption.REPLACE_EXISTING);
}
删除文件:
删除存储桶中的文件。
java
深色版本
String objectName = \”file.txt\”;
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());
通过上述步骤,你可以将 MinIO 无缝集成到你的 Spring Boot 应用程序中,以便高效地管理对象存储中的文件。记住要根据实际情况调整配置,并确保处理好异常情况。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。