CollegeData.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. package spider;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.sql.SQLException;
  5. import java.util.*;
  6. import com.mingxue.spider.helper.StringUtils;
  7. import org.junit.Test;
  8. import com.alibaba.fastjson.JSONArray;
  9. import com.alibaba.fastjson.JSONObject;
  10. import com.mingxue.spider.utils.ApiUtil;
  11. import cn.hutool.core.date.DateUtil;
  12. import cn.hutool.core.io.FileUtil;
  13. import cn.hutool.core.thread.ThreadUtil;
  14. import cn.hutool.core.util.CharsetUtil;
  15. import cn.hutool.db.DbUtil;
  16. import cn.hutool.db.Entity;
  17. import org.slf4j.Logger;
  18. import org.slf4j.LoggerFactory;
  19. import org.springframework.util.CollectionUtils;
  20. public class CollegeData {
  21. private static String host = "https://apiv4.diyigaokao.com";
  22. private List<String> errors = new ArrayList<>();
  23. protected final Logger log = LoggerFactory.getLogger(this.getClass());
  24. Boolean isBatchInsert = false;
  25. @Test
  26. public void test() throws Exception {
  27. // 湖南
  28. ApiUtil.getInstance().login();
  29. collegeList();
  30. // generateNineDate();
  31. // 广东账号:18774924158,密码:123456
  32. // ApiUtil.getInstance().login("18774924158", "123456",false);
  33. // 湖北账号:18674898114, 密码:123456
  34. // ApiUtil.getInstance().login("18674898114", "123456",false);
  35. // 江西账号:13203226079,密码:123456
  36. // ApiUtil.getInstance().login("13203226079", "123456",false);
  37. // collegeList();
  38. // getCategoryMajor();
  39. }
  40. //181
  41. public void collegeList() throws SQLException {
  42. // int count = 0, total = 5000, page = 131;
  43. int count = 0, total = 5000, page = 14;
  44. JSONObject res=new JSONObject();
  45. do {
  46. try {
  47. StringBuilder sb = new StringBuilder(host);
  48. sb.append("/college/list/byMultiple");
  49. sb.append("?provinceIds=&yxjbz=&levels=&collegeType=&hotTags=");
  50. sb.append("&pageIndex=").append(page).append("&pageSize=15");
  51. ThreadUtil.safeSleep(2 * 1000);
  52. res = ApiUtil.getInstance().httpSyncGet(sb.toString());
  53. total = res.getInteger("total");
  54. JSONArray data = res.getJSONArray("data");
  55. int processColledgeCount=0;
  56. for (int i = 0; i < data.size(); i++) {
  57. long start = System.currentTimeMillis();
  58. JSONObject row = data.getJSONObject(i);
  59. final Integer collegeId = row.getInteger("id");
  60. Entity entity = DbUtil.use().get("college", "id", collegeId);
  61. if (null == entity) {
  62. // detail(collegeId, 0);
  63. ThreadUtil.safeSleep(1 * 1000);
  64. }
  65. /**
  66. * 选科数据 xuanke(collegeId);
  67. */
  68. // List<Integer> colledgeIds = Arrays.asList(
  69. // 1211,1212,1213,1214,1215,1216,1217);
  70. // if(colledgeIds.contains(collegeId)){
  71. // continue;
  72. // }
  73. if(processColledgeCount>5){
  74. //超过5个学校换个账号
  75. ApiUtil.getInstance().login();
  76. processColledgeCount=0;
  77. }
  78. /**
  79. * 院校录取数据
  80. */
  81. List<Integer> liberalScienceList= Arrays.asList(1,2);
  82. List<Integer> typeList= Arrays.asList(2,3);
  83. for(Integer liberalScience:liberalScienceList){
  84. for(Integer type:typeList){
  85. byHistoryNew(collegeId,liberalScience,type);
  86. }
  87. }
  88. processColledgeCount++;
  89. ThreadUtil.safeSleep(1 * 1000);
  90. log.error("学校 {}, {}, 耗时{}",collegeId,row.getString("collegeName"),DateUtil.formatBetween(System.currentTimeMillis() - start));
  91. }
  92. log.error("已完成page={}, 开始第{}页" ,page,(page+1));
  93. count = page * 15;
  94. page += 1;
  95. } catch (IOException e) {
  96. e.printStackTrace();
  97. log.error("error res is {}",res);
  98. return;
  99. }
  100. } while (count <= total);
  101. File dir = new File("E:/projects/wangmin/evaluation/code/spider/");
  102. FileUtil.writeLines(errors, new File(dir, ApiUtil.getInstance().getUser().getCode() + ".txt"), CharsetUtil.CHARSET_UTF_8);
  103. System.out.println("执行完成!");
  104. }
  105. /*
  106. * 院校录取数据
  107. * Request URL: https://apiv4.diyigaokao.com/query/collegeScore/byHistoryNew?liberalScience=1&collegeId=1&type=2
  108. * collegeId 院校ID true(必传) integer
  109. * liberalScience 科类: 1理科(物理),0文科(历史), 2文理不分; true integer
  110. * accessToken accessToken令牌 header false string
  111. * phase 批次 false integer
  112. * type 类型,普通省份不传或传1;312院校专业组省份(江苏、湖南、湖北、广东、福建):2021年以后数据传2,2020年以前数据传3 query false integer
  113. */
  114. private void byHistoryNew(Integer collegeId,Integer liberalScience,Integer type) throws IOException {
  115. ThreadUtil.safeSleep(2 * 1000);
  116. StringBuilder sb = new StringBuilder(host);
  117. sb.append("/query/collegeScore/byHistoryNew");
  118. sb.append("?liberalScience=").append(liberalScience);
  119. sb.append("&collegeId=").append(collegeId);
  120. sb.append("&type=").append(type);
  121. JSONObject res = ApiUtil.getInstance().httpSyncGet(sb.toString());
  122. // System.out.println("data is "+res);
  123. if(res.getInteger("error")==0){
  124. //data
  125. JSONObject dataObject = res.getJSONObject("data");
  126. JSONArray tdDatas = dataObject.getJSONArray("tdData");
  127. Set<Entity> subjectList=new HashSet();
  128. for (int i = 0; i < tdDatas.size(); i++) {
  129. //sy_colledge_enroll_data
  130. JSONObject row = tdDatas.getJSONObject(i);
  131. row.put("type",type);
  132. Entity subjectTable4 = Entity.create("sy_colledge_enroll_data");
  133. subjectTable4.putAll(row);
  134. subjectList.add(subjectTable4);
  135. if(!isBatchInsert){
  136. try {
  137. DbUtil.use().insertOrUpdate(subjectTable4, "ID");
  138. } catch (SQLException e) {
  139. e.printStackTrace();
  140. }
  141. }
  142. }
  143. if(isBatchInsert){
  144. try {
  145. if(!CollectionUtils.isEmpty(subjectList)){
  146. DbUtil.use().insert(subjectList);
  147. }
  148. } catch (SQLException e) {
  149. e.printStackTrace();
  150. }
  151. }
  152. }else {
  153. log.error("byHistoryNew res is {}, request is {} ",res,sb.toString());
  154. }
  155. }
  156. /**
  157. * 学校详情
  158. * @param id
  159. * @param retry
  160. */
  161. private void detail(Integer id, Integer retry) {
  162. int maxRetry = 2;
  163. JSONObject res = null;
  164. try {
  165. String url = host + "/college/detail/" + id;
  166. res = ApiUtil.getInstance().httpSyncGet(url);
  167. if (Integer.valueOf(-1).equals(res.getInteger("error"))) {
  168. System.out.println(url);
  169. if (retry >= maxRetry) {
  170. System.out.println("重试" + maxRetry + "次还不够:" + id);
  171. errors.add(url + "\t" + res.getString("data"));
  172. return;
  173. }
  174. ThreadUtil.safeSleep(1 * 1000);
  175. detail(id, retry + 1);
  176. } else {
  177. JSONObject data = res.getJSONObject("data");
  178. data.remove("rankMap");
  179. data.remove("collegeDetailHotMajor");
  180. data.remove("yuanxiList");
  181. Entity record = Entity.create("college");
  182. record.putAll(data);
  183. DbUtil.use().insertOrUpdate(record, "id");
  184. }
  185. } catch (IOException e) {
  186. e.printStackTrace();
  187. } catch (SQLException e) {
  188. e.printStackTrace();
  189. } catch (Exception e) {
  190. e.printStackTrace();
  191. throw e;
  192. }
  193. }
  194. private void xuanke(Integer collegeId) {
  195. List<Integer> years = new ArrayList<Integer>(2);
  196. Integer provinceId = ApiUtil.getInstance().getUser().getProvinceId();
  197. try {
  198. JSONObject res = ApiUtil.getInstance().httpSyncGet(host + "/years?provinceId=" + provinceId + "&queryType=4");
  199. JSONArray rows = res.getJSONArray("data");
  200. for (int i = 0; i < rows.size(); i++) {
  201. years.add(rows.getJSONObject(i).getInteger("year"));
  202. }
  203. } catch (Exception e) {
  204. e.printStackTrace();
  205. }
  206. List<Entity> records = new ArrayList<>(12);
  207. for (Integer year : years) {
  208. int count = 0, total = 100, page = 1;
  209. do {
  210. try {
  211. StringBuilder sb = new StringBuilder();
  212. sb.append(host).append("/xuanke/list/byCollegeId");
  213. sb.append("?provinceId=").append(provinceId);
  214. sb.append("&collegeId=").append(collegeId);
  215. sb.append("&year=").append(year);
  216. sb.append("&page=").append(page).append("&pageSize=30");
  217. JSONObject res = ApiUtil.getInstance().httpSyncGet(sb.toString());
  218. JSONArray rows = res.getJSONArray("data");
  219. for (int i = 0; i < rows.size(); i++) {
  220. JSONObject row = rows.getJSONObject(i);
  221. row.remove("Row");
  222. Entity record = Entity.create("major");
  223. record.putAll(row);
  224. record.set("_provinceId", provinceId).set("_collegeId", collegeId).set("_year", year);
  225. records.add(record);
  226. }
  227. total = res.getInteger("total");
  228. count = page * 30;
  229. page += 1;
  230. } catch (Exception e) {
  231. e.printStackTrace();
  232. }
  233. } while (count <= total);
  234. }
  235. try {
  236. DbUtil.use().del(Entity.create("major").set("CollegeID", collegeId));
  237. DbUtil.use().insert(records);
  238. // DbUtil.use()
  239. } catch (Exception e) {
  240. e.printStackTrace();
  241. }
  242. }
  243. /**
  244. * 获取专业列表
  245. */
  246. public void getCategoryMajor() {
  247. Set<Entity> MajorSubjectList = new HashSet<>();// 一级专业
  248. Set<Entity> MajorCategoryList = new HashSet<Entity>();// 二级专业
  249. Set<Entity> MajorList = new HashSet<Entity>();// 三级专业
  250. try {
  251. JSONObject res = ApiUtil.getInstance().httpSyncGet(host + "/major/allCategoryMajor");
  252. JSONObject data = res.getJSONObject("data");
  253. // JSONArray bk = data.getJSONArray("BK");
  254. JSONArray zk = data.getJSONArray("ZK");
  255. // getData(bk,"本科",MajorSubjectList,MajorCategoryList,MajorList);
  256. MajorSubjectList.clear();// 一级专业
  257. MajorCategoryList.clear();// 二级专业
  258. MajorList.clear();// 三级专业
  259. getData(zk, "专科", MajorSubjectList, MajorCategoryList, MajorList);
  260. } catch (Exception e) {
  261. e.printStackTrace();
  262. }
  263. }
  264. private void getData(JSONArray bk, String Type, Set<Entity> MajorSubjectList, Set<Entity> MajorCategoryList, Set<Entity> MajorList) {
  265. for (int i = 0; i < bk.size(); i++) {
  266. JSONObject Subject = bk.getJSONObject(i);
  267. if ("专科".equalsIgnoreCase(Type)) {
  268. // 专科的ID在本科的基础上增加12
  269. Subject.put("ID", (Subject.getInteger("ID") + 12));
  270. }
  271. Subject.put("Type", Type);
  272. JSONArray CategoryArray = Subject.getJSONArray("Category");
  273. Subject.remove("Category");
  274. Entity subjectTable = Entity.create("sy_major_subject");
  275. subjectTable.putAll(Subject);
  276. MajorSubjectList.add(subjectTable);
  277. System.out.println(Type + ":MajorSubjectList:" + JSONObject.toJSONString(MajorSubjectList));
  278. for (int j = 0; j < CategoryArray.size(); j++) {
  279. JSONObject Category = CategoryArray.getJSONObject(j);
  280. Category.put("MajorSubjectCode", Subject.getString("SubjectCode"));// 上级ID填充下级
  281. Category.remove("MajorSubjectID");// ID转换为code作为关联
  282. Category.put("Type", Type);
  283. if ("专科".equalsIgnoreCase(Type)) {
  284. Category.remove("ID");
  285. }
  286. // System.out.println("before Category:"+Category);
  287. JSONArray MajorArray = Category.getJSONArray("Major");
  288. Category.remove("Major");
  289. // System.out.println("after Category:"+Category);
  290. Entity categoryTable = Entity.create("sy_major_category");
  291. categoryTable.putAll(Category);
  292. MajorCategoryList.add(categoryTable);
  293. for (int k = 0; k < MajorArray.size(); k++) {
  294. JSONObject Major = MajorArray.getJSONObject(k);
  295. Major.put("MajorCategoryCode", Category.getString("MajorCategoryCode"));// 上级ID填充下级
  296. Major.remove("MajorCategoryID");// ID转换为code关联
  297. Major.put("Type", Type);
  298. if ("专科".equalsIgnoreCase(Type)) {
  299. Major.remove("ID");
  300. }
  301. Entity majorTable = Entity.create("sy_major_major");
  302. majorTable.putAll(Major);
  303. MajorList.add(majorTable);
  304. }
  305. }
  306. try {
  307. // DbUtil.use().del(Entity.create("sy_major_subject").set("Type", Type));
  308. DbUtil.use().insert(MajorSubjectList);
  309. MajorSubjectList.clear();
  310. // DbUtil.use().del(Entity.create("sy_major_category").set("Type", Type));
  311. DbUtil.use().insert(MajorCategoryList);
  312. MajorCategoryList.clear();
  313. // DbUtil.use().del(Entity.create("sy_major_major").set("Type", Type));
  314. DbUtil.use().insert(MajorList);
  315. MajorList.clear();
  316. } catch (Exception e) {
  317. e.printStackTrace();
  318. }
  319. }
  320. }
  321. /**
  322. * 随机生成9科数据
  323. */
  324. private void generateNineDate(){
  325. int count = 6000;
  326. // JSONArray majorArray = new JSONArray();
  327. Set<Entity> MajorList = new HashSet<Entity>();
  328. for (int i =0 ;i<count;i++){
  329. Map major=new TreeMap();
  330. major.put("chinese",(int)(100-Math.random()*50));
  331. major.put("math",(int)(100-Math.random()*50));
  332. major.put("english",(int)(100-Math.random()*50));
  333. major.put("physics",(int)(100-Math.random()*50));
  334. major.put("chemistry",(int)(100-Math.random()*50));
  335. major.put("biology",(int)(100-Math.random()*50));
  336. major.put("history",(int)(100-Math.random()*50));
  337. major.put("politics",(int)(100-Math.random()*50));
  338. major.put("geography",(int)(100-Math.random()*50));
  339. Entity majorTable = Entity.create("major_nine");
  340. majorTable.putAll(major);
  341. MajorList.add(majorTable);
  342. // System.out.println(major);
  343. }
  344. try {
  345. DbUtil.use().insert(MajorList);
  346. } catch (SQLException e) {
  347. e.printStackTrace();
  348. }
  349. System.out.println("finished");
  350. }
  351. }