这个部分是关于我这个爬虫项目的数据存储的实现,关于之前的部分可以在点击目录查看之前博客
目录
- 一:获取到所有待收集信息的项目列表
- 二:遍历项目列表,依次获取到每个项目的主页信息,进一步就可以直到该项目的star数、fork数、issue数
- 三、数据存储之存储(本文)
- 3.1设计表结构
- 3.2 DBUtil管理数据库连接
- 3.3 如何将具体的某个Project(包括它的所有信息)插入到数据库中
- 3.4将所有爬取到的数据插入到数据库中
- 四 数据存储之优化
步骤:
- 获取到所有待收集信息的项目列表
- 遍历项目列表 依次获取到每个项目的主页信息 进一步就可以直到该项目的star数 fork数 issue数
- 把这些数据存储到mysql中(本文)
- 写一个简单服务器 来展示数据库中的数据(通过图标的形式 看到一个更直观的效果)
一:获取到所有待收集信息的项目列表
二:遍历项目列表,依次获取到每个项目的主页信息,进一步就可以直到该项目的star数、fork数、issue数
三、数据存储之存储(本文)
在我的上一篇博客中,我已经将完成了将页面数据分析出来并放到一个ArrayList中
然后接下来我们就要做数据存储的过程 这里我用的数据库是mysql
3.1设计表结构
设计表结构
create table project_table(
project_name varchar(50),
project_url varchar (50),
project_description varchar (1024),
stat_count int,
fork_count int,
openIssue_count int,
data varchar (128)
);
紧接着我就在我的数据库里插入创建这张表啦
3.2 DBUtil管理数据库连接
public class DBUtil {
private static String USERNAME = "root";
private static String PASSWORD = "123456";
private static volatile DataSource dataSource = null;
private DBUtil(){
}
//线程不安全
private static DataSource getDataSource(){
if (dataSource == null) {
synchronized (DBUtil.class) {
if (dataSource == null) {
dataSource = new MysqlDataSource();
MysqlDataSource mysqlDataSource = (MysqlDataSource) dataSource;
mysqlDataSource.setServerName("127.0.0.1");
mysqlDataSource.setPort(3306);
mysqlDataSource.setUser(USERNAME);
mysqlDataSource.setPassword(PASSWORD);
mysqlDataSource.setDatabaseName("java_github_crawler");
mysqlDataSource.setUseSSL(false);
mysqlDataSource.setCharacterEncoding("utf8");
}
}
}
return dataSource;
}
public static Connection getConnection() {
try {
return getDataSource().getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void close(Connection connection,
PreparedStatement statement, ResultSet resultSet){
try {
if (resultSet != null) {
resultSet.close();
}
if (statement!= null) {
statement.close();
}if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
那么在数库中创建好了表,并且有了数据库连接,我们就可以将项目的所有信息插入到我们的数据库中啦
3.3 如何将具体的某个Project(包括它的所有信息)插入到数据库中
1.获取数据库连接
2.构造PrepareStatement对象拼装sql
3.执行SQL语句完成数据库插入
package dao;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ProjectDao {
public void save(Project project){
//1.获取数据库连接
Connection connection = DBUtil.getConnection();
PreparedStatement statement = null;
String sql = "insert into project_table(project_name,project_url,project_description,stat_count,fork_count,openIssue_count,data) " +
"values(? ,? ,? ,? ,? ,? ,? )";
try {
//2.构造PrepareStatement对象拼装sql
statement = connection.prepareStatement(sql);
statement.setString(1,project.getName());
statement.setString(2,project.getUrl());
statement.setString(3,project.getDescription());
statement.setInt(4,project.getStars());
statement.setInt(5,project.getFork());
statement.setInt(6,project.getOpenIssiue());
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("YYYY-MM-dd");
String dateFormat = simpleDateFormat.format(new Date().getTime());
statement.setString(7,dateFormat);
//3.执行SQL语句完成数据库插入
int ret = statement.executeUpdate();
if (ret != 1){
System.out.println("插入数据库失败");
return;
}
System.out.println("插入数据库成功");
} catch (SQLException e) {
e.printStackTrace();
}
finally {
DBUtil.close(connection,statement,null);
}
}
}
我们可以简单的试验一下,从project中拿5个插入到数据库中试一下
ProjectDao dao = new ProjectDao();
for (int i = 0; i < projects.size() && i < 5; i++) {
Project project = projects.get(i);
String repoName = crawler.getRepoName(project.getUrl());
//调用API
String jsonString = crawler.getRepoInfo(repoName);
crawler.parseRepoInfo(jsonString,project);
dao.save(project);
}
bug1:但是在把所有数据插入到数据库的过程中,还是有一些不符合我要求的项目,那么我们就没有按照Github上
提供的API去访问他们,
bug2:就算访问到,他返回的jsonString里面也没有我想要的内容,这部分就需要特殊处理下,如果遇到这个情况,我们只要跳过就行了
3.4将所有爬取到的数据插入到数据库中
for (int i = 0; i < projects.size() ; i++) {
try {
Project project = projects.get(i);
System.out.println("正在爬 " + project.getName()+ "...");
String repoName = crawler.getRepoName(project.getUrl());
//调用API
String jsonString = crawler.getRepoInfo(repoName);
crawler.parseRepoInfo(jsonString,project);
dao.save(project);
System.out.println("抓取 " + project.getName() + " 完成");
} catch (IOException e) {
e.printStackTrace();
}
}
四 数据存储之优化