2月10日寒假总结

爬取新型冠状病毒疫情信息。并生成echarts疫情分布地图

主要爬取代码如下:

package type;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class HtmlParser {
    public static void main(String args[])
    {
        StringHandle sh=new StringHandle();
        FileHandle fh=new FileHandle();
        String infos=getURLInfo("https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_="+System.currentTimeMillis(),"utf-8");
        infos=infos.replaceAll("\\\\", "");
        infos=infos.replaceAll("\\\"\\{", "{");
        infos=infos.replaceAll("\\}\"", "}");
        infos=infos.replaceAll("(\\{|\\}|,)", "\r\n$1\r\n");
        List<String> list=sh.getExpString("\\{[\\s\\S]*\\}", infos);
        infos=list.get(0);
        
        System.out.println(infos);
        fh.outFile(infos, "C:\\Users\\Halo\\Desktop\\大学决定\\寒假作业\\网页爬取\\test1.txt", false);
        
        JsonParser parse =new JsonParser();  //创建json解析器
        JsonObject json=(JsonObject) parse.parse(infos);  //创建jsonObject对象
        JsonObject paramzObject = json.getAsJsonObject("data");
        String date=paramzObject.get("lastUpdateTime").getAsString();
        Date dateD = new Date();
        try {
            dateD = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        date = new SimpleDateFormat("yyyy-MM-dd").format(dateD);
        
        
        ClassService service=new ClassService();
        
        JsonArray paramzObjectatc = paramzObject.getAsJsonArray("areaTree");
        //JsonArray paramzObjectatc = paramzObjectat.getAsJsonArray("name");
        for (int j = 0; j < paramzObjectatc.size(); j++) 
        {
            JsonObject sonObjectj = (JsonObject) paramzObjectatc.get(j);
            String countryname = sonObjectj.get("name").getAsString();
            if(!countryname.equals("中国"))
                continue;
            JsonArray feedsArray = sonObjectj.getAsJsonArray("children");
            for (int i = 0; i < feedsArray.size(); i++) 
            {
                JsonObject sonObject = (JsonObject) feedsArray.get(i);
                String name = sonObject.get("name").getAsString();
                JsonObject today = sonObject.getAsJsonObject("today");
                JsonObject total = sonObject.getAsJsonObject("total");
                
                String today_confirm = today.get("confirm").getAsString();
                String today_suspect =today.get("suspect").getAsString();
                String today_dead =today.get("dead").getAsString();
                String today_heal =today.get("heal").getAsString();
                
                
                String total_confirm = total.get("confirm").getAsString();
                String total_suspect =total.get("suspect").getAsString();
                String total_dead =total.get("dead").getAsString();
                String total_heal =total.get("heal").getAsString();
                service.add("yiqinprovince", new String[] {"province","today_confirm","today_suspect","today_dead","today_heal","total_confirm","total_suspect","total_dead","total_heal","date"},new String[]{name,today_confirm,today_suspect,today_dead,today_heal,total_confirm,total_suspect,total_dead,total_heal,date});
                
                
                JsonArray cityArray = sonObject.getAsJsonArray("children");
                for(int z=0;z<cityArray.size();z++)
                {
                    JsonObject city=(JsonObject) cityArray.get(z);
                    String cityname = city.get("name").getAsString();
                    JsonObject ctoday = city.getAsJsonObject("today");
                    JsonObject ctotal = city.getAsJsonObject("total");
                    
                    String ctoday_confirm = ctoday.get("confirm").getAsString();
                    String ctoday_suspect =ctoday.get("suspect").getAsString();
                    String ctoday_dead =ctoday.get("dead").getAsString();
                    String ctoday_heal =ctoday.get("heal").getAsString();
                    
                    
                    String ctotal_confirm = ctotal.get("confirm").getAsString();
                    String ctotal_suspect =ctotal.get("suspect").getAsString();
                    String ctotal_dead =ctotal.get("dead").getAsString();
                    String ctotal_heal =ctotal.get("heal").getAsString();
                    
                    service.add("yiqin", new String[] {"province","city","today_confirm","today_suspect","today_dead","today_heal","total_confirm","total_suspect","total_dead","total_heal","date"},new String[]{name,cityname,ctoday_confirm,ctoday_suspect,ctoday_dead,ctoday_heal,ctotal_confirm,ctotal_suspect,ctotal_dead,ctotal_heal,date});
                }
            }
        }
    }
    
    
    
    public static String getURLInfo(String urlInfo,String charset){
        //读取目的网页URL地址,获取网页源码
        URL url=null;
        StringBuilder sb=null;
        try {
            url = new URL(urlInfo);
            HttpURLConnection httpUrl = (HttpURLConnection)url.openConnection();
            InputStream is = httpUrl.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is,charset));
             sb = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                //这里是对链接进行处理
                //line = line.replaceAll("</?a[^>]*>", "");
                //这里是对样式进行处理
                //line = line.replaceAll("<(\\w+)[^>]*>", "<$1>");
                sb.append(line);
            }
            is.close();
            br.close();
            //获得网页源码
        } catch ( IOException e) {
            // TODO 自动生成的 catch 块
            e.printStackTrace();
        }
        
        return sb.toString().trim();
    }
}

Eharts网页的代码如下:

<!DOCTYPE html>
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page language="java" import="java.util.*"%>
<%@ page language="java" import="type.*"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>ECharts</title>
    <!-- 引入 echarts.js -->
    <script src="echarts2/echarts-all.js"></script>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .echarts{
            width:100%;
            height: 100%;
            position: absolute;
        }

</style>
</head>
<body>
    <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    <div id="main" style="width: 100%;height:100%;" class="echarts"></div>
    <script type="text/javascript">
        // 基于准备好的dom,初始化echarts实例
        <% ClassService service=new ClassService();
        List<List<String>> yiqin=service.list("yiqin");
        List<List<String>> yiqinprovince=service.list("yiqinprovince");
        %>
        var myChart = echarts.init(document.getElementById('main'));
        var option=null;
        // 指定图表的配置项和数据
        var ecConfig = echarts.config;
        var zrEvent = zrender.tool.event;
        var curIndx = 0;
        var mapType = [
            'china',
            // 23个省
            '广东', '青海', '四川', '海南', '陕西', 
            '甘肃', '云南', '湖南', '湖北', '黑龙江',
            '贵州', '山东', '江西', '河南', '河北',
            '山西', '安徽', '福建', '浙江', '江苏', 
            '吉林', '辽宁', '台湾',
            // 5个自治区
            '新疆', '广西', '宁夏', '内蒙古', '西藏', 
            // 4个直辖市
            '北京', '天津', '上海', '重庆',
            // 2个特别行政区
            '香港', '澳门'
        ];
        document.getElementById('main').onmousewheel = function (e){
            var event = e || window.event;
            curIndx += zrEvent.getDelta(event) > 0 ? (-1) : 1;
            if (curIndx < 0) {
                curIndx = mapType.length - 1;
            }
            var mt = mapType[curIndx % mapType.length];
            if (mt == 'china') {
                option.tooltip.formatter = '滚轮切换或点击进入该省<br/>{b}';
            }
            else{
                option.tooltip.formatter = '滚轮切换省份或点击返回全国<br/>{b}';
            }
            option.series[0].mapType = mt;
            option.title.subtext = mt + ' (滚轮或点击切换)';
            myChart.setOption(option, true);
            
            zrEvent.stop(event);
        };
        myChart.on(ecConfig.EVENT.MAP_SELECTED, function (param){
            var len = mapType.length;
            var mt = mapType[curIndx % len];
            if (mt == 'china') {
                // 全国选择时指定到选中的省份
                var selected = param.selected;
                for (var i in selected) {
                    if (selected[i]) {
                        mt = i;
                        while (len--) {
                            if (mapType[len] == mt) {
                                curIndx = len;
                            }
                        }
                        break;
                    }
                }
                option.tooltip.formatter = '滚轮切换省份或点击返回全国<br/>{b}';
                option.dataRange.max=10;
            }
            else {
                curIndx = 0;
                mt = 'china';
                option.tooltip.formatter = '滚轮切换或点击进入该省<br/>{b}';
                option.dataRange.max=2000;
            }
            option.series[0].mapType = mt;
            option.title.subtext = mt + ' (滚轮或点击切换)';
            myChart.setOption(option, true);
        });
        
        option = {
            title: {
                text : '全国34个省市自治区',
                subtext : 'china (滚轮或点击切换)'
            },
            tooltip : {
                trigger: 'item',
                formatter: '滚轮切换或点击进入该省<br/>{b}'
            },
            legend: {
                orient: 'vertical',
                x:'right',
                data:['疫情地图','全国地图'],
                selectedMode: 'single',
                selected:{
                    '全国地图':false
                }
            },
            dataRange: {
                min: 0,
                max: 2000,
                color:['red','orange','yellow','lightgreen'],
                text:['严重','正常'],           // 文本,默认为数值文本
                calculable : true
            },
            series : [
                {
                    name: '疫情地图',
                    type: 'map',
                    mapType: 'china',
                    selectedMode : 'single',
                    itemStyle:{
                        normal:{label:{show:true}},
                        emphasis:{label:{show:true}}
                    },
                    data:[
                        <%for(int i=0;i<yiqin.size();i++){%>
                        {name: '<%=yiqin.get(i).get(1)+"市"%>',value:<%=yiqin.get(i).get(2)%>},
                        {name: '<%=yiqin.get(i).get(1)+"自治州"%>',value:<%=yiqin.get(i).get(2)%>},
                        {name: '<%=yiqin.get(i).get(1)+"地区"%>',value:<%=yiqin.get(i).get(2)%>},
                        {name: '<%=yiqin.get(i).get(1)+"林区"%>',value:<%=yiqin.get(i).get(2)%>},
                        {name: '<%=yiqin.get(i).get(1)+"区"%>',value:<%=yiqin.get(i).get(2)%>},
                        {name: '<%=yiqin.get(i).get(1)%>',value:<%=yiqin.get(i).get(2)%>},
                        <%}%>
                        <%for(int i1=0;i1<yiqinprovince.size();i1++){%>
                        {name: '<%=yiqinprovince.get(i1).get(0)%>',value:<%=yiqinprovince.get(i1).get(1)%>}
                        <%if(i1!=yiqinprovince.size()-1){%>
                                        ,
                        <%}
                        }%>
                      
                    ]
                },
                {
                    name: '全国地图',
                    type: 'map',
                    mapType: 'china',
                    selectedMode : 'single',
                    itemStyle:{
                        normal:{label:{show:true}},
                        emphasis:{label:{show:true}}
                    },
                    data:[
                        
                        
                      
                    ]
                }
            ]
        };
                            
                                
        
        // 使用刚指定的配置项和数据显示图表。
        myChart.setOption(option);
    </script>
</body>
</html>

此次实验截图:

 

 

猜你喜欢

转载自www.cnblogs.com/halone/p/12292490.html