目录
步骤:
- 获取到所有待收集信息的项目列表
- 遍历项目列表 依次获取到每个项目的主页信息 进一步就可以直到该项目的star数 fork数 issue数
- 把这些数据存储到mysql中
- 写一个简单服务器 来展示数据库中的数据(通过图标的形式 看到一个更直观的效果)
一.获取到所有待收集信息的项目列表
自己写一个爬虫程序,访问Awesome-java这个页面,然后进一步获取这个页面上所有项目链接的信息
1.1观察页面结构
我是先分析页面结构,就是chrom的开发者工具,然后发现Awesome-Java里的项目都是由多个ul标签套着li标签有规律排版的
li就是我想要获取的每一个单独项目
li里面又有个a标签代表着超链接信息,li里面的body部分是这个项目的简单描述信息
1.2分析页面结构
那么观察完 我们就知道Awesome-Java的页面结构了 这样我们就可以写程序来获取这个页面相关信息了
----1.2.1如何获取到页面内容
构造一个http请求发送给服务器,这里我借助了一个第三方库OkHttp的库,用这个库获取到页面
这里我用maven的方式导入
利用OkHttp的库我就可以根据url获取到对应页面的内容,
试着打印一下
import okhttp3.Call;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class crawler {
public static void main(String[] args) throws IOException {
//获取okHttpClient
OkHttpClient okHttpClient = new OkHttpClient();
//创建一个Request对象
Request request = new Request.Builder().url("https://github.com/akullpp/awesome-java/blob/master/README.md").build();
//创建一个call对象,这个对象负载进行一次网络访问操作
Call call = okHttpClient.newCall(request);
//call提交到服务器,返回一个response对象
Response response = call.execute();
//判定响应是否成功
if (!response.isSuccessful()){
System.out.println("请求失败!");
return;
}
System.out.println(response.body().string());
}
}
请求之后返回的内容是一个html结构的内容 看起来还是很复杂的,所以我们需要进一步分析提取我们需要的内容
----1.2.2分析页面结构
用字符串方式分析这个页面结构比较麻烦,这里我用了一个第三方库jsoup来分析html页面结构
用Jsoup这个类分析刚刚得到的html内容,就会生成一个Document对象,把字符串转换成了一个树形结构的文档
文档就可以getElementTag去获取各种标签,每个Element就对应一个标签
每个Element里面的内容就是我们要进行排行的项目的内容啦
这个时候创建一个类来表示项目
public class Project {
private String name;//名称
private String url;//url地址
private String description;//描述
private int stars;//点赞数
private int fork;//贡献人数
private int openIssiue;//bug数或者需求
}
再一一排查后(因为有的li标签并不是代表一个项目,我们需要将它们筛选掉)
排查后一个标签就对应一个个项目的关键信息了
li标签的text是项目的描述Description li标签里嵌套a标签
a标签的text是项目名称,a里的href参数是url
public class Crawler {
private HashSet<String> urlBlackList = new HashSet<>()