"中國大學排名"定向爬蟲示例
課程地址:http://open.163.com/movie/2019/5/G/6/MEEMCM1NP_MEEU3UFG6.html
#功能描述:
#輸入:大學排名URL鏈接
#輸出:大學排名信息的屏幕輸出(排名,大學名稱,總分)
#使用技術:requests庫和bs4
#定向爬蟲:僅對輸入URL進行爬取,不擴展爬取
#是否可以實現:查看網頁源代碼判斷是否是靜態頁面
#查看robots協議:網頁不存在(無robots協議)
'''
程序的結構設計:
1、從網絡上獲取大學排名網頁內容——getHTMLText();
2、提取網頁內容中信息到合適的數據結構——fillUnivList();
3、利用數據結構展示並輸出結果——printUnivList()
'''
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])
#num指打印多少個元素出來
def printUnivList(ulist,num):
#格式化輸出
'''
中文字符寬度不夠,系統用英文進行填充,導致對齊出現問題
print("{:^10}\t{:^6}\t{:^10}".format("排名","學校名稱","總分"))
for i in range(num):
u=ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))
採用中文字符的空格填充chr(12288)
'''
#優化後的格式化輸出
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)))
if __name__ == '__main__':
uinfo=[]#大學信息列表
url="http://www.zuihaodaxue.com/zuihaodaxuepaiming2016.html"
html=getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,20)