目錄
1、“中國大學排名定向爬蟲”實例介紹
(1)最好大學網
http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html。
(2)功能描述
輸入:大學排名URL鏈接。
輸出:大學排名信息的屏幕輸出(排名,大學名稱,總分)。
技術路線:requests-bs4。
定向爬蟲:僅對輸入URL進行爬取,不擴展爬取。
(3)程序的結構設計
步驟1:從網絡上獲取大學排名網頁內容:getHTMLText()。
步驟2:提取網頁內容中信息到合適的數據結構:fillUnivList()。
步驟3:利用數據結構展示並輸出結果:printUnivList()。
2、“中國大學排名定向爬蟲”實例編寫
# “中國大學排名定向爬蟲”實例編寫
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): # 檢測tr的類型是否是標籤Tag。
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
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]))
def main():
uinfo = []
url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()
備註:原來是tds[2].string,顯示的是“省市”;故更改爲tds[3].string,顯示的是“總分”。
3、“中國大學排名定向爬蟲”實例優化
中文對齊問題的原因:
: | <填充> | <對齊> | <寬度> | , | <精度> | <類型> |
引號 符號 |
用於填充 的 單 個字符 |
<左對齊 >右對齊 ^居中對齊 |
槽的設定輸 出寬度 |
數字的千位分 隔符適用於整 數和浮點數 |
浮點數小數部分 的精度或字符串 的最大輸出長度 |
整數類型 b,c,d,o,x,X 浮點數類型 e,E,f,% |
當中文字符寬度不夠時,採用西文字符填充;中西文字符佔用寬度不同。
中文對齊問題的解決:
採用中文字符的空格填充:chr(12288)。
# “中國大學排名定向爬蟲”實例優化
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): # 檢測tr的類型是否是標籤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/zuihaodaxuepaiming2016.html"
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()