项目实战 - 多线程网络爬虫与Elasticsearch新闻搜索
用久了简书,就发现过于简单了,无法全文检索,文章也没有目录导航,但是有很多鸡汤。
用 Java 编写一个多线程爬虫,完成 HTTP 请求、模拟登录、Cookie 保存、HTML 解析的工作。在获得数据之后,会将它存入数据库中,并使用 Flyway 从 H2 迁移到 MySQL。当数据增长到一定规模之后,再使用 Elasticsearch 处理和分析数据,并完成一个简单的搜索引擎。
涉及技术:Java/HTTP/JSON/HTML/Cookie/jsoup/IDEA/Flyway/MySQL/Elasticsearch
1. 从零开始做一个项目的原则
待完善...
2. 初始化项目与项目设计流程
GitHub 上开一个新仓库,可以勾选预设的 Java .gitignore 配置、开源协议及 README.md。
初始化:
- mvn archetype
- IDEA -new
- 借鉴
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
clean
和 package
参数是构建阶段,而 dependency:copy-dependencies
是 dependency
插件的一个目标。
所以运行时的顺序是:
先执行 clean lifecycle 的 clean
及 clean
之前的阶段,然后执行 dependency:copy-dependencies
,最后执行 default lifecycle 的 package
及 package
之前的阶段。
以带有连字符单词命名( 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 语句:
最后,使用了 ES 的 Search API 写一个简单的命令行搜索引擎:
image.png