从网上爬取全国大学学校数据2020版(最新版,包含大部分常用字段)
1. 文章說明
現在跟教育沾邊的項目基本上都離不開“學校”的數據,而全國大學的數據網上版本也非常之多,下載了很多個版本,浪費了近100點C幣,最終得到的數據都不盡如人意,有些只有學校數據缺少其他重要的字段,有些只有部分學校,缺少很多學校。本篇文章的目的就是為了分享我獲取到的最新的全國大學學校數據,數據非常的豐富,字段多達41個,總共2934所,數據來源:中國教育在線
2. 爬取數據樣例展示
為了讓大家清楚的看到數據本身的樣子,這里給出幾個示例:
| id | 140 | 系統內部自增ID |
| school_id_code | 4111010003 | 學校標識碼,全國唯一 |
| school_code | 10003 | 學校招生代碼,全國唯一 |
| name | 清華大學 | 學校名稱 |
| type | 5000 | 分類編碼 |
| type_name | 綜合類 | 分類名稱 |
| school_type | 6000 | 類型編碼 |
| school_type_name | 普通本科 | 類型名稱 |
| school_nature | 36000 | 性質編碼 |
| school_nature_name | 公辦 | 性質名稱 |
| belong | 教育部 | 隸屬于 |
| f985 | 1 | 是否為985學校 |
| f211 | 1 | 是否未211學校 |
| num_subject | 39 | 重點學科數量 |
| num_master | 66 | 碩士點數量 |
| num_doctor | 58 | 博士點數量 |
| num_academician | 66 | 院士人數 |
| num_library | 400萬 | 藏書數量 |
| num_lab | 61 | 重點實驗室數量 |
| province_id | 11 | 所屬省份編碼 |
| province_name | 北京 | 所屬省份名稱 |
| city_id | 1101 | 所屬市編碼 |
| city_name | 北京市 | 所屬市名稱 |
| county_id | 110108 | 所屬區域編碼 |
| town_name | 海淀區 | 所屬區域名稱 |
| create_date | 1911 | 創辦年份 |
| area | 5886.00 | 學校占地面積,單位:畝 |
| old_name | 原名 | |
| short | 北京清華,清華 | 簡稱 |
| ruanke_rank | 1 | |
| wsl_rank | 1 | |
| qs_rank | 1 | |
| xyh_rank | 2 | |
| dual_class_name | 雙一流 | |
| zsb@mail.tsinghua.edu.cn | 招生辦郵箱 | |
| address | 北京市海淀區清華園1號 | 學校地址 |
| postcode | 100084 | 郵政編碼 |
| site | http://www.join-tsinghua.edu.cn | 招生辦網址 |
| school_site | https://www.tsinghua.edu.cn/publish/thu2018/index.html | 學校官網 |
| phone | 010-62782051,010-62770334 | 招生辦電話 |
| content | 清華大學的前身清華學堂始建于1911年,1912年更名為清華學校,略… | 學校概況 |
說明:上面有4個學校排名字段筆者暫時還沒弄清楚具體是什么維度的排名,如果有知道的可以評論告知一下,不勝感激。
3. 如何爬取
現在把爬取數據的核心代碼分享給大家,筆者使用的是Java程序來爬取的,建議大家如果在爬取的時候也要注意每次爬取的間隔,太小有可能會被認定為惡意請求被限制訪問。
3.1 選取爬取鏈接
爬取地址:https://static-data.eol.cn/www/school/1738/info.json
- 路徑參數1738代表中國教育在線內部系統的id,仔細觀察下教育在線數據可以發現,這個編碼不會太大,如果不放心,可以設置大一點的數據,如3600,用瀏覽器打開鏈接
會發現請求是失敗的,大家可以嘗試一下3500,是有數據返回的。那么就可以通過1-3500來進行循環的爬取,每次爬取是一所學校的詳情。可能有的人會說爬取https://api.eol.cn/gkcx/api/?access_token=&admissions=¢ral=&department=&dual_class=&f211=&f985=&is_dual_class=&keyword=&page=2&province_id=&request_type=1&school_type=&signsafe=&size=20&sort=view_total&type=&uri=apigkcx/api/school/hotlists,筆者最開始是爬取的這個地址,但后來發現,鏈接太復雜,并且返回的數據沒有前者豐富。
3.2 爬取代碼
BufferedWriter writer = new BufferedWriter(new FileWriter(new File("D:/school.txt")));for (int i = 1; i < 3600; i++) {String url = "https://static-data.eol.cn/www/school/1738/info.json";ResponseEntity<String> results = restTemplate.getForEntity(url, String.class);TimeUnit.SECONDS.sleep(1);String result = results.getBody();writer.append(result).append("\n");System.out.println(result);}writer.flush();writer.close();- 說明:我這個爬取分2步,第一步是爬取數據,將數據寫入到D:/school.txt,每所學校的數據以json字符串格式寫入到文件中,每所學校占一行。
3.2 寫入數據庫
首先,將數據從txt文件讀取出來,再拼接成sql語句,重新寫到sql文件中,最后通過navicat寫入到數據庫。這種爬取方式可以支持任何數據庫,只要寫一句insert的模板語句即可。
BufferedReader reader = new BufferedReader(new FileReader("D:/school.txt"));BufferedWriter writer = new BufferedWriter(new FileWriter(new File("D:/school.sql")));String line = null;String sql="INSERT INTO `usercenter_school` (`school_id`, `data_code`, `name`, `type`, `school_type`, `school_nature`, `belong`, `f985`, `f211`, `num_subject`, `num_master`, `num_doctor`, `num_academician`, `num_library`, `num_lab`, `province_id`, `province_name`, `city_id`, `city_name`, `county_id`, `town_name`, `create_date`, `area`, `old_name`, `short`, `ruanke_rank`, `wsl_rank`, `qs_rank`, `xyh_rank`, `level_name`, `type_name`, `school_type_name`, `school_nature_name`, `dual_class_name`, `email`, `address`, `postcode`, `site`, `school_site`, `phone`, `content`) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');";while (true) {line = reader.readLine();if (line == null) {break;}JSONObject detail= JSONObject.parseObject(line);String s=String.format(sql,detail.getString("id"),detail.getString("data_code"),detail.getString("name"),detail.getString("type"),detail.getString("school_type"),detail.getString("school_nature"),detail.getString("belong"),detail.getString("f985"),detail.getString("f211"),detail.getString("num_subject"),detail.getString("num_master"),detail.getString("num_doctor"),detail.getString("num_academician"),detail.getString("num_library"),detail.getString("num_lab"),detail.getString("province_id"),detail.getString("province_name"),detail.getString("city_id"),detail.getString("city_name"),detail.getString("county_id"),detail.getString("town_name"),detail.getString("create_date"),detail.getString("area"),detail.getString("old_name"),detail.getString("short"),detail.getString("ruanke_rank"),detail.getString("wsl_rank"),detail.getString("qs_rank"),detail.getString("xyh_rank"),detail.getString("level_name"),detail.getString("type_name"),detail.getString("school_type_name"),detail.getString("school_nature_name"),detail.getString("dual_class_name"),detail.getString("email"),detail.getString("address"),detail.getString("postcode"),detail.getString("site"),detail.getString("school_site"),detail.getString("phone"),detail.getString("content"));writer.append(s).append("\n");System.out.println(s);}reader.close();writer.flush();writer.close();經過上面的步驟,就已經生成了sql文件,到此也就水到渠成了。
細心的讀者可能已經發現,生成的sql記錄,少了學校標識碼school_id_code和學校代碼school_code字段。從中國教育在線網上爬取的數據中不包含這兩個字段,但筆者提供的數據中是包含這兩個字段的,筆者是從某某網站上下載的數據,經過表連接手段插入的學校標識碼,但還是會有少部分學校不能關聯,因此又從某網站手工的查詢剩余的學校,將標識碼補齊(真的是手工,耗費2小時)。最后是校代碼,校代碼了解的讀者就會知道,校代碼是根據標識碼生成的,因此有了標識碼就自然有了校代碼。
4. 獲取筆者的完整數據
獲取數據方式有兩種:
總結
以上是生活随笔為你收集整理的从网上爬取全国大学学校数据2020版(最新版,包含大部分常用字段)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML网页之日历代码
- 下一篇: jj斗地主服务器维护几点能好使啊,斗地主