使用Jsoup进行疫情数据爬取

题目

本题的意思很明确,用java爬取网站的疫情数据,并存到数据库中。我们可以用Jsoup的插件进行java的爬取。

思路分析

效果截图

下为爬取后存到mysql的截图

代码展示

//定义几个常量防止反爬虫

      public static String USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:49.0) Gecko/20100101 Firefox/49.0";

      public static String HOST = "i.snssdk.com";

      public static String REFERER = "https://i.snssdk.com/feoffline/hot_list/template/hot_list/forum_tab.html?activeWidget=1";
      
      public static void main(String[] args) throws IOException, SQLException {
          //根URL

            String url = "https://i.snssdk.com/forum/home/v1/info/?activeWidget=1&forum_id=1656784762444839";

            String resultBody = Jsoup.connect(url).

                userAgent(USER_AGENT).header("Host", HOST).header("Referer", REFERER).execute().body();

            JSONObject jsonObject = JSON.parseObject(resultBody);

            String ncovStringList = jsonObject.getJSONObject("forum").getJSONObject("extra").getString("ncov_string_list");

            JSONObject ncovListObj = JSON.parseObject(ncovStringList);
            JSONArray todaydata = ncovListObj.getJSONArray("provinces");
            QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource());
            String sql = "insert into todaydata_copy1 values(?,?,?,?,?,?,?,?)";
            String confirmedNum,deathsNum,cityname,cityid,treatingNum,provinceid;
            String reprovinceid=null;
            int confirmedNumSum=0,deathsNumSum=0,treatingNumSum=0;
            for(int i=0;i<todaydata.size();i++) {
                JSONObject todayData1 = todaydata.getJSONObject(i);
                String updateDate = todayData1.getString("updateDate");
                JSONArray city = todayData1.getJSONArray("cities");
                for(int j=0;j<city.size();j++) {
                    JSONObject cities = city.getJSONObject(j);
                    confirmedNum= cities.getString("confirmedNum");
                    deathsNum = cities.getString("deathsNum");
                    cityname = cities.getString("name");
                    cityid = cities.getString("id");
                    treatingNum = cities.getString("treatingNum");
                    provinceid = cityid.substring(0,2);
                    reprovinceid=provinceid;
                    confirmedNumSum+=Integer.parseInt(confirmedNum);
                    deathsNumSum+=Integer.parseInt(deathsNum);
                    treatingNumSum+=Integer.parseInt(treatingNum);
                    queryRunner.update(sql, updateDate,provinceid,cityname,confirmedNum,deathsNum,treatingNum,cityid,null);
                }
                queryRunner.update(sql,updateDate,reprovinceid,null,confirmedNumSum,deathsNumSum,treatingNumSum,null,null); 
                confirmedNumSum=0;
                deathsNumSum=0;
                treatingNumSum=0;
            }
          }

实际完成时间表

预估时间:三个小时

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3.10 16:00 16:50 20 30 编码前准备
3.10 16:50 17:50 60 寻找list 这里为了找需要的list浪费了很多时间
3.10 17:50 18:30 10 30 编写代码 中间十分钟去了厕所和接水
3.10 18:30 19:35 5 60 测试 中间五分钟去了厕所
3.10 19:35 19:45 10 进行整理

缺陷记录表

日期 编号 类型 引入阶段 排除阶段 修复时间 修复缺陷 描述
3.10 1 1 编码 编码 50min 蛮找 无法正确找到list
3.10 2 2 编码 测试 10min 存取数据库用的方法错误,错将update方法用成了execute方法
3.10 3 3 编码 测试 20min 改变sql语句 数据库的数据无法正确显示省份

总结

这次使用Jsoup爬取数据,深刻体会到了什么是爬取数据最困难的:找到正确的json并且提取出来。也以此为契机决定使用python爬取一下看看,见下篇博客:
(https://www.cnblogs.com/wushenjiang/p/12466220.html)

猜你喜欢

转载自www.cnblogs.com/wushenjiang/p/12466025.html