这个部分是关于我这个爬虫项目的数据存储的实现,关于之前的部分可以在点击目录查看之前博客


目录

  • 一:获取到所有待收集信息的项目列表
  • 二:遍历项目列表,依次获取到每个项目的主页信息,进一步就可以直到该项目的star数、fork数、issue数
  • 三、数据存储之存储(本文)
  • 3.1设计表结构
  • 3.2 DBUtil管理数据库连接
  • 3.3 如何将具体的某个Project(包括它的所有信息)插入到数据库中
  • 3.4将所有爬取到的数据插入到数据库中
  • 四 数据存储之优化


步骤:

  1. 获取到所有待收集信息的项目列表
  2. 遍历项目列表 依次获取到每个项目的主页信息 进一步就可以直到该项目的star数 fork数 issue数
  3. 把这些数据存储到mysql中(本文)
  4. 写一个简单服务器 来展示数据库中的数据(通过图标的形式 看到一个更直观的效果)

一:获取到所有待收集信息的项目列表


二:遍历项目列表,依次获取到每个项目的主页信息,进一步就可以直到该项目的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);
        }

AIRIOT数据库存储设计 数据库存储怎么实现_mysql

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();
            }
        }

四 数据存储之优化