1.首先,咱們肯定須要爬取的網頁及robots協議,爬取的網頁爲最好大學網http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html,查看robots協議打開http://www.zuihaodaxue.cn/robots.txt,發現:not found,說明沒有對爬取進行robots協議限制,能夠進行爬取。html
2.咱們須要打開網頁源代碼,查看此網頁的信息是寫在html代碼中,仍是由js文件動態生成的,若是是後者,那麼咱們目前僅僅採用requests和BeautifulSoup還很難爬取到排名的信息。網絡
查看網頁源代碼,咱們能夠發現,排名信息是寫在html頁面中的,這時候咱們利用BeautifulSoup庫就能夠對信息進行提取數據結構
三、程序的結構設計:app
步驟1,從網絡上獲取大學排名網頁內容,getHTMLText()函數
步驟二、提取網頁內容中信息到合適的數據結構,fillUnivList()ui
步驟三、利用數據結構展現並輸出結果,printUnivList()url
4.首先咱們先忽略代碼的具體實現,寫出爬取的邏輯:spa
1 #CrawUnivRankingB.py 2 import requests 3 from bs4 import BeautifulSoup 4 import bs4 5 6 def getHTMLText(url)://獲取內容 7 8 9 def fillUnivList(ulist, html)://將數據存到list中 10 11 12 def printUnivList(ulist, num)://展現輸出結果 13 14 15 def main(): 16 uinfo = [] 17 url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2017.html' 18 html = getHTMLText(url) 19 fillUnivList(uinfo, html) 20 printUnivList(uinfo, 20) # 20 univs//提取前20個信息 21 main()
5.而後咱們來實現每一個函數
首先第一個函數很好實現,就是requests庫直接抓取網頁設計
1 def getHTMLText(url): 2 try: 3 r = requests.get(url, timeout=30) 4 r.raise_for_status() 5 r.encoding = r.apparent_encoding 6 return r.text 7 except: 8 return ""
timeout設定超時時間,以秒爲單位code
#將數據存到list中 def fillUnivList(ulist,html): soup=BeautifulSoup(html,'html.parser') #查看HTML源碼發現每一所大學都在tbody標籤中,這裏一個tr表示一所大學 for tr in soup.find('tbody').children: if isinstance(tr,bs4.element.Tag):#判斷是否爲標籤類型,過濾掉字符串 tds=tr('td') ulist.append([tds[0].string,tds[1].string,tds[2].string]) #pass #將num個list中的數據打印顯示出來,可視化輸出
find()意思是搜索且返回一個結果是字符串類型,同.find_all()參數。
.childreny意思是字節點迭代類型,與.contents相似,用於循環遍歷兒子節點。其餘擴展:
.contents子節點的列表,將<tag>全部兒子節點存入列表;
.descendans子節點的迭代類型,包含全部的子孫節點,用於循環遍歷。
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)))
6.所有代碼
#CrawUnivRankingB.py 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('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/zuihaodaxuepaiming2019.html' html = getHTMLText(url) fillUnivList(uinfo, html) printUnivList(uinfo, 20) # 20 univs main()
運行結果
排名 學校名稱 總分 1 清華大學 94.6 2 北京大學 76.5 3 浙江大學 72.9 4 上海交通大學 72.1 5 復旦大學 65.6 6 中國科學技術大學 60.9 7 華中科技大學 58.9 7 南京大學 58.9 9 中山大學 58.2 10 哈爾濱工業大學 56.7 11 北京航空航天大學 56.3 12 武漢大學 56.2 13 同濟大學 55.7 14 西安交通大學 55.0 15 四川大學 54.4 16 北京理工大學 54.0 17 東南大學 53.6 18 南開大學 52.8 19 天津大學 52.3 20 華南理工大學 52.0 [Finished in 3.9s]