模拟登陆uestc教务系统并爬取成绩

例行图片^^(感谢画师)

github地址:https://github.com/haoxinl/spider_python

博客地址:http://haoxinl.club/2018/02/18/uestc-login-in/

前言

最近一直在整理以前写的一些程序,突然发现了一个以前学爬虫时写的爬教务处的程序,感觉还蛮有意思的,虽然没什么干货,还是分享出来看看。

正文

依赖库

  • requests
  • time
  • pandas
  • bs4
  • csv

实现功能

  • 模拟登陆教务系统
  • 找到存取成绩的页面
  • 爬取成绩并存取为csv文件

程序实现

说明:

由于此程序重点在于模拟登陆的进行,同时在模拟登陆后获取的信息各自有不同,因此爬虫部分自行理解。本人只抓取了本学期的成绩。

模拟登陆

首先分析网页,应提取的信息如下


image
image

由上图我们可以从网页中使用bs4库解析这些信息,但如果这些信息的话,肯定会失败的。这是为什么呢?这里确实也是个坑,经过我网上查阅了一些资料,最后才发现原来是少提交了一个信息了。如下图:

image

'-'这个参数是关于时间的参数,我们可以用time库来模拟它

这时候我们终于可以进行模拟登陆了^^

def get_postinf():
    # 获取xsrf code
    response = session.get('http://idas.uestc.edu.cn/authserver/login', headers=header)
    soup = BeautifulSoup(response.text, 'lxml')
    a= soup.find('input', {'name':"lt"}).attrs['value']
    b= soup.find('input', {'name':"dllt"}).attrs['value']
    c = soup.find('input', {'name':"execution"}).attrs['value']
    d = soup.find('input', {'name':"_eventId"}).attrs['value']
    e = soup.find('input', {'name':"rmShown"}).attrs['value']
    return(a,b,c,d,e)
def jiaowu_login(account, password):
        post_url = 'http://idas.uestc.edu.cn/authserver/login'
        post_data = {
            'username': account,
            'password': password,
            'lt': pa,
            'dllt': pb,
            'execution': pc,
            '_eventId': pd,
            'rmShown': pe,
        }
        para={
            'username': account,
            '_':str(time.time() * 1000)
        }
        base_url='http://idas.uestc.edu.cn/authserver/needCaptcha.html'
        session.get(base_url,params=para)
        response_text = session.post(post_url, data=post_data, headers=header)

爬虫部分

剩下的就是寻找到个人需要提取的网页信息进行提取了,我以我本学期的所有成绩提取为例:

def grade_get():
    response = session.get('http://eams.uestc.edu.cn/eams/teach/grade/course/person!search.action?semesterId=163&projectType=1')
    soup = BeautifulSoup(response.text, 'lxml')
    biaotis = soup.find('tr').find_all('th')
    columns=[]
    column=[]
    for biaoti in biaotis:
        column.append(biaoti.string)
    columns.append(column)
    datas=soup.find("tbody").find_all("tr")
    for data in datas:
        row=[]
        singles=data.find_all("td")
        for single in singles:
            row.append(single.get_text())
        columns.append(row)
    csvFile = open("mygrade.csv", "w")
    writer = csv.writer(csvFile)
    # 写入的内容都是以列表的形式传入函数
    for col in columns:
        writer.writerow(col)
    csvFile.close()
    print("快去查看你的成绩吧")

将以上两个过程联系起来

if __name__ == '__main__':
    agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.91 Safari/537.36'
    header = {
        'Host': 'idas.uestc.edu.cn',
        'Referer': 'http://idas.uestc.edu.cn/authserver/login',
        'User-agent': agent,
    }
    session = requests.session()
    pa, pb, pc, pd, pe = get_postinf()
    name=input("你的学号")
    password=input("你的密码")
    jiaowu_login(name,password)
    grade_get()

结果展示

以我获取到的成绩为例,使用excel打开,可以获得如下信息


image

你可能感兴趣的:(模拟登陆uestc教务系统并爬取成绩)