码迷,mamicode.com
首页 > 编程语言 > 详细

【Java爬虫】爬取南通大学教务处成绩

时间:2018-07-29 14:11:28      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:封装数据   on()   array   分析   list   +=   注意   static   null   

没使用自动登录,所以获取是比较麻烦。。

1、http://jwgl.ntu.edu.cn/cjcx    进入官网,进行账号密码登录

技术分享图片

2、点击全部成绩查询(也一定要点进去,不然cookie不会返回值),按F12进入控制台,找到Network,看到了ScoreAllData.aspx

技术分享图片

首先看到Response中能看到返回的json数据,证明我们url找对了。。

技术分享图片

接下来我们需要看request中的数据

技术分享图片

可以看到form data中的start和limit,经过测试,我发现limit只有一个20的值,但是start是可以改变的,所以说换页的时候需要更改start的数据。

还有cookie,登录信息的数据是存在cookie里的(应该是),技术分享图片

获取这个Id的值,用来使用jsoup爬取数据。

3、下面放代码,再进行分析(代码运行的时候,浏览器页面不要关闭,因为是从cookie获取的值,浏览器一关,cookie就 GG)

package com;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import com.edu.utils.DruidUtils;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class Post {
    public static void main(String[] args) throws SQLException {
        List<Score> scoreList = new ArrayList<>();
        try {
            scoreList = post(scoreList);
            QueryRunner qr = new QueryRunner(DruidUtils.getDatasource());
            String sql = "insert into score values(?,?,?,?,?,?,?,?,?,?,?,?)";
            for(Score s:scoreList) {
                qr.update(sql,s.getKcmc(),s.getJsxm(),s.getXq(),s.getXs(),s.getXf(),s.getZpcj(),s.getPscj(),s.getQmcj(),s.getKcsx(),s.getCjid(),s.getKsfsm(),s.getPxcj());
            }    
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static List<Score> post(List<Score> scoreList) throws IOException {
        // 获取请求连接
        Connection con = Jsoup.connect("http://jwgl.ntu.edu.cn/cjcx/Data/ScoreAllData.aspx")
                .cookie("ASP.NET_SessionId","zogqkp55pbsaysrvbhfapi55")
                .referrer("http://jwgl.ntu.edu.cn/cjcx/Main.aspx")
                .ignoreContentType(true)
                .userAgent(
                        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36");
        Document doc = con.post();
        JSONObject jsonObject = JSONObject.fromObject(doc.body().text());
        Integer count = (Integer) jsonObject.get("totalCount");
        for(int i=0;i<count;i+=20) {
            con = Jsoup.connect("http://jwgl.ntu.edu.cn/cjcx/Data/ScoreAllData.aspx")
                    .cookie("ASP.NET_SessionId","zogqkp55pbsaysrvbhfapi55")
                    .referrer("http://jwgl.ntu.edu.cn/cjcx/Main.aspx")
                    .ignoreContentType(true)
                    .userAgent(
                            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.79 Safari/537.36");
            con.data("start",String.valueOf(i));
            con.data("limit","20");
            Document scores = con.post();
            JSONObject scoresObject = JSONObject.fromObject(scores.body().text());
            JSONArray jsonArray = scoresObject.getJSONArray("data");
            Gson g = new Gson();
            List<Score> ps = g.fromJson(jsonArray.toString(), new TypeToken<List<Score>>(){}.getType());
            if(ps!=null) {
                scoreList.addAll(ps);
            }
        }
        return scoreList;
    }
}

Score类是返回data的实体类,用来封装数据。

技术分享图片

通过post方法进行数据的爬取,在Connection对象里进行cookie,userAgent等数据的封装,注意这个cookie里的值是第二步中从控制台获取到cookie值。

使用JsonObject和Gson进行数据的封装,然后再把数据存入本地数据库中。

技术分享图片

 

 4、在JSP中显示或者导出到Excel

 (有空再写)

 

【Java爬虫】爬取南通大学教务处成绩

标签:封装数据   on()   array   分析   list   +=   注意   static   null   

原文地址:https://www.cnblogs.com/yg1024/p/9385009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!