利用python从教务处官网爬取2015-2016学年的所有课程成绩,并计算GPA。

话不多说,先上演示视频。

  • 怎么样,全程电脑自动操作,我的鼠标可是没点击任何按钮。看起来是不是很高大上呢。
    最后计算的学年绩点就在运行框中(3.32…请不要嘲笑我这个学渣。)
    (话说博主为了上传这个视频也是费尽心血,花费好几天才上传成功)。

Step

Step 1

  1. 安装pycharm,创建.py文件即可写python
  2. 下载phantomJS(无界面爬虫) 或者下载 chromedriver(有界面爬虫) 百度即可下载到

Step 2

  • phantomJS+ selenium实现无界面对网站爬虫,爬取教务处成绩。先根据路径打开phantomJS
    1
    2
    3
    # open phantomjs
    phantomjs_path = '/Users/xuyunfang/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs'
    driver = webdriver.PhantomJS(phantomjs_path)
  • chromedriver+selenium实现有界面对网站爬虫,这个我比较喜欢一点,以为无界面的你往往不知道程序进行到哪一步了,只能干等着报错或者输出,而有界面即可全程看到运行的步骤,实现自动的处理网页,(这过程你就可以喝杯茶慢慢看网页自己跳转)
    1
    2
    browser = webdriver.Chrome()
    browser.get(URL)

URL就是教务处网站,这里要从selenium包引入webdriver,还要下载chromedriver。

1
from selenium import webdriver

  1. 打开教务处网址,实现模拟登陆,这时候selenium就派上用场了。Selenium的基本功能是定位到页面元素的,然后触发相应的事件,通过页面元素变化判断是否执行了相应的操作。关于找元素得通过以下方式。
    •find_element_by_id
    •find_element_by_name
    •find_element_by_xpath
    •find_element_by_link_text
    •find_element_by_partial_link_text
    •find_element_by_tag_name
    •find_element_by_class_name
    •find_element_by_css_selector
    然后用driver去调用相应的函数就好了,找到后.click()即可触发。

    Step 3

    解析提取到的HTML代码,用BeautfulSoup解析成字符串,然后利用正则表达式筛选出我们需要的字符串,即从table中筛选,选出
    中的内容,即我们的成绩表(其实是一堆字符串)
    E1B92D0F-6A8A-4E21-BF2B-609CE445DE74.png
    1
    2
    3
    4
    score_table = ''
    bodyStr = browser.find_element_by_id('undefined').get_attribute('innerHTML')
    soup = BeautifulSoup(bodyStr)score_table = score_table + str(soup)
    time.sleep(5)

最后利用python自带的包,创建一个excel表格,把之前用于保存成绩的二维数组用循环用sheet.write()的方式写入表格。

1
2
3
4
# 将课程的信息写入表格中
for x in range(0, course_table.__len__()):
for y in range(0, 11):
sheet1.write(x+1, y, course_table[x][y])

Step 4

  • 最后一步,用python读取已经保存成绩了的表格,利用教务处求学分的表格自动计算GPA。

关于安利

每次都是从零开始学起,这次学习python也是如此。当然,学习的过程离不开参考一些大神的博客。博主这就推荐几个。

  1. python操作Excel读写

  2. Python 编码规范(Google)

  3. 正则re模块详解 re模块就是负责构造正则表达式和匹配符合正则表达式的字符串。
  4. 廖雪峰Python 如果有长期学习python的意愿,可以多看看这个网站。

遇到的问题

  • 说到遇到的问题,还真是多啊,让我搞了好几天才解决,顺利完成这个爬虫任务。
  1. beautifulsoup无法顺利解析,一要注意引入包,
    QQ20161020-1.png
    从bs4中引入BeautifulSoup包。
    不过我就算引入包之后,还是会报错,显示
    D29EF745-CEB3-4725-BD79-1D97F2B1A190.png
    这个问题大概困扰我半天,都解决不了,最后在学长的帮助下,我才顺利解决,
    1
    soup2 = BeautifulSoup(bodystr)

原来lxml是第三方解析库,我的pycharm可能引入不了,把第二个参数删除了,就不用lxml这个第三方库解析了,就用python标准库解析了。

  1. 因为点击历史记录查询的话,只会自动显示20条,这样解析table的时候记录就只有20条,肯定会影响自己的GPA计算。所以我就想办法把所以的成绩都包括进去。一开始,我想的是把20条,变成50条,但是无论是
    1
    find_element_by_id

还是

1
find_element_by_class_name,

或者是

1
find_element_by_link_text

都一直报错,显示定位不到该元素,而且这个也困扰了我好几天,明明之前的select框选择学年2015-2016就能成功,同样的方法用在这上面却不行。自己只能另辟蹊径。机智的我发现。下面不是有个“2”么,就是点击会转到第二页。
QQ20161020-0.png]
于是我便尝试通过link_text来定位这个‘2’,果然成功了,然后再把第二页解析一边就好了。于是我就又解决了一个大问题。说起来这些问题啊,还真是困扰我好几天。

  1. 问题三就是把str 的list转换为float ,但是在网上找了好大会,始终找不到一个库函数,可以这样。没办法,自己只能用for i in range( ) 把list中的函数一个一个变为float,再另外在建两个list,把转换后的list的元素添加进去。
    1
    2
    for i in range(0,len(list1)):
    list4.append(float(list1[i]))

就这样成功解决了最后一个问题。自己以后一定再找找有没有这种函数,以python这样强大的语言,一定肯定有的哈哈。

进步

  • 对于我来说,最开心的就是看到自己一直在进步,我真的很珍惜每一次参加培训的机会,这对我来说都是一种很宝贵的经历。也让我的编程知识有了更多的提升。让我对计算机有了更多的了解,不再仅仅局限于c++,java这些语言。

后话

  • 如果客官觉得我写的还行的话,就打个赏吧。哈哈哈
    mm_facetoface_collect_qrcode_1475396970838.png