python爬⾍爬取⼤学排名并存⼊数据库进⾏数据可视化这是本⼈的期末⼤作业,题⽬要求如下:
对中国⼤学专业排名⽹站中2021年,计算机科学与技术专业,进⾏数据爬取和数据可视化。
设计要求:
使⽤requests库中的get⽅法获取⽹页。
提取出该专业的前15所⼤学的数据(排名、学校名称、总分),并保存到sqlite数据库。
使⽤matplotlib库绘制柱状图,实现数据可视化。
需求分析
单个⼤学的信息封装在 <div class="univ-item" data-v-4b3c74f3="">⾥⾯。
其中,排名信息在 <div class="rank-box" data-v-4b3c74f3="" >中。
⼤学信息在 <div class="univ-box" data-v-4b3c74f3="">中。
最终确定我们要筛选的为:
Tag = 'div', attrs = 'ranking'图中绿⾊圆圈表⽰。
Tag = 'a', attrs = 'name-cn'图中蓝⾊圆圈表⽰。
Tag = 'div', attrs = 'score'图中⿊⾊圆圈表⽰name-cn。
1. 需要提取⽹页中有⽤的数据。
2. 然后存⼊sqlite数据库
3. 对sqlite中的数据进⾏可视化输出
4. 需要加限制条件只爬取排名前15的学校。
5. 设计sqlite数据库,创建包含排名、姓名、总分三列的表存取数据。
6. 需要把学校名和总分进⾏柱形图可视化输出。
总体设计
通过主调函数按顺序调⽤如下函数:
1. 使⽤getHTMLText()爬取内容,并返回给主调函数。
2. 使⽤fillUnivList()把爬取成功的数据进⾏筛选分析出有⽤的数据。
3. 使⽤init_db()函数把fillUnivList()处理好的数据保存到sqlite数据库中。
4. 使⽤view()函数把可视化的数据从sqlite中提取出来进⾏柱形图可视化。
5. 程序流程图如下
1. 详细设计
1. 导⼊所需要⽤到的库函数:使⽤requests函数对⽹页进⾏数据爬取、使⽤BeautifulSoup库对⽹页进⾏分析、matplotlib库函数绘
图、导⼊sqlite3内置模块对数据进⾏读取。
2. 编写主调⽤函数:分别建⽴三个列表,uinfo⽤于存取fillUnivList()函数所筛选出的信息,unifo1⽤于存取学校的名字、uinfo2⽤于
保存学校的排名。编写⼀个html变量⽤来保存getHTMLText()函数返回的信息。最后通过⼀个if语句判断是否该继续执⾏其他函数调⽤,分别是fillUnivList()对数据解析、init_db函数对数据读取、view函数绘图。
3. ⾸先调⽤getHTMLText()函数对⽹页进⾏爬取,并设置请求超时时间为30S,将爬取到的数据格式改为UTF-8格式。爬取成功则返回
页⾯内容并保存到主调程序的html变量,爬取失败则返回0,在主调函数终⽌整个程序的执⾏。
4. 爬取成功后主调程序再把html保存的数据通过调⽤fillUnivList()函数解析筛选出有⽤的数据。1、把uinfo列表作为参数传给
fillUnivList()函数⽤于保存学校的有⽤信息。2、⽤包含⽹页内容的字符串来创建Beautifulsoup对象soup。3、遍历univ-ite标签,获得前15⼤学信息,然后在ranking标签中获得每个⼤学排名信息,在name-cn标签中获得每个⼤学校名信息,最后在score标签⾥获得⼤学的总分,把我们需要的相关数据
通过主函数传过来的参数列表ulist列表保存。
5. 通过前⾯⼀步已经得到筛选过的数据的列表uinfo,在主调函数中把uinfo列表和新建uinfo1、uinfo2两个空列表(作为单独保存校名
和总分的列表)作为参数通过init_db()函数在数据库读写:1、新建好数据库,把保存学校信息通过ulist列表存进sqlite数据库中。
2、数据存⼊数据库之后通过遍历查询数据库,并在查询过程中把查询出的校名和总分放进uinfo1和uinfo2列表保存⽤于返回给主调
程序使⽤。
6. 最后⼀步是在主调函数中把init_db()函数返回来的,保存有校名和总分的uinfo1和uinfo2两个列表作为参数,通过view()函数读取进
⾏数据可视化,通过matplotlib库⾥的功能绘制图表,⽤保存有学校名的uinfo1列表作为x轴,保存有学校总分的uinfo2列表作为Y 轴。最后完美输出试图,程序完美运⾏。
程序运⾏结果测试与分析
程序运⾏显⽰结果,对数据进⾏可视化输出
在pycharm中查询sqlite数据库中的信息
详细代码如下
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
import matplotlib as mpl
import sqlite3
'''
getHTMLText函数是获取url的信息,如果获取时间超过30S则超时
获取成功返回⼀个r.txt⽂档,
失败则返回HTMLerror
'''
def getHTMLText(url):  # 获取URL信息,返回html内容
try:
r = (url, timeout=30)#获取⽹页,并设置请求超时的时间为30s
r.raise_for_status() #返回请求后的状态
except:
return 0
'''
fillUnivList函数的作⽤是把getHTMLText爬取到的数据进⾏解析,提取⽹页内容中信息到合适的数据结构.把学校排名、校名和总分筛选出来,存到列表ulist中、分别把分数和校名分别独⽴
存到ulist1、ulist2这两个列表之中
'''
def fillUnivList(ulist, html):  # 将提取的html信息放在列表ulist,ulist1,ulist2中
i=0;
soup = BeautifulSoup(html, 'html.parser')#使⽤包含⽹页内容的字符串来创建Beautifulsoup对象
# print(soup.find('div', attrs='body-container').prettify())
for div in soup.find_all('div', attrs='univ-item'):#使⽤遍历⽅法查所需信息
if(i==15):  #只爬取15条数据
break;
ranking = int(div.find('div', attrs='ranking').string) #把排名信息存⼊变量
name = div.find('a', attrs='name-cn').string  #把学校名字存⼊变量
score = float(div.find('div', attrs='score').string) #把分数存⼊变量r.raise_for_status()
ulist.append((ranking,name,score)) #所有保存到列表list
i=i+1
'''
init_db函数功能是创建⼀个数据库,创建游标、创建表
把fillUnivList函数解析完,筛选出来的数据保存到数据库之中
'''
def init_db(uinfo,uinfo1,uinfo2):
date='C:/etc/ranking.db'# 建⽴数据库
t(date)#连接到date数据库
cur= con.cursor()  # 游标对象
for row ute("select * from schoolRanking"): #遍历数据库
uinfo1.append(row[1]) #将校名保存到列表
uinfo2.append(row[2]) #将总分保存到列表
#ute("delete from schoolRanking") #删除表
conmit()  # 提交
cur.close()    #关闭
con.close()  # 关闭
'''
view函数的功能是把保存有学校名和学校总分对应的分数这两个列表
进⾏数据可视化
'''
def view(uinfo1,uinfo2):  #可视化函数
plt.figure(figsize=(10, 5))  #  创建图表
plt.bar(uinfo1, uinfo2)  #  引⽤2个列表来绘制条形图
plt.title("软科中国最好⼤学排名2021TOP15", color="red")  #打印标题
plt.ylabel("评分") #y轴标题打印
plt.xlabel("学校")  # y轴标题打印
plt.tight_layout()    #删除空⽩
for x, y in enumerate(list(uinfo2)):  #遍历Y轴分数,打印显⽰每条柱形图显⽰分数        (x, y + 1, '%s' % round(y, 1), ha='center')
pass
plt.show()
if __name__ == '__main__':
uinfo = []  #保存学校信息
html网页设计期末大作业uinfo1 = [] #保存学校名字
uinfo2 = [] #保存学校排名
url = 'www.shanghairanking/rankings/bcmr/2021/080901'#软科⽹址
html = getHTMLText(url) #调⽤爬取⽹页信息函数
if (html):
fillUnivList(uinfo,html)  #对爬取到的数据解析
init_db(uinfo,uinfo1,uinfo2)  #调⽤数据库函数进⾏读写数据
view(uinfo1,uinfo2)  #调⽤函数⽤matplotlib画出可视化

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。