Java 之旅

项目实战 - 多线程网络爬虫与Elasticsearch新闻搜索

2019-11-25  本文已影响0人  晓风残月1994

用久了简书,就发现过于简单了,无法全文检索,文章也没有目录导航,但是有很多鸡汤。

本文语雀对应地址


用 Java 编写一个多线程爬虫,完成 HTTP 请求、模拟登录、Cookie 保存、HTML 解析的工作。在获得数据之后,会将它存入数据库中,并使用 Flyway 从 H2 迁移到 MySQL。当数据增长到一定规模之后,再使用 Elasticsearch 处理和分析数据,并完成一个简单的搜索引擎。

涉及技术:Java/HTTP/JSON/HTML/Cookie/jsoup/IDEA/Flyway/MySQL/Elasticsearch

GitHub 项目地址

1. 从零开始做一个项目的原则

待完善...

2. 初始化项目与项目设计流程

GitHub 上开一个新仓库,可以勾选预设的 Java .gitignore 配置、开源协议及 README.md。

初始化:

3. Maven 生命周期与使用

官方文档地址

3.1 Build Lifecycle 基础

Maven 基于构建生命周期这一核心概念,有三个内置的 build lifecycles:default,clean 和 site。

build lifecycle 由 不同的 build phase 组成,一个 build phase 对应着 build lifecycle 的一个阶段, 其会依次执行。

build phase 由不同的 plugin goal 组成,通过声明 plugin goal 与 build phase 的绑定来具体的实现在生命周期执行中一些特定任务。

一个插件目标可以绑定到 0 或多个构建阶段上,如果不绑定到任何构建阶段上,也可以在生命周期之外单独调用执行;如果绑定到多个构建阶段上,那该插件目标会分别在这些阶段中被执行。
更进一步,一个构建阶段可以和 0 或多个插件目标相绑定,如果没和任何插件目标相绑定,则该构建阶段将不会被执行,但如果和多个目标相绑定,则会执行所有这些目标。
具体执行顺序的例子如下:

mvn clean dependency:copy-dependencies package

cleanpackage 参数是构建阶段,而 dependency:copy-dependenciesdependency 插件的一个目标。
所以运行时的顺序是:
先执行 clean lifecycle 的 cleanclean 之前的阶段,然后执行 dependency:copy-dependencies ,最后执行 default lifecycle 的 packagepackage 之前的阶段。

以带有连字符单词命名( pre-*post-*process-* )的构建阶段通常并不直接从命令行中调用,而是在构建过程中内部调用,用于生成对外部来说没什么可用性的中间结果。

3.2 使用

在内建的生命周期中,有些构建阶段会和某些内置插件目标进行默认的绑定,具体有哪些绑定,取决于 <packaging> 值(默认 jar )。

所以使用方法一是设置 <packaging> 值,触发一些构建阶段的默认插件及其默认绑定。

二是在 pom.xml 文件中进行插件配置,一个插件可能会有多个目标,可以分别指定目标和想要绑定的阶段。

4. 使用 H2 数据库实现数据存储与断点续传

4.1 数据库表设计

LINKS_TO_BE_PROCESSED
link

LINKS_ALREADY_PROCESSED
link

NEWS
id
title
content
url
created_at
updated_at

5. 使用 Flyway 数据库自动化迁移工具(v0.1)

数据库解构的版本管理工具,实现新建和数据迁移自动化。
照着官网引入 maven,并且安装约定的目录结构和文件命名写好 SQL 语句:

image.png

最后,使用了 ES 的 Search API 写一个简单的命令行搜索引擎:

image.png

GitHub 项目地址

上一篇下一篇

猜你喜欢

热点阅读