功能描述
- 輸入:大學(xué)排名URL鏈接
- 輸出:大學(xué)排名信息的屏幕輸出(排名贯卦,大學(xué)名稱,總分)
- 技術(shù)路線:requests-bs4
-
定向爬蟲:僅對輸入URL進(jìn)行爬取撵割,不擴(kuò)展爬取。
經(jīng)查看網(wǎng)頁源代碼發(fā)現(xiàn)羹与,要爬取的內(nèi)容均寫在html網(wǎng)頁中,所以這個定向爬蟲是可以實(shí)現(xiàn)的纵搁。
而且查看爬取網(wǎng)頁的robots協(xié)議,發(fā)現(xiàn)無此頁面徘层,說明爬取大學(xué)排名這個功能是完全可以合法實(shí)現(xiàn)的利职。
QQ圖片20200414165828.png -
實(shí)現(xiàn)目標(biāo):
能夠打印出如下所示的表格:
image.png
程序的結(jié)構(gòu)設(shè)計
- 步驟一:從網(wǎng)絡(luò)上獲取大學(xué)排名的網(wǎng)頁內(nèi)容
getHTMLText() - 步驟二:提取網(wǎng)頁內(nèi)容中信息放到合適的數(shù)據(jù)結(jié)構(gòu)中,這樣可以將信息編程代碼的一部分(關(guān)鍵u尉础热押!)
getUnivList() - 步驟三:利用數(shù)據(jù)結(jié)構(gòu)展示并輸出結(jié)果
printUnivList()
經(jīng)分析,爬取到的內(nèi)容是個二維數(shù)據(jù)結(jié)構(gòu)桶癣,所以可以采取列表的方式(二維列表:即列表中的每個元素又是一個列表)
- 代碼實(shí)現(xiàn):
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 ""
#提取html中關(guān)鍵數(shù)據(jù),添加到一個列表中
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
#尋找tbody標(biāo)簽并對其孩子節(jié)點(diǎn)進(jìn)行遍歷肿仑,這里的tr是一所大學(xué)對應(yīng)的信息
#需要過濾掉非標(biāo)簽類型的其他信息
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])
#需要進(jìn)行格式化輸出
def printUnivList(ulist, num):
#打印表頭
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","學(xué)校名稱","總分", 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) # 只輸出前20名
main()
- 輸出結(jié)果:
排名 學(xué)校名稱 總分
1 清華大學(xué) 北京市
2 北京大學(xué) 北京市
3 浙江大學(xué) 浙江省
4 上海交通大學(xué) 上海市
5 復(fù)旦大學(xué) 上海市
6 南京大學(xué) 江蘇省
7 中國科學(xué)技術(shù)大學(xué) 安徽省
8 哈爾濱工業(yè)大學(xué) 黑龍江省
9 華中科技大學(xué) 湖北省
10 中山大學(xué) 廣東省
11 東南大學(xué) 江蘇省
12 天津大學(xué) 天津市
13 同濟(jì)大學(xué) 上海市
14 北京航空航天大學(xué) 北京市
15 四川大學(xué) 四川省
16 武漢大學(xué) 湖北省
17 西安交通大學(xué) 陜西省
18 南開大學(xué) 天津市
19 大連理工大學(xué) 遼寧省
20 山東大學(xué) 山東省
- 知識點(diǎn):
此方法在中文輸出排版方面很有效尤慰。
python中format函數(shù)用法
chr()函數(shù)用法
format方法中兩個重要屬性:
①填充:用于填充的單個字符
②寬度:槽的設(shè)定輸出寬度
當(dāng)中文字符寬度不夠時雷蹂,采用西文字符填充;中西文字符占用寬度不同
中文對齊問題是一個通用問題匪煌,在任何需要中英文混合輸出的情況下,他都是個問題
解決方案:
字符寬度不夠時用中文字符填充而不是西文字符填充霜医,那么對齊的問題就解決了
UTF-8編碼對應(yīng)的中文空格信息叫做12288
我們可以用chr(12288)來引入到函數(shù)中