共计 1000 个字符,预计需要花费 3 分钟才能阅读完成。
最近在学习 springboot,光看官方文档比较枯燥,于是想用一个项目把各种框架和技术串联起来,思来想去觉得爬虫是一个不错的 idea。
大概思路是这样:固定频率去爬取新浪财经的头条新闻,爬到的标题和链接以 json 方式推到 kafka 的 topic 中,再通过 ELK 消费,在 kibana 中查看。
首先通过 Spring Initializr 下载一个 demo 工程,选择我们需要的依赖包,jsoup 的包需要额外添加。
引入到 idea 中,修改 pom 文件,加入 jsoup 依赖,由于习惯了使用 jetty 作为 web 容器,所以把 tomcat 踢掉,引入 jetty 的依赖,为了方便处理 json,引入 fastjson 依赖。
quartz 的使用可以参考官网文档,这里我们通过 mysql 来持久化定时任务相关信息,涉及到 mysql,顺便把 mybatis 和 druid 依赖也一起引入。
quartz 相关表的 sql 在官网的 demo 里可以找到,这里就略过,假设表已建好。springboot 提供了很好的 quartz 支持,自动配置了一个 Scheduler,直接 Autowired 就可以使用,我们新建一个 Service,在系统启动的时候启动爬取新闻的定时任务,代码如下:
假设每 30 分钟爬取一次,我们还需要一个 Job 实现类,来完成具体的爬取任务,也可以通过不同的 job 来分别爬取,这里就不展开了。Job 实现类如下:
在爬网页之前先看一下每个页面的结构,以新浪财经为例,地址:https://finance.sina.com.cn/,查看页面结构可以发现,我们需要的头条新闻都在“m-hdline”这个 class 的 a 标签下,jsoup 的使用比较简单,根据需要查找对应的文档就可以了,直接上代码:
接下来需要将获取到的数据发到 kafka 的 topic 中,我的 win10 是家庭版,天生不带 docker,我又懒得折腾 toolbox,于是搞了个自带的 ubuntu 虚拟机,直接下载 kafka 安装,然后创建一个 topic:financenews。这时候可以将 kafka 的信息配置在我们的工程中,如下:
springboot 也贴心的为我们准备了 KafkaTemplate,Autowired 即可。这里我们还没有搭建好 elk,可以使用直接监听定时任务发送到的 topic 中的消息是否正常。
最后在 job 中添加发送消息到 kafka 的处理:
代码到这里基本差不多了,下面我们启动应用看看效果:
成功。