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='北京')