话不多说,先上演示视频。
- 怎么样,全程电脑自动操作,我的鼠标可是没点击任何按钮。看起来是不是很高大上呢。
最后计算的学年绩点就在运行框中(3.32…请不要嘲笑我这个学渣。)
(话说博主为了上传这个视频也是费尽心血,花费好几天才上传成功)。
Step
Step 1
- 安装pycharm,创建.py文件即可写python
- 下载phantomJS(无界面爬虫) 或者下载 chromedriver(有界面爬虫) 百度即可下载到
Step 2
- phantomJS+ selenium实现无界面对网站爬虫,爬取教务处成绩。先根据路径打开phantomJS123# open phantomjsphantomjs_path = '/Users/xuyunfang/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs'driver = webdriver.PhantomJS(phantomjs_path)
- chromedriver+selenium实现有界面对网站爬虫,这个我比较喜欢一点,以为无界面的你往往不知道程序进行到哪一步了,只能干等着报错或者输出,而有界面即可全程看到运行的步骤,实现自动的处理网页,(这过程你就可以喝杯茶慢慢看网页自己跳转)12browser = webdriver.Chrome()browser.get(URL)
URL就是教务处网站,这里要从selenium包引入webdriver,还要下载chromedriver。1from selenium import webdriver
- 打开教务处网址,实现模拟登陆,这时候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中筛选,选出中的内容,即我们的成绩表(其实是一堆字符串) 1234score_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()的方式写入表格。1234# 将课程的信息写入表格中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也是如此。当然,学习的过程离不开参考一些大神的博客。博主这就推荐几个。
遇到的问题
- 说到遇到的问题,还真是多啊,让我搞了好几天才解决,顺利完成这个爬虫任务。
- beautifulsoup无法顺利解析,一要注意引入包,
从bs4中引入BeautifulSoup包。
不过我就算引入包之后,还是会报错,显示
这个问题大概困扰我半天,都解决不了,最后在学长的帮助下,我才顺利解决,1soup2 = BeautifulSoup(bodystr)
原来lxml是第三方解析库,我的pycharm可能引入不了,把第二个参数删除了,就不用lxml这个第三方库解析了,就用python标准库解析了。
- 因为点击历史记录查询的话,只会自动显示20条,这样解析table的时候记录就只有20条,肯定会影响自己的GPA计算。所以我就想办法把所以的成绩都包括进去。一开始,我想的是把20条,变成50条,但是无论是1find_element_by_id
还是1find_element_by_class_name,
或者是1find_element_by_link_text
都一直报错,显示定位不到该元素,而且这个也困扰了我好几天,明明之前的select框选择学年2015-2016就能成功,同样的方法用在这上面却不行。自己只能另辟蹊径。机智的我发现。下面不是有个“2”么,就是点击会转到第二页。
]
于是我便尝试通过link_text来定位这个‘2’,果然成功了,然后再把第二页解析一边就好了。于是我就又解决了一个大问题。说起来这些问题啊,还真是困扰我好几天。
- 问题三就是把str 的list转换为float ,但是在网上找了好大会,始终找不到一个库函数,可以这样。没办法,自己只能用for i in range( ) 把list中的函数一个一个变为float,再另外在建两个list,把转换后的list的元素添加进去。12for i in range(0,len(list1)):list4.append(float(list1[i]))
就这样成功解决了最后一个问题。自己以后一定再找找有没有这种函数,以python这样强大的语言,一定肯定有的哈哈。
进步
- 对于我来说,最开心的就是看到自己一直在进步,我真的很珍惜每一次参加培训的机会,这对我来说都是一种很宝贵的经历。也让我的编程知识有了更多的提升。让我对计算机有了更多的了解,不再仅仅局限于c++,java这些语言。
后话
- 如果客官觉得我写的还行的话,就打个赏吧。哈哈哈