python3爬虫实战-requests+beautifulsoup-杭电自动学科教学评价

python3爬虫实战之三
每学期都要对老师的教学质量进行评价,emmm,老师们都很棒,但评价很繁琐,,就写了个爬虫脚本自行评价,不是a就是b
环境先安装requests库、beautifulsiup库
友情链接,前段js评价方法: https://blog.csdn.net/lxfhahaha/article/details/72638659
看心情,啥时候补个详细步骤介绍,如果我有动力的话= =

hdu_spider.py

#  coding:utf-8 
##  自动登录数字杭电-选课系统--自动教学评价
##  先安装环境python3、pip环境
##  pip3 install requests
##  pip3 install BeautifulSoup4
##  sudo apt-get install python3-lxml 或者 pip3 install lxml
##  然后运行即可  python3 hdu_spider.py
##  测试环境为win10-python3
##  author: lxfhahaha
##  date: 2018年5月27日13:59:21


import  requests
from bs4 import BeautifulSoup
import re
import sys,io,os
import hashlib
import random





##登录进入数字杭电后台的方法,返回最后进去后的requests对象+session对象
def loginToHDU(headers,conn):
    ##进入初始的登录界面
    urlInital='http://cas.hdu.edu.cn/cas/login?service=http%3A%2F%2Fi.hdu.edu.cn%2Fdcp%2Findex.jsp'
    r1=conn.get(urlInital,headers=headers)                 ## 初始页面
    lt=re.search('name=\"lt\"\svalue=\"(.*?)\"',r1.text)    ## 获得一直在变化的‘lt’值
    username=input('请输入您的学号:')
    password=input('亲输入您的密码:')


    # os.system('cls')

    # 创建md5对象
    hl = hashlib.md5()

    # Tips
    # 此处必须声明encode
    # 若写法为hl.update(str)  报错为: Unicode-objects must be encoded before hashing
    hl.update(password.encode(encoding='utf-8'))
    password=hl.hexdigest()
    formData={
        'encodedService': 'http%3a%2f%2fi.hdu.edu.cn%2fdcp%2findex.jsp',
        'service': 'http://i.hdu.edu.cn/dcp/index.jsp',
        'serviceName': None,
        'loginErrCnt': '0',
        'username': username,
        'password': password,
        'lt': lt.group(1)
    }



    ####login的post提交
    urlLogin='http://cas.hdu.edu.cn/cas/login'      


    r2=conn.post(urlLogin,headers=headers,data=formData)
    if len(r2.cookies)!=0:
        print ('登陆成功,等待爬取数据...')
        # print ({c.name: c.value for c in r2.cookies})
        # f=open('test.html','w+')
        # f.writelines(r2.text)
        # f.close()
    else:
        print ('账户错误,重新输入!')
        return None




    ####登录提交后的第一次页面跳转
    ticket=re.search('ticket=(.*?)\"',r2.text)
    urlRedirct='http://i.hdu.edu.cn/dcp/index.jsp?ticket='+ticket.group(1)
    # print(urlRedirct)
    r3=conn.get(urlRedirct,headers=headers)
    # f=open('test.html','w+')
    # f.writelines(r3.text)
    # f.close()




    ####登录提交后的第二次页面跳转
    urlRedirct2='http://i.hdu.edu.cn/dcp/forward.action?path=/portal/portal&p=wkHomePage'
    r4=conn.get(urlRedirct2,headers=headers)
    # f=open('test.html','w+')
    # f.writelines(r4.text)
    # f.close()

    return [conn,r4]



##登录进入数字杭电后台的方法,返回最后进去后的requests对象
def loginToXUANKE(headers,conn):
    ####想进入选课系统的点击提交
    urlXuanKe='http://i.hdu.edu.cn/dcp/forward.action?path=dcp/apps/sso/jsp/ssoDcpSelf&appid=1142'
    r5=conn.get(urlXuanKe,headers=headers)
    # f=open('test.html','w+')
    # f.writelines(r5.text)
    # f.close()
    # print ({c.name: c.value for c in r5.cookies})




    ####想进入选课系统点击提交后的第一次页面跳转
    ticket=re.search('ticket=(.*?)\"',r5.text)
    urlXuanKe1='http://jxgl.hdu.edu.cn/default.aspx?ticket='+ticket.group(1)
    # print(urlXuanKe1)
    r6=conn.get(urlXuanKe1,headers=headers)
    # f=open('test.html','w+')
    # f.writelines(r6.text)
    # f.close()





    ####想进入选课系统点击提交后的第二次页面跳转
    ticket=re.search('ticket=(.*?)\"',r6.text)
    urlXuanKe2='http://jxdc.hdu.edu.cn/index.php?ticket='+ticket.group(1)
    # print(urlXuanKe2)
    r7=conn.get(urlXuanKe2,headers=headers)
    # f=open('test.html','w+')
    # f.writelines(r7.text)
    # f.close()


    ####想进入选课系统点击提交后的第三次页面跳转
    urlXuanKe3='http://jxgl.hdu.edu.cn/index.aspx'
    r8=conn.get(urlXuanKe3,headers=headers)
    # f=open('test.html','w+')
    # f.writelines(r8.text)
    # f.close()



    ####想进入选课系统点击提交后的第四次页面跳转
    ticket=re.search('ticket=(.*?)\"',r8.text)
    urlXuanKe4='http://jxgl.hdu.edu.cn/index.aspx?ticket='+ticket.group(1)
    # print(urlXuanKe4)
    r9=conn.get(urlXuanKe4,headers=headers)
    # f=open('test.html','w+')
    # f.writelines(r9.text)
    # f.close()


    ####想进入选课系统点击提交后的第五次页面跳转
    final=re.search('window.open\(\'(.*?)\'',r9.text)
    finalUrl='http://jxgl.hdu.edu.cn/'+final.group(1)
    # print(finalUrl)
    r10=conn.get(finalUrl,headers=headers)
    f=open('test.html','w+')
    f.writelines(r10.text)
    f.close()
    # print ({c.name: c.value for c in r10.cookies})

    return [conn,r10]


def randomRate(keNum,rateA,rateB):
    listStr='0'*rateA+'1'*rateB
    listResult=[]
    for i in range(0,keNum):
        listOne=[]
        for j in range(0,10):
            listOne.append(listStr[random.randint(0,len(listStr)-1)])
        if '0' not in listOne:
            listOne[random.randint(0,9)]='0'
        if '1' not in listOne:
            listOne[random.randint(0,9)]='1'
        listResult.append(listOne)
    return listResult



##进入学评教,返回最后进去后的requests对象
##输入的a和b的比率,为整数,总和为10
##如rateA=1,rateB=3,极评价里a和b为1:3的比例
def GOTOXuePingJiao(headers,conn,ReOld,rateA=9,rateB=1):
    ####想进入选课系统的点击提交;
    urlXpj=re.search(']*?)>理论教学质量评价<\/a>',ReOld.text)
    urlXpj2='http://jxgl.hdu.edu.cn/'+urlXpj.group(1)
    # print (urlXpj2)
    r1=conn.get(urlXpj2,headers=headers)
    f=open('test.html','w+')
    f.writelines(r1.text)
    f.close()

    b1=BeautifulSoup(r1.text,'lxml')
    keNum=(b1.select('#pjkc option'))
    print( '现在有 '+str(len(keNum))+' 门课程,进行预选择:')
    listResult=randomRate(len(keNum),rateA,rateB)


    for i in range(0,len(keNum)):
        d = [c=='0' and 'A' or 'B' for c in listResult[i]]  
        print(keNum[i].get_text()+':'+str(d))

    nextDa=input('这是预评价结果,如若对该结果无异议,请输入 Y/y 来完成继续,或者按任意键退出本程序.')
    if nextDa.upper()!='Y':
        return
    print('开始评价...')

    postPingJia={
     '0':'A(非常满意)',
     '1':'B(满意)',
     '2':'C(基本满意)',
     '3':'D(不满意)'
    }


    for i in range(0,len(keNum)):

        if i!=0:
            b1=BeautifulSoup(r.text,'lxml')
            formData.clear()
        postUrl='http://jxgl.hdu.edu.cn/'+b1.select('#Form1')[0].get('action')
        # print(postUrl)

        formData={
        '__EVENTTARGET': None,
        '__EVENTARGUMENT': None,
        '__LASTFOCUS': None,
        '__VIEWSTATE':(b1.select('#__VIEWSTATE')[0].get('value')).encode("gb2312") , 
        '__EVENTVALIDATION': (b1.select('#__EVENTVALIDATION')[0].get('value')).encode("gb2312") ,
        'pjkc':(b1.select('#pjkc option[selected="selected"]')[0].get('value')).encode("gb2312") ,
        'pjxx': None,
        'txt1': None,
        'TextBox1': 0,
        'Button1': (b1.select('#Button1')[0].get('value')).encode("gb2312")  ,
        }

        selectPj=b1.select('#DataGrid1 select')
        listResult[i]= listResult[i] * int(len(selectPj) / 10)
        if (len(listResult[i])!=10):
            listResult[i][0]='1'
            listResult[i][1] = '1'

        a=len(listResult[i])
        for index,one in enumerate(b1.select('#DataGrid1 select')):
            # print(i,index,listResult[i][index])
            formData[one.get('name')]=(postPingJia[listResult[i][index]]).encode("gb2312")
            # print(one.get('name')+':'+str(formData[one.get('name')]))

        ##每一项的保存操作
        r=conn.post(postUrl,headers=headers,data=formData)


        ##最后的提交操作
        if i == len(keNum)-1 :
            pd2=input('现在已经完成各项评价,您可以按 Y/y 来进行最后一步的“提交”操作,或者按任意键退出,自行到网络上提交:')
            if pd2.upper()=='Y':
                formData['Button2']=(b1.select('#Button2')[0].get('value')).encode("gb2312")
                formData.pop('Button1')
                r = conn.post(postUrl, headers=headers, data=formData)


    print('结束评价...')








if __name__ == '__main__':


    ##构造头信息
    headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
    'Referer': 'http://cas.hdu.edu.cn'
    }


    ##获得登录进数字杭电后台的session
    while True:
        ##获得requests的session
        conn = requests.session()
        conn = loginToHDU(headers,conn)
        if conn != None :
            conn=conn[0]
            break


    ##获得登录进选课系统后台的session
    InXuanKe = loginToXUANKE(headers, conn)


    ##执行学评教的方法
    GOTOXuePingJiao(headers,InXuanKe[0],InXuanKe[1])





python3爬虫实战-requests+beautifulsoup-杭电自动学科教学评价_第1张图片

你可能感兴趣的:(python3,requests,爬虫,杭电学评教,自动化脚本)