今天下午花時間學習了python爬蟲的中國大學排名實例,頗有心得,於是在博客園與各位分享
首先直接搬代碼:
import requests from bs4 import BeautifulSoup import bs4 def getHTMLText(url): try: r = requests.get(url,timeout = 30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return "" def fillUnivList(ulist, html): soup = BeautifulSoup(html,"html.parser") for tr in soup.find('tbody').children: if isinstance(tr,bs4.element.Tag): tds = tr.find_all('td') ulist.append([tds[0].string,tds[1].string,tds[3].string]) def printUnivList(ulist,num): tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}" print(tplt.format("排名","學校","總分",chr(12288))) for i in range(num): u = ulist[i] print(tplt.format(u[0],u[1],u[2],chr(12288))) def main(): uinfo = [] url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html" html = getHTMLText(url) fillUnivList(uinfo, html) printUnivList(uinfo,20) main()
再附上大學排名截圖:
那么,現在開始代碼心得講解:
首先開始分析網頁結構:
打開http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
打開chrome網頁分析工具:
可以發現大學排名,學校名稱,省市,總分等都處在tbody標簽內
而大學名稱、省市等,都處於tr標簽內的td中
好,分析完成,開始構建函數架構:
主要思想為:獲取網頁html文本,得到需求數據,並將需求數據轉化為列表,最后將列表輸出
下一步:開始補充getHTMLText()部分的代碼:
這里我用try except形式編寫代碼:
首先獲取網頁url,時限為30s,j接着運用 r.raise_for_status()(如果 HTTP 請求返回了不成功的狀態碼, r.raise_for_status() 會拋出一個 HTTPError
異常)
然后將網頁轉碼為r.apparent_encoding
返回一個r.text
這里代碼運行中如果出現錯誤,則會return "",返回一個空字符串
接下來開始編寫fillUnivList()部分代碼
我們先做一鍋湯,定義為soup,然后在這鍋湯中遍歷tr的孩子,這里每一個tr都對應一所大學的信息
而且我們需要濾掉非標簽類型的其他信息,所以運用isinstance對函數類型做一個判斷
if isinstance(tr,bs4.element.Tag):
這行代碼就是檢測標簽類型,如果標簽不是bs4庫定義的類型,將過濾掉,同時為了運用這個方法,我們也就需要引入bs4庫
由於tr標簽已經被解析出來,接下來就需要對tr標簽中的td標簽做查詢
if isinstance(tr,bs4.element.Tag): tds = tr.find_all('td')
這里把查詢到的td標簽存入tds列表中
再然后在ulist表中增加:排名,大學名和總分的對應字段
ulist.append([tds[0].string,tds[1].string,tds[3].string])
接着來編寫printUnivList()函數
注意:這里的{:^10}表示取10位居中對齊,^是居中對齊,\t是橫向制表符。
ok,主要代碼完成,希望可以幫到你。