4.23
8-1 【Python0025】中国大学排名数据分析与可视化
分数 10
作者 doublebest
单位 石家庄铁道大学
【题目描述】以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:
(1)按照排名先后顺序输出不同年份的前10位大学信息,并要求对输出结果的排版进行优化;
(2)结合matplotlib库,对2015-2019年间前10位大学的排名信息进行可视化展示。
(3附加)编写一个查询程序,根据从键盘输入的大学名称和年份,输出该大学相应的排名信息。如果所爬取的数据中不包含该大学或该年份信息,则输出相应的提示信息,并让用户选择重新输入还是结束查询;
【练习要求】请给出源代码程序和运行测试结果,源代码程序要求添加必要的注释。
代码:
# 以软科中国最好大学排名为分析对象,基于requests库和bs4库编写爬虫程序,对2015年至2019年间的中国大学排名数据进行爬取:
# (1)按照排名先后顺序输出不同年份的前10位大学信息,并要求对输出结果的排版进行优化;
# (2)结合matplotlib库,对2015-2019年间前10位大学的排名信息进行可视化展示。
# (3附加)编写一个查询程序,根据从键盘输入的大学名称和年份,输出该大学相应的排名信息。如果所爬取的数据中不包含该大学或该年份信息,则输出相应的提示信息,并让用户选择重新输入还是结束查询
# -*- coding:utf-8 -*-
import requests
import bs4
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import pandas as pd
import csv
# 获取静态网页
def getText(url):
"""获取网页HTML"""
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'}
# 设置头文件信息
try:
r = requests.get(url, headers=header, timeout=10)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except requests.HTTPError:
# 超时提示
print("time out")
# 获取静态网页上的静态数据
def getUniversList(html):
"""获取HTML中的数据信息"""
list_u = []
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
list_u.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])
return list_u
# 打印排名数据
def printUniverseList(list_universe, num):
"""打印测试"""
print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format("排名", "学校名称","省市", "总分"))
for i in range(num):
u = list_universe[i]
if u[0]:
print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format(u[0], u[1], u[2], u[3]))
else:
print("{:^10}\t{:^6}\t{:^10}\t{:^10}".format(i+1, u[1], u[2], u[3]))
def putIntoCsv(list_universe, num):
# 写入数据库
for i in range(num):
u = list_universe[i]
# print(u) :['1 ', '清华大学', '北京', '94.1']
# 1. 打开csv文件,a+的命令保证可以追加写入,utf-8-sig的命令保证写入不会是乱码
f = open('date.csv', 'a+', encoding='utf-8-sig')
# 2. 基于文件对象构建 csv写入对象,dialect='unix'保证不会有空行
csv_writer = csv.writer(f, dialect='unix')
# 3. 构建列表头,第一次写入即可注释掉
# csv_writer.writerow(["排名","学校名称","省份","总分"])
# 4. 写入csv文件内容
csv_writer.writerow(u)
# 5. 关闭文件
f.close()
pass
# 定义爬取主方法
def spiderHtml(url):
list_universe = []
# 爬取网页内容
# print(url)
text = getText(url)
# print(text)
# 获取排名数据
list_universe = getUniversList(text)
# print(list_universe)
# 打印排名,只需执行一次,截图后为了节省时间便注释掉了
# printUniverseList(list_universe,10)
# 写入csv文件存储,只需写入一次
# putIntoCsv(list_universe,10)
if __name__ == '__main__':
urls = [
"http://www.zuihaodaxue.cn/zuihaodaxuepaiming2015_0.html",
"http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html",
"http://www.zuihaodaxue.cn/zuihaodaxuepaiming2017.html",
"http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html",
"http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html"]
year = 2015
for url in urls:
print("%d年:" % (year))
spiderHtml(url)
print("**********************************************************************")
year = year + 1
if year > 2019:
break
print("爬取成功")