首页 > 编程语言 > 详细

python爬取教务管理系统

时间:2020-03-23 13:50:15      阅读:115      评论:0      收藏:0      [点我收藏+]

昨天学习了简单的爬虫入门,所以临时起意写了一个爬取成绩的爬虫,下面讲述写爬虫全过程,因为刚学爬虫,所以找到了一个老的登录页面,不需要输入验证码

此处隐去学校信息:http://xxxjwc.its.xxu.edu.cn/jsxsd/

成绩页面:http://xxxjwc.its.xxu.edu.cn/jsxsd/kscj/cjcx_list

总体思路:

1、利用账号和密码登录,记录下cookie信息

2、利用cookie信息去访问成绩页面

3、利用xpath获得想要的信息(这一点还没仔细学,粗略了解下,用的可能不够好)

一、获得登录时发送的url

1.1使用浏览器的开发工具

利用Chrome浏览器打开教务管理系统网页,使用F12,点击network,勾选Preserve log

技术分享图片

1.2登录账号密码,利用开发工具找到登录时发送的url(其实可以从网页源代码中看到表单提交的url)

技术分享图片

技术分享图片

然后再headers的最下方from data里面可以看到发送的是一个名为encoded的数据,如下所示

技术分享图片

这并不是常见的账号和密码类型,读取源代码发现内容如下

function submitForm1(){  
        try{
            var xh = document.getElementById("userAccount").value;
            var pwd = document.getElementById("userPassword").value; 
            if(xh==""){
                alert("用户名不能为空!");
                return false;
            }
            if(pwd==""){
                alert("密码不能为空!");
                return false;
            } 
            var account = encodeInp(xh);
            var passwd = encodeInp(pwd);
            var encoded = account+"%%%"+passwd;
            document.getElementById("encoded").value = encoded;
            var jzmmid = document.getElementById("Form1").jzmmid;  
            return true;
        }catch(e){
            alert(e.Message);
            return false;
        }
    }

发现encoded是通过账号和密码加密之后再拼接而成的,这里面的encodedInp()是conwork.js下的一个函数,内容如下:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!‘‘.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return‘\\w+‘};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(‘\\b‘+e(c)+‘\\b‘,‘g‘),k[c]);return p;}(‘b 9="o+/=";p q(a){b e="";b 8,5,7="";b f,g,c,1="";b i=0;m{8=a.h(i++);5=a.h(i++);7=a.h(i++);f=8>>2;g=((8&3)<<4)|(5>>4);c=((5&s)<<2)|(7>>6);1=7&t;k(j(5)){c=1=l}v k(j(7)){1=l}e=e+9.d(f)+9.d(g)+9.d(c)+9.d(1);8=5=7="";f=g=c=1=""}u(i<a.n);r e}‘,32,32,‘|enc4||||chr2||chr3|chr1|keyStr|input|var|enc3|charAt|output|enc1|enc2|charCodeAt||isNaN|if|64|do|length|ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789|function|encodeInp|return|15|63|while|else‘.split(‘|‘),0,{}))

所以我们的账号和密码想要加密就需要自己用python重写这个函数或者直接利用js里面的函数,我选择的是直接利用js里面的函数,需要下载PyExecJS模块,然后导入execjs,账号和密码生成encoded如下:

#对账号密码进行编码

def make_user_token(username, password):
    with open(conwork.js) as f:
        ctx = execjs.compile(f.read())
        username_encode = ctx.call(encodeInp, username)
        password_encode = ctx.call(encodeInp, password)
    token = username_encode + %%% + password_encode
    return token

准备工作完成,下面开始进行登录从而构建cookie

二、登录

因为刚学爬虫,所以就用最基础的东西来写,利用http.cookiejar中CookieJar来获得cookie信息

#1.登录
def get_opener():
    #1.1创建一个cookiejar
    cookierjar = CookieJar()
    #1.2使用cookierjar创建一个HTTPCookieProcess对象
    handler = request.HTTPCookieProcessor(cookierjar)
    #1.3使用上一步创建的handler创建一个opener
    opener = request.build_opener(handler)
    return opener

#1.4使用opener发送登录的请求(账号和密码),目的是得到cookie
def login(opener,encoded):
    data={}
    data[encoded] = encoded
    login_url = http://xxxjwc.its.xxu.edu.cn/jsxsd/xk/LoginToXk
    req = request.Request(login_url,data=parse.urlencode(data).encode(utf-8),headers =headers)
    opener.open(req)

三、访问成绩页面

#2.访问成绩页面
def visit_grade(opener):
    grade_url = http://xxxjwc.its.xxu.edu.cn/jsxsd/kscj/cjcx_list
    req=  request.Request(grade_url,headers=headers)
    resp = opener.open(req)
    return resp.read().decode(utf-8)

四、得到所需成绩信息

获得成绩页面之后,可以利用spilt或者xpath来获得所需要的内容,这里面我选择的是利用xpath来获得成绩信息

    web_data = visit_grade(opener)
    html = etree.HTML(web_data)
    grade_data = html.xpath(.//*[@id="dataList"])#注意这个路径根据自己所需要的路径设置即可

之后再将里面的信息逐个输出即可,具体情况根据自己所需来设定。这里面有个注意点的是,如果你爬取的是table里面的数据,

因为浏览器会对html文本进行一定的规范化,如果路径中存在tbody结果是为空的,去掉xpath中的tbody即可

五、总体效果

技术分享图片

全部代码

from urllib import request,parse
from http.cookiejar import CookieJar
from lxml import etree
import execjs

headers = {
    User-Agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Mobile Safari/537.36
}

#1.登录
def get_opener():
    #1.1创建一个cookiejar
    cookierjar = CookieJar()
    #1.2使用cookierjar创建一个HTTPCookieProcess对象
    handler = request.HTTPCookieProcessor(cookierjar)
    #1.3使用上一步创建的handler创建一个opener
    opener = request.build_opener(handler)
    return opener

#1.4使用opener发送登录的请求(账号和密码),目的是得到cookie
def login(opener,encoded):
    data={}
    data[encoded] = encoded
    login_url = http://xxxjwc.its.xxu.edu.cn/jsxsd/xk/LoginToXk
    req = request.Request(login_url,data=parse.urlencode(data).encode(utf-8),headers =headers)
    opener.open(req)
    
#2.访问成绩页面
def visit_grade(opener):
    grade_url = http://xxxjwc.its.xxu.edu.cn/jsxsd/kscj/cjcx_list
    req=  request.Request(grade_url,headers=headers)
    resp = opener.open(req)
    return resp.read().decode(utf-8)


#对账号密码进行编码

def make_user_token(username, password):
    with open(conwork.js) as f:
        ctx = execjs.compile(f.read())
        username_encode = ctx.call(encodeInp, username)
        password_encode = ctx.call(encodeInp, password)
    token = username_encode + %%% + password_encode
    return token

if __name__ ==__main__:
    username= xxxxxxxx
    password= xxxxxxxxxxxxxxxxx
    encoded = make_user_token(username, password)
    opener = get_opener()
    login(opener,encoded)
    web_data = visit_grade(opener)
    html = etree.HTML(web_data)
    grade_data = html.xpath(.//*[@id="dataList"])
    for i in grade_data[0]:
        n=0
        s=""
        for j in i:
            if n==3:
                s+=j.text
                s+="\t"
            elif n==4:
                s+=j.text
                s+="\t"
            elif n==5:
                for grade in j:
                    s+=grade.text
                    s+="\t"
            elif n==6:
                s+=j.text
                s+="\t"
            n+=1
        print(s)
                
    

一个最基本的爬虫就做好了,当然这个还很简单,随着后期学习的深入,可能会再写文章改进一下这个。

python爬取教务管理系统

原文:https://www.cnblogs.com/caijiyang/p/12551043.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!