初衷、具體實施 (??????)??
初衷
剛上大一的時候覺得查課表好麻煩啊,查成績好麻煩啊。就一直想著能不能自己寫個小程序用來查詢成績啊查查課表之類的云云。然后上課時聽老師說了Python這門語言,第一眼看到這個單詞覺得挺有感覺,然后就查了一下,發現了爬蟲這個名詞……然而一開始連登陸都不會 /(ㄒoㄒ)/~~,繞了很多彎路。今天寫下這個小練習的過程以及遇到的困難等等。不足之處還請指出(??????)??準備
基于python3.6, 用到了urllib庫(py自帶無需安裝)以及BeautifulSoup庫(命令行下運行:pip3 install bs4)。這里需要講的是,py2與3的一個區別是,py2中的urllib2在Python3已拆分更名為urllib.request和urllib.error
分析
登錄
學校教務處的網址是 http://zhjw.scu.edu.cn/login.jsp。在Chrome下按F12, 
輸入學號密碼登錄教務處,會看到在NetWork網絡監聽中有個LoginAction.do

登陸的過程需要表單。在Headers里可以看到,請求的URL是http://zhjw.scu.edu.cn/loginAction.do,請求方式為Post。往下拉會看到兩個參數zjh(學號)和mm(密碼)需要提交到這個URL:

啊哈~所以登錄只要把這兩個參數提交到請求的URL就行了~
遇到的問題及解決
· Chrome的網絡監聽中如何找到需要查看的文件? 這個問題困擾了我一段時間,期間我也去網上聽各種爬蟲公開課。我的理解是:登錄是需要提交學號和密碼的,所以請求方式是Post,文件名應該是Login之類的 · 而在這個文件里有提交的表單的參數,zjh就是學號,mm是密碼
成績的URL
審查一下成績,會看到: 2015-2016學年秋(兩學期) 那么,完整的URL就是http://zhjw.scu.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo 當然,這個URL能直接進入,需要cookie,因此需要在代碼里加入。

解析成績
能得到成績的數據了,接下來就是怎么解析了。由于這個小項目的用戶估計只有一個人,對速度沒啥要求,就用了BeautifulSoup庫。
BeautifulSoup提供一些簡單的、python式的函數用來處理導航、搜索、修改分析樹等功能。它是一個工具箱,通過解析文檔為用戶提供需要抓取的數據,因為簡單,所以不需要多少代碼就可以寫出一個完整的應用程序。 BeautifulSoup自動將輸入文檔轉換為Unicode編碼,輸出文檔轉換為utf-8編碼。你不需要考慮編碼方式,除非文檔沒有指定一個編碼方式,這時,BeautifulSoup就不能自動識別編碼方式了。然后,你僅僅需要說明一下原始編碼方式就可以了。 BeautifulSoup已成為和lxml、html6lib一樣出色的python解釋器,為用戶靈活地提供不同的解析策略或強勁的速度。
現在,查看http://zhjw.scu.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo 及其網頁源碼,會看到每個科目成績有課程號,課序號……成績等7個屬性。每個屬性都包含在中

代碼
# -*- coding:utf-8 -*-from urllib import parse, requestimport http.cookiejarfrom bs4 import BeautifulSoupclass SCU: def __init__(self): # login self.loginURL = 'http://zhjw.scu.edu.cn/loginAction.do' # grades URL self.gradesURL = 'http://zhjw.scu.edu.cn/gradeLnAllAction.do?type=ln&oper=qbinfo' # cookies and postData self.cookies = http.cookiejar.CookieJar() # self.zjh = input() # self.mm = input() self.postData = parse.urlencode({'zjh': '學號', 'mm': '密碼'}).encode('utf8') # build opener self.opener = request.build_opener(request.HTTPCookiePRocessor(self.cookies)) # result of grade self.grade = [] def getPage(self): myRequest = request.Request(url=self.loginURL, data=self.postData) self.opener.open(myRequest) # get grades result = self.opener.open(self.gradesURL) html = result.read().decode('gbk') bsObj = BeautifulSoup(html, 'html.parser') resultList = bsObj.findAll('td', {'align': 'center'}) for i, each in enumerate(resultList): self.grade.append(each.get_text().strip()) if (i-6) % 7 == 0: print(self.grade) self.grade = []if __name__ == '__main__': scu = SCU() scu.getPage()'''有了這些數據,接下來可以做一些擴展。<( ̄︶ ̄)↗[GO!] 如果有什么不好的地方還請不吝賜教,有什么問題還請指出~