zoukankan      html  css  js  c++  java
  • 爬学习课程表

    总思路:
    抓包看需要发送什么数据,从fiddler抓到的包发现想要获得课程表的数据需要发送一个携带班级序号和学期号的GET请求,
    因为尝试了各种方法都无法直接通过请求进入网站,于是我把可能需要携带的数据都带进去,发现只需要一个User-Agent和Cookie
    这样事情就变得简单了,直接在字典中放入伪装头User-Agent和Cookie,再通过urllib.parse处理一下这个url,直接发送就能获取到网页发来的json数据了
    得到json数据后第一件事就是提取里面的班级名,班级号

    得到了班级名和班级号,继续发送GET请求,携带班级号和学期号

    得到班级的课程信息,再做进一步保存,就得到了想要的数据
    ========================================================================

     

    1.把全校所有的班级名和班级号弄下来,班级名的作用是用来命名文件,班级号的作用是发送POST请求,返回json数据

        
    import urllib.request
    import urllib.parse
    
    url = 'http://bkjw.hnist.cn/student/teachingResources/classCurriculum/search'
    
    
    fromdata={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36',
    'Cookie': 'COMPANY_ID=10122; ID=6a6d653961526b305a44673d; PASSWORD=43717531446d5a623850513d; LOGIN=3234313732323030303837; SCREEN_NAME=563143355451674c6f70326a3735497a4454327442773d3d; JSESSIONID=abcWs6G7vtja1c6SuVH-w; selectionBar=1423374',
    
    }
    
    
    for i in range(1,59):
        post_data={
        'param_value':'100020',
        'executiveEducationPlanNum':'2019-2020-2-1',
        'yearNum'    :'',
        'departmentNum'    :'',
        'subjectNum':''    ,
        'classNum'    :'',
        'pageNum':i,
        'pageSize':'10',
        }
    
        query_string = urllib.parse.urlencode(post_data).encode()
        req = urllib.request.Request(url=url,headers=fromdata,data=query_string)
    
        resp = urllib.request.urlopen(req).read()
    
        with open('第%d页'%i+'.txt','w',encoding='utf-8')as f:
            f.write(resp.decode())

    2.提取班级名和班级号

    import json
    import os
    
    def file_open(filename):
        file=json.load(open(filename,'r',encoding='utf-8'))
        return file
    
    def parse_file(filename,page):
        fp = file_open(filename)
        file=open('班级名/第%d页班级名.txt'%page,'w',encoding='utf-8')
        for i in range(1,len(fp[0]['records'])):
    
            print(fp[0]['records'][i]['className']+','+fp[0]['records'][i]['id']['classNum'])
    
            classname = fp[0]['records'][i]['className']
            classNum= fp[0]['records'][i]['id']['classNum']
    
    
            file.write(classname+'	'+classNum+'
    ')
    
    for i in range(1,59):
        name='第%d页.txt'%i
        page=i
        parse_file(name,page)


    接下来把这些文件合并到一个总文件

    import os
    
    for filename in os.listdir("班级名"):
        print(filename)
        with open("班级名/"+filename,encoding='utf-8') as f:
            for line in f.readlines():
                with open("班级名/总表.txt", "a") as fp:
                    fp.write(line)

    这样就有一个班级名和班级号的总表了

     


    3.继续发送请求,返回课程表数据

    import json
    import os
    
    def list_file():
        for filename in os.listdir("课程表"):
            print('文件名:',filename)
    
            load_file(filename)
    
    def load_file(filename):
        try:
            file =open('课程表/%s'%filename,'r',encoding='gbk')
            context = json.load(file)
    
            print('文件已加载')
            write_in_file(context,filename)
        except FileNotFoundError as e:
            print(e)
    # print(context)
    # print(type(context))
    #
    # print(context[0][0])
    # #课程名
    # print(context[0][0]['kcm'])
    #
    #
    # #上课星期
    # print(context[0][0]['id']['skxq'])
    #
    # #周次
    # print(context[0][0]['zcsm'])
    #
    #
    # print(context[0][0]['xqm'])
    #
    #
    #
    # print(context[0][1]['jash'])
    #
    #
    # #教师名
    # print(context[0][1]['jsm'])
    #
    #
    # #课程名
    # print(context[0][1]['kcm'])
    #
    #
    # #上课星期
    # print(context[0][1]['id']['skxq'])
    #
    # #周次
    # print(context[0][1]['zcsm'])
    #
    #
    # print(context[0][1]['xqm'])
    #
    # # #教学楼号
    # # print(context[0][0]['jxlh'])
    # # #教学楼名
    # # print(context[0][0]['jxlh'])
    #
    # #jash
    #
    # print(context[0][1]['jash'])
    #
    #
    # #教师名
    # print(context[0][1]['jsm'])
    #
    # print(context[0][1]['id']['skjc'])
    
    
    def write_in_file(context,filename):
        print('开始写入文件')
        if not os.path.exists('详细课表'):
            os.mkdir('详细课表')
        classNum=len(context[0])
        print('课程总节次:',classNum)
        for i in range(classNum):
            try:
                print('班级名:%s'%filename)
                #课程名
                kcm=context[0][i]['kcm']
                print('课程名:',kcm)
    
                #上课星期
                skxq=context[0][i]['id']['skxq']
    
                #上课节次
                skjc=context[0][i]['id']['skjc']
    
                #教室
                skjs=context[0][1]['jash']
    
                #周次
                zc=context[0][1]['zcsm']
    
                #老师
                jsm=context[0][i]['jsm']
                print('教师:',jsm)
    
    
                file = open('详细课表/'+filename,'a',encoding='utf-8')
    
    
    
                if skjc==1:
                    skjc='1-2节'
                elif skjc==3:
                    skjc='3-4节'
                elif skjc==5:
                    skjc='5-6节'
                elif skjc==7:
                    skjc='7-8节'
                file.write(kcm+'
    '+'星期'+str(skxq)+'
    '+str(skjc)+'
    '+skjs+'
    '+zc+'
    '+jsm+'
    ==================
    ')
            except :
                 print('错误')
    
    filename=list_file()
    
    print('over')

  • 相关阅读:
    hystrix熔断器之HystrixRequestLog
    RXJAVA之聚合操作
    RXJAVA之变换操作
    RXJAVA之创建被观察者
    小程序学习
    redis的使用
    Stream/Bytes[]/Image对象相互转化
    消息队列转载
    业务层使用事务
    ViewState 和字段属性的差异
  • 原文地址:https://www.cnblogs.com/hongweijiang/p/12236307.html
Copyright © 2011-2022 走看看