題目
本題的意思很明確,用java爬取網站的疫情數據,並存到數據庫中。我們可以用Jsoup的插件進行java的爬取。
思路分析
- 1.如何用Jsoup進行數據的爬取呢,我們首先要找到一個疫情顯示網站,這里我們使用今日頭條的:[今日頭條疫情數據](https://i.snssdk.com/feoffline/hot_list/template/hot_list/forum_tab.html?activeWidget=1),進入網站后用firefox瀏覽器按F12,找到需要的接口即可,這里不再找了。我們發現接口為(https://i.snssdk.com/forum/home/v1/info/?activeWidget=1&forum_id=1656784762444839)
- 2.在找到接口后,我們要分析我們想要的數據在哪,可以用網頁查看js代碼來找到所需的list,我們這里找到是ncov_string_list
- 3.有了基本的list后,我們只需分別取數據並存在數據庫即可
效果截圖
下為爬取后存到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)
