爬取正方教务系统课程表

被一个学长布置下的任务…有些地方可能不够完整…
思路: 首先你需要完成登录操作:
(1) 首先根据教务系统网站的审查元素, 发现了一个验证码的网址:http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/CheckCode.aspx
进去后你会发现,这里面的验证码是会随着时间的变化而变化的,那这样子该怎么办呢?(果断百度一波!!)
然后巴拉巴拉… 大概就是说验证码的核对是与你的cookies有关的,那么这个东西要怎么获得呢,
request第三方库中提供了一个session , 这个就是相当于代码中的一个浏览器,在你请求http的时候会自动帮你保存你的cookies的值,这样子就可以完成验证码的匹配操作了 。
具体一点:
先创建一个session对象
然后向验证码页面发送get请求(这时你的cookies就有了)
然后向教务系统页面发送post请求(提交账号密码验证码)
这时,你就登录成功了(前提是提交的东西要正确= =)
(2) 爬取课程表
登录进去后,我们继续我们的审查元素,在其中找到了向课程表页面发送post请求的地址:
http://210.40.2.253:8888/xskbcx.aspx?xh=1717000113&xm=֣����&gnmkdm=N121603
其中 xh 是 学号 , xm 是学生姓名的url编码 , gnmkdm是课程表页面的代码
这些信息是获得课表页面的学生信息,会显示出你是哪里的学生,学号是什么,专业是什么等等之类的
这些东西我们需要想办法获得,也就是说,只有得到了这些信息,我们才能方便向课表页面发送post请求
那么应该怎么获得?
(1) 先发送一个get请求 http://210.40.2.253:8888/xskbcx.aspx?xh="+ user_name+ "&gnmkdm=N121603
(2) 然后运用bs4库去提取http网页中的学生信息(参考代码)
(3)得到后向课表页面发送post请求(哪一年第几学期)
(4) 然后便得到了我们的课程表页面, 接下来就可以进行信息提取了

其实只要登录进去了,里面的成绩,课表,选课什么的都是可以以一种模拟人的办法进行操作

import requests
from bs4 import BeautifulSoup
session = None
checkcodePath = './code.png'  #验证码保存路径
res = requests.Session()
Origin_url = "http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/" # 教务系统网址
url = "http://210.40.2.253:8888/default2.aspx"
checkcodeURL = Origin_url+'CheckCode.aspx'  #验证码网址
head = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0","Connection": "keep-alive",   "Referer":"http://210.40.2.253:8888/default2.aspx"}
post_data = {"__VIEWSTATE":"dDwtNTE2MjI4MTQ7Oz4I55DQ6KPcVdzTLmjGjlJPRWgYUQ==","Textbox1" : "" ,"txtSecretCode":"","RadioButtonList1":"%D1%A7%C9%FA","Button1":"","lbLanguage":"","hidPdrs":"","hidsc":""}
def get_photo(URL):
    checkcode = res.get(checkcodeURL, headers=head)
    with open(checkcodePath, 'wb') as fp:  #保存验证码图片
         fp.write(checkcode.content)
    post_data['txtSecretCode'] = input("请输入图片中的验证码: (验证码图片保存在同级文件夹)")  


def login():
    user_name = input("请输入您的学号:")
    user_password = input("请输入您的密码:")
    post_data["txtUserName"] = user_name
    post_data["TextBox2"]=  user_password 
    login_page_url = Origin_url + "default2.aspx"
    head['Referer'] = login_page_url
    get_photo(url)
    homePage = res.post(login_page_url, data=post_data, headers=head)  #在这里得到了主页面
    with open('text1.html','w' , encoding = 'gb2312') as f :
           f.write(homePage.text)
    #更改数据
    #head["Referer"]="http://210.40.2.253:8888/(fw5xjvfovnf3f4zg1ikero2a)/default2.aspx"
    exit_sys = "what should i do "
    URL = "http://210.40.2.253:8888/xskbcx.aspx?xh="+ user_name+ "&gnmkdm=N121603"
    #URL = "http://210.40.2.253:8888/xskbcx.aspx?xh=1717000113&xm=%D6%A3%BC%CE%F3%DE&gnmkdm=N121603
    head["Referer"]= URL

    page_home = res.get(URL , headers = head) 
    post_data["__VIEWSTATE"] = BeautifulSoup(page_home.text, 'html.parser').find_all('input')[2].get('value')
    #xm = BeautifulSoup(res.get(URL , headers = head).text, 'html.parser').find_all('form')[0].get('action')
    post_data["__EVENTTARGET"] = "xqd"
    while exit_sys != "q":
        query_years = input("请输入您要查询课表的年份:(2017-2018)")
        query_how = input("请输入您要查询第几学期的课表:") 
        
        #URL = "http://210.40.2.253:8888/" + xm
        #print(URL)
        post_data["xnd"]= query_years
        post_data["xqd"]=query_how
        
        learning = res.post(URL , data = post_data , headers = head)
        print(URL)
        if query_years == "2018-2019" and query_how == "1" :
                with open( query_years + '-'+ query_how + '.html'  ,'w' , encoding = "gb2312") as f :
                   f.write(page_home.text)
        else : 
                with open( query_years + '-'+ query_how + '.html'  ,'w' , encoding = "gb2312" , errors = "ignore") as f :
                   f.write( learning.text)
        print("您的课表已经保存为html的形式!")
        print("按q退出 按c继续")
        while 1 :
            exit_sys = input()
            if exit_sys == "c" or exit_sys == 'q' :
                break
            else:
                print("无效操作!")
    return learning
def class_table(table_html):
      pass 
    

def main():
    res = login() 
    class_table(res)
if __name__ == "__main__":
    main() 



你可能感兴趣的:(Python爬虫)