(已解决)JSoup提交表单数据后没有返回需要查询的数据(返回了原网页)

x33g5p2x  于2021-12-28 转载在 其他  
字(4.1k)|赞(0)|评价(0)|浏览(227)

项目需求:获取教务系统中的考试信息:

需要提交的表单数据如下所示:

  1. 创建需要提交的数据:
Map<String, String> datas = new HashMap<>();
datas.put("xnm",String.valueOf(year));
datas.put("xqm",String.valueOf(term * term * 3));
datas.put("ksmcdmb_id","");
datas.put("kch","");
datas.put("kc","");
datas.put("ksrq","");
datas.put("_search","fasle");
datas.put("nd",String.valueOf(new Date().getTime()));
datas.put("queryModel.showCount","15");
datas.put("queryModel.currentPage","1");
datas.put("queryModel.sortName","");
datas.put("queryModel.sortOrder","asc");
datas.put("time","0");

这里注意一定要提交完整,一个都不要少!!

  1. 创建connection对象:
connection = Jsoup.connect(url+ "/jwglxt/kwgl/kscx_cxXsksxxIndex.html?gnmkdm=N358105&layout=default&su=" + stuNum);
connection.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36");
url+ "/jwglxt/kwgl/kscx_cxXsksxxIndex.html?gnmkdm=N358105&layout=default&su=" + stuNum

就是网页最上方的网址。

  1. 传送表单数据并返回我们需要查询的数据
response = connection.cookies(cookies_innet).cookies(cookies).method(Connection.Method.POST)
                .data(datas).ignoreContentType(true).followRedirects(true).execute();
System.out.println(response.body());

打印之后惊奇地发现:返回的竟然不是json格式的字符串数据,也就是说不是我们需要的考试信息数据,而是该网页的网页源代码,并且源代码中也没有需要的考试的信息。

后面尝试了很多方法,比如说把所有的Request Header都加上(上面只弄了User-Agent这一个),去掉Form Data中数值为空白的item等等,始终都没有解决问题。后来在查看Form Data时,发现在Form Data上面有这个东西:

于是又想到网页url里面有gnmkdm和su两项:

url+ "/jwglxt/kwgl/kscx_cxXsksxxIndex.html?gnmkdm=N358105&layout=default&su=" + stuNum

唯独没有doType这一项,接着看到左边Network的Name:

这个url跟

connection = Jsoup.connect(url+ "/jwglxt/kwgl/kscx_cxXsksxxIndex.html?gnmkdm=N358105&layout=default&su=" + stuNum);

中的url区别是:没有了layout=default,多了一个doType=query。 于是我将里面的url换成了含有doType的这个:

connection = Jsoup.connect(url+ "/jwglxt/kwgl/kscx_cxXsksxxIndex.html?doType=query&gnmkdm=N358105&su=" + stuNum);

再次运行并打印:

Map<String, String> datas = new HashMap<>();
datas.put("xnm",String.valueOf(year));
datas.put("xqm",String.valueOf(term * term * 3));
datas.put("ksmcdmb_id","");
datas.put("kch","");
datas.put("kc","");
datas.put("ksrq","");
datas.put("_search","fasle");
datas.put("nd",String.valueOf(new Date().getTime()));
datas.put("queryModel.showCount","15");
datas.put("queryModel.currentPage","1");
datas.put("queryModel.sortName","");
datas.put("queryModel.sortOrder","asc");
datas.put("time","0");

connection = Jsoup.connect(url+ "/jwglxt/kwgl/kscx_cxXsksxxIndex.html?doType=query&gnmkdm=N358105&su=" + stuNum);
connection.header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36");

response = connection.cookies(cookies_innet).cookies(cookies).method(Connection.Method.POST)
                .data(datas).ignoreContentType(true).followRedirects(true).execute();

JSONObject jsonObject = JSON.parseObject(response.body());
JSONArray examTable = JSON.parseArray(jsonObject.getString("items"));

for (Iterator iterator = examTable.iterator(); iterator.hasNext();) {
    JSONObject lesson = (JSONObject) iterator.next();
    System.out.println(lesson.getString("jxbmc") + " " +
                    lesson.getString("kch") + " " +
                    lesson.getString("jsxx") + " " +
                    lesson.getString("cdmc") + " " +
                    lesson.getString("kssj"));
}

这次就返回了我需要的数据,打印如下:

数据结构与算法(1)-0001 00601310 50501250/xxx/副教授 教3B 205 2019-06-17 09:00-11:00
大学物理(1)-0019 00900053 50201721/xxx/副教授 教3B 114 2019-06-19 14:00-16:00
中国近现代史纲要-0009 00700975 50701474/xxx/副教授 教3C 102 2019-06-21 14:00-16:00
学术英语-0007 00801400 50800339/xxx/教授 教3C 101 2019-06-25 14:00-16:00
高等数学B(2)-0013 00900140 50900326/xxx/副教授 教3B 109 2019-06-26 14:00-16:00

相关文章