剛才好無聊,突然想起來之前做一個課表的點子,于是百度了起來。
剛開始,我是這樣想的:在寫微信墻的時候,用到了urllib2【兩行代碼抓網頁】,那么就只剩下解析html了。于是百度:python解析html。發現一篇好文章,其中介紹到了pyQuery。
pyQuery 是 jQuery 在 Python 中的實現,能夠以 jQuery 的語法來操作解析 HTML 文檔。使用前需要安裝,Mac安裝方法如下:
1
|
sudo easy_install pyquery |
OK!安裝好了!
我們來試一試吧:
1
2
3
4
5
6
7
|
from pyquery import PyQuery as pq html = pq(url=u 'http://seam.ustb.edu.cn:8080/jwgl/index.jsp' ) #現在已經獲取了本科教學網首頁的html classes = html( '.haveclass' ) #通過類名獲取元素 #如果你對jQuery熟悉的話,那么你現在肯定明白pyQuery的方便了 更多用法參見pyQuery API |
好像學會了使用pyQuery就能抓課表了呢,但是,如果你直接用我的源碼,肯定會出錯。因為還沒有登錄啊!
所以,在運行這一行抓取正確的代碼之前,我們需要模擬登錄本科教學網。這個時候,我想起來urllib有模擬post請求的函數,于是我百度了:urllib post。
這是一個最簡的模擬post請求例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import urllib import urllib2 import cookielib cj = cookielib.CookieJar() opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) opener.addheaders = [( 'User-agent' , 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' )] urllib2.install_opener(opener) req = urllib2.Request( "http://seam.ustb.edu.cn:8080/jwgl/Login" ,urllib.urlencode({ "username" : "41255029" , "password" : "123456" , "usertype" : "student" })) req.add_header( "Referer" , "http://xxoo.com" ) resp = urllib2.urlopen(req) #這里面用到了cookielib,我不太清楚,以后慢慢了解吧 #還用到了urllib和urllib2,urllib2大概是urllib的擴展包【233想到了三國殺 |
在這個最簡的實例里,用我的校園網賬號向登錄頁面提交表單數據,模擬登錄。
現在,我們已經登錄了本科教學網,然后結合之前的pyQuery解析html就可以獲取網頁內的課表了。
1
2
|
html = pq(url=u 'http://seam.ustb.edu.cn:8080/jwgl/index.jsp' ) self.render( "index.html" ,data=html( '.haveclass' )) |
結果展示如圖:
最后:
我發現,pyQuery不但用于解析html非常方便,而且可以作為跨域抓取數據的工具,NICE!!!
希望對大家有幫助。