• 使用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)

  • 相关阅读:
    PHP 面试踩过的坑(三)
    明天准备离职了,面对照顾自己的领导,要这样说
    别怕!MySQL引起的CPU消耗过大,我有办法
    值得收藏:一份非常完整的 MySQL 规范(一)
    emacs 快捷键设置 基础知识篇
    Ruby快速入门(三):控制语句
    Ruby快速入门(一):安装、运行、类和对象
    Ruby快速入门(二):变量、数字、数组和运算符
    Ruby快速入门(四):类和模块
    emacs安装autocomplete插件
  • 原文地址:https://www.cnblogs.com/wushenjiang/p/12466025.html
Copyright © 2020-2023  润新知