Python之爬蟲-中國大學排名
#!/usr/bin/env python
# coding: utf-8
import bs4
import requests
from bs4 import BeautifulSoup
# 通過傳入網址信息創建一個獲取網頁文本的函數
def getHTMLText(url):
# 判斷獲取網頁文本過程中是否有錯誤
try:
# 打開網址獲取文本,並且把延遲設置成30s
r = requests.get(url, timeout=30)
# 獲取狀態碼
r.raise_for_status()
# 設置文件編碼
r.encoding = r.apparent_encoding
# 如果成功返回網頁文本
return r.text
except:
# 獲取網頁文本有錯誤則返回空文本
return ""
# 通過傳入空列表和網頁文本信息創建一個在大學列表中加入大學信息的函數
def fillUnivList(ulist, html):
# 用BeautifulSoup將網頁文本以’html.parser‘煮成一鍋粥
soup = BeautifulSoup(html, "html.parser")
# 通過網頁源代碼我們可以發現我們需要的信息都在tbody標簽內,因此我們循環找出’tbody‘標簽及其子標簽的內容
for tr in soup.find('tbody').children:
# 通過bs4.element.Tag判斷是否為tr標簽
if isinstance(tr, bs4.element.Tag):
# 對於tr標簽的我們拿到tr標簽里的td標簽
tds = tr('td')
# [<td>1</td>, <td><div align="left">清華大學</div></td>, <td>北京</td>, <td>95.3</td>...
# 我們通過篩選出我們需要的td標簽中的文本並將其用列表的方式加入我們傳入的列表ulist中
ulist.append([tds[0].string, tds[1].string,
tds[2].string, tds[3].string])
# 通過傳入學校列表信息創建一個打印大學列表的函數
def printUnivList(ulist,province):
# 打印標題
print("中國最好大學排名2018({}地區)".center(45, '-').format(province))
# 設置一個format格式化的模板
# 注意:這里的{4}是因為utf8格式的英文和中文字節數不同,python會自動用英文來填
tplt = "{0:^10}\t{1:{4}^10}\t{2:^10}\t{3:^10}"
# 充空白位置,我們用chr(12288)將其修改成用中文填充空白位置
# 打印第一行
print(tplt.format("排名", "學校名稱", "地區", "總分", chr(12288)))
if province == '安徽':
print(tplt.format(1, '安徽師范大學花津校區', '安徽', 99.9, chr(12288)))
# 循環取出列表中的每一所大學的信息,取出的大學信息是列表的形式(可以控制range(len(ulist))的長度來控制想要打印的學校的數量)
for i in range(len(ulist)):
# 將每一所大學的信息以列表的形式賦值給u
u = ulist[i]
# u[2]是地區,判斷是否為安徽地區(可以自己更改地區信息,如果刪除該判斷,打印所有學校信息,也可以更改判斷條件)
if u[2] == province:
# 如果為安徽地區,我們打印屬於安徽地區的每一所大學的信息
print(tplt.format(u[0], u[1], u[2], u[3], chr(12288)))
# 創建一個運行函數
def main(province='安徽'):
# 創建一個空列表,為填充大學信息列表做准備
uinfo = []
# 定義一個想要爬取的網頁
url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
# 傳入想要爬取的網頁獲取該網頁文本信息
html = getHTMLText(url)
# 給填充大學信息函數傳值
fillUnivList(uinfo, html)
# 給打印大學信息函數傳值
printUnivList(uinfo,province=province)
main()
# main(province='北京')