项目描述

通过爬虫程序去抓取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。这样既能大幅度提高项目性能,与更多的线程相比较,线程的开销更少,更为合适。

最后,对整个项目设计了测试用例
项目github_crawler测试

相关文章: