使用HttpClient+Json解析器爬取数据并存入数据库

一、题目要求

说明:这里我只展示爬取数据的代码,将可视化结果与统计数据结合,实时显示当前最新数据只需将这篇博客代码和我那篇使用Echarts可视化数据库数据结合即可

二、思路

同学思路:我的大部分同学思路是使用HttpClient+Jsoup获取并解析目标页面的数据,然后调用Dao层中的方法将数据筛选并存入数据库中

我的思路:我直接使用了一个网上的一个最新疫情数据Json的目标网页,然后使用HttpClient获取该Json格式数据,然后使用Json解析器将

数据分离,然后调用Dao层中的方法将数据筛选并存入数据库中。

感想:个人感觉自己懒了一点,但感觉只要完成目的就可以了

三、源代码

Dao.java

package Dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import DBUtil.DBUtil;
import Test.Yione;

public class Dao {

    public boolean add(int id,String provinceName,String confirmeNum,String curesNum, String deathsNum )
       {
             Connection conn = DBUtil.getConn();
             PreparedStatement pstmt = null;
             boolean f = false;
             int a=0;
             try {
                 String sql = "insert into todaydata_copy1(id,provinceName,confirmeNum,curesNum,deathsNum value(?,?,?,?,?)";
                 pstmt = conn.prepareStatement(sql);
                 pstmt.setInt(1, id);
                 pstmt.setString(2, provinceName);
                 pstmt.setString(3, confirmeNum);
                 pstmt.setString(4, curesNum);
                 pstmt.setString(5, deathsNum );
                a = pstmt.executeUpdate();
             }
             catch(SQLException e) {
                 e.printStackTrace();
             }
             finally {
                 DBUtil.close(pstmt, conn);
             }
             if(a>0)
             f=true;

             return f;
       }

}

DBUtil.java(连接池代码,每个人的都有点不同)

package DBUtil;

import java.sql.*;

/**
 * 数据库连接工具
 * @author Hu
 *
 */
public class DBUtil {

    public static String url =  "jdbc:mysql://localhost:3306/yiqing?serverTimezone=UTC";
    public static String user = "root";
    public static String password = "123";

    public static Connection getConn () {
        Connection conn = null;

        try {
            Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
            conn = DriverManager.getConnection(url, user, password);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return conn;
    }

    /**
     * 关闭连接
     * @param state
     * @param conn
     */
    public static void close (PreparedStatement preparedState, Connection conn) {
        if (preparedState != null) {
            try {
                preparedState.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close (ResultSet rs, PreparedStatement preparedState, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (preparedState != null) {
            try {
                preparedState.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭连接
     * @param state
     * @param conn
     */
    public static void close (Statement state, Connection conn) {
        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void close (ResultSet rs, Statement state, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (state != null) {
            try {
                state.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) throws SQLException {
        Connection conn = getConn();
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;
        String sql ="select * from testr";
        preparedStatement = conn.prepareStatement(sql);
        rs = preparedStatement.executeQuery();
        if(rs.next()){
            System.out.println("数据库为空");
        }
        else{
            System.out.println("数据库不为空");
        }
    }
}

Javabean部分代码

package Test;

public class Yione {
 private int id;
 private String provinceName;
 private String confirmeNum;
 private String curesNum;
 private String deathsNum;
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
public String getProvinceName() {
    return provinceName;
}
public void setProvinceName(String provinceName) {
    this.provinceName = provinceName;
}
public String getConfirmeNum() {
    return confirmeNum;
}
public void setConfirmeNum(String confirmeNum) {
    this.confirmeNum = confirmeNum;
}
public String getCuresNum() {
    return curesNum;
}
public void setCuresNum(String curesNum) {
    this.curesNum = curesNum;
}
public String getDeathsNum() {
    return deathsNum;
}
public void setDeathsNum(String deathsNum) {
    this.deathsNum = deathsNum;
}

}

使用HttpClient获取该Json格式数据部分代码

package Test;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

public class getEntity {
    public static String get(){
        //创建客户端
        CloseableHttpClient httpClient = HttpClients.createDefault();

        String entityr = "";
        //创建Get实例
        HttpGet httpGet = new HttpGet("http://www.dzyong.top:3005/yiqing/province");

        //添加请求头的信息,模拟浏览器访问
        httpGet.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0");

        try{
            //获得Response
            CloseableHttpResponse response = httpClient.execute(httpGet);

            if(response.getStatusLine().getStatusCode() == 200){
                //当响应状态码为200时,获得该网页源码并打印
                String entity = EntityUtils.toString(response.getEntity(),"utf-8");
                entityr = entity;
            }

        }catch(Exception e){
            e.printStackTrace();
        }
        return entityr;
    }

}

解析数据并存入数据库的主函数代码

package Test;

import java.util.List;
import com.alibaba.fastjson.JSON;

import Dao.Dao;

public class Demo {

    public static void main(String[] args){
        Dao dao=new Dao();
        String str = getEntity.get();
        int index=str.indexOf("[");
        int index2=str.indexOf("]");
        String str1 = str.substring(index-1,index2+1);
        //字符串序列化成集合
        List<Yione> list= JSON.parseArray(str1,Yione.class);
        for(Yione item: list){
            System.out.println(item.getId() );
            System.out.println(item.getProvinceName());
            System.out.println(item.getConfirmeNum());
            System.out.println(item.getCuresNum());
            System.out.println(item.getDeathsNum());
           dao.add(item.getId(),item.getProvinceName(),item.getConfirmeNum(),item.getCuresNum(),item.getDeathsNum());
        }
    }
}

四、效果展示

由于这个最后效果只是一个写满数据的数据表,就不展示了

五、时间展示

 日期  开始时间  结束时间  中断时间  净时间  活动  备注
 2020-3-10---2020-3-12      15:50  17:25  10分钟 1小时25分钟 学习网络上关于Java爬取的代码    简书上的代码:

https://www.jianshu.com/p/fd5caaaa950d

学习博客:

https://blog.csdn.net/lanxuan1/article/details/77070864

 13:15  16:45  30分钟  3小时   学习使用Jsoup  学习地址:https://cloud.tencent.com/developer/article/1508640
 18:15  19:30  15分钟  1小时   学习Json解析器和使用HttpClient  学习博客地址:

https://www.cnblogs.com/dyf-stu/p/9976241.html

 20:15  22:50  15分钟  2小时30分钟   建数据库和数据表,编写代码 难以确定Json数据中‘[‘和‘]‘的位置,从而导致解析数据错误
 22:55  23:30    35分钟  测试爬取数据代码并完成数据可视化   加上Echarts可视化部分代码

原文地址:https://www.cnblogs.com/yang2000/p/12507667.html

时间: 2024-10-07 19:25:19

使用HttpClient+Json解析器爬取数据并存入数据库的相关文章

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中.并记录日志. xml结构概要如下: <?xml version="1.0" encoding="UTF-8"?> <list> <info> <id>93ef7c7ccc

基于selenium实现自动化爬取数据

基于selenium实现自动化爬取数据 如果想具体查看selenium自动化模块的更多功能请看我的博客测试分类中有介绍 selenium 概念:基于浏览器自动化的模块 自动化:可以通过代码指定一系列的行为动作,然后将其作用到浏览器中. pip install selenium selenium和爬虫之间的关联 1.便捷的捕获到任意形式动态加载的数据(可见即可得) 2.实现模拟登录 谷歌驱动下载:http://chromedriver.storage.googleapis.com/index.ht

Spring MVC4设置使用fastjson作为json解析器,替代jackson

不论是性能.易用性.特性支持,fastjson都要远好于默认的jackson,所以如果应用程序经常使用ajax进行数据交互,建议用fastjson作为默认解析器,只需要简单配置: <mvc:annotation-driven>   <mvc:message-converters register-defaults="true">     <bean class="com.alibaba.fastjson.support.spring.FastJs

如何编写一个JSON解析器

编写一个JSON解析器实际上就是一个函数,它的输入是一个表示JSON的字符串,输出是结构化的对应到语言本身的数据结构. 和XML相比,JSON本身结构非常简单,并且仅有几种数据类型,以Java为例,对应的数据结构是: "string":Java的String: number:Java的Long或Double: true/false:Java的Boolean: null:Java的null: [array]:Java的List<Object>或Object[]: {"

JSON解析器--实现代码

JSON解析器-实现方案 javascript对象表示法(javascript Object Notation,简称JSON)是一个轻量级的数据交换格式,他是基于js的对象字面量表示法. 经过长期的学习和使用,参考相关书籍,编写了一个JSON解析器: 即将它封装成了一个插件  文件名:json_parse.js,如下: var json_parse =function () { //这是一个能json文本解析成js数据结构的函数 //递归降序的解析器 //我们在零一个函数中定义此函数,以避免创建

一起写一个JSON解析器

[本篇博文会介绍JSON解析的原理与实现,并一步一步写出来一个简单但实用的JSON解析器,项目地址:SimpleJSON.希望通过这篇博文,能让我们以后与JSON打交道时更加得心应手.由于个人水平有限,叙述中难免存在不准确或是不清晰的地方,希望大家可以指正:)] 一.JSON解析器介绍 相信大家在平时的开发中没少与JSON打交道,那么我们平常使用的一些JSON解析库都为我们做了哪些工作呢?这里我们以知乎日报API返回的JSON数据来介绍一下两个主流JSON解析库的用法.我们对地址 http://

自己动手实现一个简单的JSON解析器

1. 背景 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.相对于另一种数据交换格式 XML,JSON 有着诸多优点.比如易读性更好,占用空间更少等.在 web 应用开发领域内,得益于 JavaScript 对 JSON 提供的良好支持,JSON 要比 XML 更受开发人员青睐.所以作为开发人员,如果有兴趣的话,还是应该深入了解一下 JSON 相关的知识.本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析器的解析流

借助Chrome和插件爬取数据

工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程中提供了devtools和插件等工具,非常方便使用.在爬取数据的过程中,最常用的应该是开发工具中的Element.Source和Network功能,分别查看DOM结构,源码和网络请求.同时,有很多基于Chrome浏览器的插件又给我们赋予了浏览器级别的能力,来处理数据. TamperMonkey Ta

spring boot2 修改默认json解析器Jackson为fastjson

0.前言 fastjson是阿里出的,尽管近年fasjson爆出过几次严重漏洞,但是平心而论,fastjson的性能的确很有优势,尤其是大数据量时的性能优势,所以fastjson依然是我们的首选:spring boot默认的json解析器是Jackson,替换为fastjson很有必要: 1.替换方法 1.1.引入依赖,[注意,1.2.61以下有严重高危漏洞,1.2.61修复,必须升级到1.2.61,目前最新版本为1.2.62] <!-- fastjson --> <dependency