Java 热门应用龙虎榜

1.项目需求

随着我对 Java 语言的深入学习,我发现 Java 不仅仅是一门语言,还是一套日趋成熟的技术体系.我渐渐地明白了对语言的学习不能只停留在语言本身,还要钻研其背后的技术体系.于是我就想尽可能多的搜集一些有关 Java 的知识和技术.通过老师的介绍我知道了 GitHub 上有一个名叫 Awesome Java 的项目(一个罗列了大量当前热门 Java 应用的项目),同时也由于 GitHub 的特殊性(对用户提供爬虫 api),所以最终我决定做一个有关 Java 热门应用的龙虎榜.

2.项目介绍

此项目以 Awesome Java 项目(GitHub项目)为目录索引,利用爬虫机制爬取该项目所陈列的各种 Java 热门应用基础信息(url、star、fork等),并通过 star 的数量比较进行排行展示(柱状图)。

3.项目思路

(1) 首先观察该项目的网页结构如下:
Awesome Java 项目网页结构
通过观察其网页结构可以得到如下信息:
a.同类型的上榜项目都属于同一个无序表,表中元素为一个一个的 li 标签;
b.每一个上榜项目的项目名都是一个链接(即 a 标签中的 text 部分是项目名);
至此我们可以考虑通过访问页面获取页面返回结果,通过解析返回结果的 a 标签和 li 标签获取上榜项目的仓库名, url, 项目描述等信息并对这些信息进行封装.
上述过程中使用到的技术主要有 okhttp3 、jsoup 和 gson.其中 okhttp3 负责页面请求和获取响应数据, jsoup 则负责以 DOM 文档的格式解析响应数据,获取每个上榜项目的基本信息;
(2) 通过(1)中的操作已经获取了 Awesome Java 项目所陈列的所有合法上榜项目(通过观察页面还是有一些不合法的上榜项目或非项目内容会被读取到,稍后讲解处理),以及各子项的封装实例.此时所要进行的操作是将所有封装实例的基本信息进行持久化存储,即将信息保存到数据库中.本次我采用的是 mysql 数据库,利用 jdbc 对数据库实现连接,查询和存储操作;
(3) 当数据准备就绪后,就可以进行最后的图表展示模块了,即通过网页来显示抓取信息的图表.这里面涉及到一些前端的知识: echarts 进行图表绘制, ajax 实现异步请求等.
最终结果如下:
在这里插入图片描述

4.项目难点

难点一:
现在的网站一般都有反爬虫机制,所以如何绕过网站的反爬虫机制应该算是一大难点,首先要明白的是反爬虫技术如果应用不当,可能会产生很严重的后果-----服务器宕机.这无疑是要负法律责任的,所以我们可以优先考虑网站所提供的爬虫 api.令人庆幸的是,GitHub 有属于自己的爬虫 api,我们可以直接使用该 api 获取自己想要的数据.
难点二:
有的网站规定了同一个客户端在一段时间内所能请求资源的最大数量,这对爬虫项目来说无疑是一大制约,如何解决这个问题要着重考虑.这在本项目中的处理方法是通过在请求头中添加身份验证信息.成功验证后,就可以有 5000 次的访问机会.
难点三:
通过对最初版本的测试发现,程序运行的大量时间都花费在了页面的请求和等待响应上,所以可以针对其进行性能优化.优化最简单直接的方法就是使用多线程实现每个上榜项目的异步请求和响应等待(我使用了线程池).

5.项目评价

优点:
1.由于有 GitHub 原生 api 的支持,所以省去了反爬虫的技术,使得爬虫项目更加简单和整洁;
2.采用线程池技术,实现了异步处理网页请求和等待响应,大大节约了程序的执行时间;
3.将数据处理,数据控制和视图展示分离以及 maven的使用,简化了开发的复杂程度,提高开发效率.

缺点:
1.由于是通过原生 api 进行爬取,所能爬取的数据内容和数据形式都是固定的,无法进行添加和删减;
2.由于判断是否属于上榜项目的方法是单一的,简单的,所以可能存在漏掉的上榜项目或不是上榜项目的内容被选择.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值