项目描述
通过爬虫程序去抓取awesome—java项目中上榜的github项目,获取每个项目的主页信息,从而知道该项目的star、fork、open_issue数,最终进行按照star进行排序,并且形成一个直观的柱状图排行榜。实现一个类似于”github趋势”的功能。
项目流程
抓取模块:基于OkHttpClient获取github的页面内容。
分析模块:基于Jsoup分析网页结构,解析出需要的数据。
存储模块:基于MySQL将数据存储到数据库中。
展示模块:基于Echarts通过网页展示抓取到的数据的图表信息。
项目中遇到的问题
1.爬虫次数限制
GitHub的API默认访问次数是每小时60次,都不够爬取一次。因此调用 Github API 获取指定仓库的信息。通过用户名、密码的验证,使得访问次数变为每小时5000次。
2.爬出的github项目不合格
在爬取的过程中,爬取到了一些页面信息,不属于要参与排行的项目。通过设置url黑名单,将这些过滤掉。后续还发现了个别与一般github项目形式不一致的url,通过抛出异常,使得程序能够持续运行下去,不因为报错而停止爬取。
项目优化
打印出了每一个模块所需的时间,找到了性能瓶颈。
获取入口页面 | 解析项目列表时间 | 解析所有项目时间 | 获取数据库时间 | 项目总时间 |
---|---|---|---|---|
5s | 2s | 131 | 3s | 141s |
由表格可知 ,大部分时间都花在了解析项目上,性能最差的是循环调用Github API,因此使用多线程的方式重新组织核心逻辑. 访问 Github API 变成并行式访问。
一个线程 | 五个线程 | 十个线程 | 二十个线程 | 五十个线程 | 一百个线程 |
---|---|---|---|---|---|
141s | 33s | 24s | 13s | 10.5s | 9s |
我们最终确定线程数为20。这样既能大幅度提高项目性能,与更多的线程相比较,线程的开销更少,更为合适。
最后,对整个项目设计了测试用例