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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM