使用Python進行北航課程中心課件批量下載

簡介

無意間發現,課程中心改版後,可以在首頁搜索到絕大多數課程主頁,並且北航學生可以自由下載這些資源。

一向熱愛學習的我當然不會放過這個好機會。很多課程覬覦已久了,但是網上成套的資料並不多。配合北航剛剛使用的新vpn(e.buaa.edu.cn),在家裡也能上課程中心,這次剛好有機會能下載下來。

不過很快我就放棄了這個念頭,因為每門課程都有大概十幾個課件,挨個下實在沒有精力。而如果使用VPN在線看,那麼每次都需要很麻煩的跳轉才能到課件這一頁。一開始想用wget抓下來,但是由於經過了VPN和課程中心的多次跳轉和認證,簡單的wget指令也無法滿足需求。

好在還有Python這個利器,大概寫了100行代碼,就實現了根據課程url批量下載課件。效果如圖:

實現思路與源碼

整體實現思路如下:

  1. 打開vpn網站
  2. 登陸vpn網站
  3. 登陸課程中心
  4. 下載課件

好像跟沒說一樣哈。。。

不過用python的確是這麼做的,實現也非常簡單。

我用了ConfigParser來解析配置文件(這裡有一個坑,如果配置文件有BOM會報錯,而windows記事本會自動給utf8文件加bom。所以不要使用windows記事本打開,推薦使用notepad++或sublime,mac和linux用戶請無視),用pyquery(類似於jquery)來解析DOM(工具還是好用,之前都是用正則表達式強行解析)。代碼如下:

get_course_ppt.py

# -*- coding: utf-8 -*- import urllib import urllib2 import cookielibfrom pyquery import PyQuery as pqimport sysimport ConfigParserimport osimport StringIOimport codecs# 防止出現編碼錯誤reload(sys)sys.setdefaultencoding( "utf-8" )if __name__ == __main__: config_file = config.txt if len(sys.argv) > 1: config_file = sys.argv[1] cf = ConfigParser.ConfigParser() cf.read(config_file) stu_id = cf.get(student_info, id) stu_pw = cf.get(student_info, password) course_name = unicode(cf.get(course_info, course_name),utf-8) course_url = cf.get(course_info, course_url) user_agent = uMozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36 header = { User-Agent : user_agent } # cookie cookie = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) # 打開VPN req = urllib2.Request( url = https://e.buaa.edu.cn/users/sign_in, headers = header ) # 通過pyquery獲取表單信息,填寫賬號密碼登錄 result = opener.open(req).read() p = pq(result) postdata = {} inputs = p(form).find(input) for i in range(len(inputs)): key = inputs.eq(i).attr(name) value = inputs.eq(i).attr(value) postdata[key] = value postdata[user[login]]=stu_id postdata[user[password]]=stu_pw postdata=urllib.urlencode(postdata) req = urllib2.Request( url = https://e.buaa.edu.cn/users/sign_in, data = postdata, headers = header ) result = opener.open(req).read() print Sign into VPN. # 登錄課程中心 postdata = {} postdata[eid]=stu_id postdata[pw]=stu_pw postdata[type]=ldap postdata=urllib.urlencode(postdata) req = urllib2.Request( url = https://course.e.buaa.edu.cn/opencourse/login, headers = header, data = postdata ) result = opener.open(req).read() req = urllib2.Request( url = course_url, headers = header ) result = opener.open(req).read() print Sign to course center. p = pq(result) a_s = p(.dataGrid).eq(0).find(a) urls = {} for i in range(len(a_s)): url = a_s.eq(i).attr(href) filename = a_s.eq(i).text() urls[filename] = url os.makedirs(course_name) for filename in urls: print Downloading , filename, ... savefile = open(course_name + / + filename,wb) try: savefile.write(opener.open(urls[filename]).read()) savefile.close() except: print urls[filename]

config.txt

[student_info]id = 13000000password = 000000[course_info]course_name = 嵌入式系統course_url = https://course.e.buaa.edu.cn/opencourse/course/detail/5437

使用方法:把上面兩個文件放到一個文件夾下,修改配置文件,輸入相應課程名字和url即可。

為什麼要做這件事?

因為:

我愛學習,

學習愛我。

推薦閱讀:

沒人說,就繼續——電影《不能說的夏天》看北航陳小武性騷擾事件
那一年,在TD線守望的高人
為什麼西北工大及南航的同學那麼熱衷於黑北航?
如何評價北航TD線(體能鍛煉走廊)?
北航2系有哪些很不錯的導師?

TAG:Python入门 | 北京航空航天大学 |