python爬虫爬取大学排名并存入数据库进行数据可视化

这是本人的期末大作业,题目要求如下:

对中国大学专业排名网站中2021年,计算机科学与技术专业,进行数据爬取和数据可视化。

URL地址:https://www.shanghairanking.cn/rankings/bcmr/2021/080901

设计要求:

使用requests库中的get方法获取网页。

提取出该专业的前15所大学的数据(排名、学校名称、总分),并保存到sqlite数据库。

使用matplotlib库绘制柱状图,实现数据可视化。

需求分析

首先对我们要爬取的页面进行分析,网页的URL地址为:https://www.shanghairanking.cn/rankings/bcmr/2021/080901,我们首先看看他的源代码如下图所示

python爬虫爬取大学排名并存入数据库进行数据可视化

单个大学的信息封装在 里面。

其中,排名信息在 中。

大学信息在 中。

最终确定我们要筛选的为:

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. 程序流程图如下

python爬虫爬取大学排名并存入数据库进行数据可视化
  1. 详细设计

  2. 导入所需要用到的库函数:使用requests函数对网页进行数据爬取、使用BeautifulSoup库对网页进行分析、matplotlib库函数绘图、导入sqlite3内置模块对数据进行读取。

  3. 编写主调用函数:分别建立三个列表,uinfo用于存取fillUnivList()函数所筛选出的信息,unifo1用于存取学校的名字、uinfo2用于保存学校的排名。编写一个html变量用来保存getHTMLText()函数返回的信息。最后通过一个if语句判断是否该继续执行其他函数调用,分别是fillUnivList()对数据解析、init_db函数对数据读取、view函数绘图。
  4. 首先调用getHTMLText()函数对网页进行爬取,并设置请求超时时间为30S,将爬取到的数据格式改为UTF-8格式。爬取成功则返回页面内容并保存到主调程序的html变量,爬取失败则返回0,在主调函数终止整个程序的执行。
  5. 爬取成功后主调程序再把html保存的数据通过调用fillUnivList()函数解析筛选出有用的数据。1、把uinfo列表作为参数传给fillUnivList()函数用于保存学校的有用信息。2、用包含网页内容的字符串来创建Beautifulsoup对象soup。3、遍历univ-ite标签,获得前15大学信息,然后在ranking标签中获得每个大学排名信息,在name-cn标签中获得每个大学校名信息,最后在score标签里获得大学的总分,把我们需要的相关数据通过主函数传过来的参数列表ulist列表保存。
  6. 通过前面一步已经得到筛选过的数据的列表uinfo,在主调函数中把uinfo列表和新建uinfo1、uinfo2两个空列表(作为单独保存校名和总分的列表)作为参数通过init_db()函数在数据库读写:1、新建好数据库,把保存学校信息通过ulist列表存进sqlite数据库中。2、数据存入数据库之后通过遍历查询数据库,并在查询过程中把查询出的校名和总分放进uinfo1和uinfo2列表保存用于返回给主调程序使用。
  7. 最后一步是在主调函数中把init_db()函数返回来的,保存有校名和总分的uinfo1和uinfo2两个列表作为参数,通过view()函数读取进行数据可视化,通过matplotlib库里的功能绘制图表,用保存有学校名的uinfo1列表作为x轴,保存有学校总分的uinfo2列表作为Y轴。最后完美输出试图,程序完美运行。

程序运行结果测试与分析

程序运行显示结果,对数据进行可视化输出

python爬虫爬取大学排名并存入数据库进行数据可视化

在pycharm中查询sqlite数据库中的信息

python爬虫爬取大学排名并存入数据库进行数据可视化

详细代码如下

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 = requests.get(url, timeout=30)#获取网页,并设置请求超时的时间为30s
        r.raise_for_status() #返回请求后的状态
        r.encoding = 'UTF-8' #更改为UTF-8格式
        return r.text
    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'# 建立数据库
    con=sqlite3.connect(date)#连接到date数据库
    cur= con.cursor()  # 游标对象
    cur.execute('create table IF NOT exists schoolRanking(ranking,name primary key,score)')  # 创建表
    cur.executemany('insert or ignore into schoolRanking values(?,?,?)',uinfo)#保存到数据库
    for row in cur.execute("select * from schoolRanking"): #遍历数据库
        uinfo1.append(row[1]) #将校名保存到列表
        uinfo2.append(row[2]) #将总分保存到列表
    #cur.execute("delete from schoolRanking") #删除表
    con.commit()  # 提交
    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.xticks(rotation=60)  # x学校名字旋转60°
    mpl.rcParams['font.sans-serif'] = ['SimHei']  # 解决符号乱码问题
    plt.tight_layout()    #删除空白
    for x, y in enumerate(list(uinfo2)):   #遍历Y轴分数,打印显示每条柱形图显示分数
        plt.text(x, y + 1, '%s' % round(y, 1), ha='center')
        pass
    plt.show()

if __name__ == '__main__':
    uinfo = []  #保存学校信息
    uinfo1 = [] #保存学校名字
    uinfo2 = [] #保存学校排名
    url = 'https://www.shanghairanking.cn/rankings/bcmr/2021/080901'#软科网址
    html = getHTMLText(url) #调用爬取网页信息函数
    if (html):
        fillUnivList(uinfo,html)  #对爬取到的数据解析
        init_db(uinfo,uinfo1,uinfo2)  #调用数据库函数进行读写数据
        view(uinfo1,uinfo2)  #调用函数用matplotlib画出可视化

Original: https://blog.csdn.net/weixin_46308934/article/details/122254991
Author: 百香果先森
Title: python爬虫爬取大学排名并存入数据库进行数据可视化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/764224/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • flinksql读写redis

    最近有个需求,需要使用flinksql读写redis,由于官网上并没有redis的connector,在网上找了很久,开源的几个connector又没法满足要求,所有这里就自己动手…

    Python 2023年10月19日
    044
  • matplotlib使用及相关函数参数总结

    matplotlib python-2D绘图使用的套件。 pylab是matplotlib面向对象绘图的一个接口,语法和matlab相近。 from pylab import * …

    Python 2023年9月3日
    034
  • Python 偷偷爬取QQ音乐全部歌曲,这听起来就不错

    Original: https://www.cnblogs.com/123456feng/p/16137845.htmlAuthor: 蚂蚁ailingTitle: Python …

    Python 2023年5月24日
    062
  • 自动化测试流程

    1、新建一个工程project(在python里创建一个文件夹) 2、再在这个project中创建testcase文件夹(测试用例)和report文件夹(测试报告) 3、在test…

    Python 2023年6月12日
    080
  • 浅谈pygame.sprite的精灵碰撞

    Collision detection between two sprites, using masks. 返回 masks 碰撞的 mask 上的第一个点,如果没有碰撞,则返回 …

    Python 2023年9月18日
    049
  • Flask之jinja2模板(二)

    目录 模板结构 流程控制-选择结构 控制流程-循环结构 for循环练习之99乘法表 宏 宏的使用 模板中宏的使用 模板结构 流程控制-选择结构 所有的控制语句都是放在 {% ……

    Python 2023年8月15日
    060
  • 【人工智能基础】鸢尾花分类 – 机器学习领域的Hello World

    1 项目简介 【参考】鸢尾花分类 【背景】假设有一名植物学爱好者对她发现的鸢尾花的品种很感兴趣。她收集了每朵鸢尾花的一些测量数据:花瓣的长度和宽度以及花萼的长度和宽度,所有测量结果…

    Python 2023年10月25日
    033
  • 我的第一个Scrapy爬虫,入门级原理详解,附详细源码

    平时写了很多小爬虫,最近找到一个小网页,页面特别简单,文章地址如下: (闲来无事,写个小爬虫,爬取1800篇高中作文)可以先了解一下爬取原理https://blog.csdn.ne…

    Python 2023年10月5日
    041
  • JS模块化

    模块化规范 1.CommonJS规范 ​ 在node中,默认支持的模块化规范叫做CommonJS, ​ 在CommonJS中,一个js文件就是一个模块 CommonJS规范 引入模…

    Python 2023年10月13日
    037
  • 分库分表问题

    数据库可以通过主从复制将数据复制多份实现读写分离,读走从库,写走主库,应对量并发读的能力,同时提高数据安全性。 但是对于单个表,还存在很多问题,比如: 单表记录过多,字段加上索引,…

    Python 2023年10月23日
    038
  • 复现开源论文代码总结

    复现开源论文代码总结 1. 找到开源论文的代码 2. 阅读README.md说明文档 3. 代码下载与解压 4. 配置环境、下载数据集与预训练权重 5. 运行代码,排错 参考 随着…

    Python 2023年9月28日
    0118
  • python基础-模块和包

    包就是一个文件夹,里面放着一个个py文件或子包; 在包中可以被调用的一个个py文件,我们叫做模块; 如上,test就是一个包、two.py就是test下的一个模块,child是子包…

    Python 2023年10月30日
    037
  • pd.DataFrame.melt()函数

    对这个函数的理解就是二维变一维,就是逆序数列 melt(self, id_vars=None, value_vars=None, var_name=None, value_name…

    Python 2023年8月19日
    059
  • linux pandas教程_Pandas 学习笔记

    安装 如果做数据分析用途建议使用Anaconda,自带pandas numy 以及很多库,还有集成开发环境Spyder(自带的变量查看器很好用) WIN LINUX MAC均支持。…

    Python 2023年8月21日
    040
  • 【pytest-fixture】七、设计合理的fixture结构

    我基本上是跟着官网去学习fixture,自己先看并学了一遍,为了方便后续查看和记忆,所以将学习笔记记录下来,如果有不对的地方,欢迎大家评论区指出。 目录 * – 1.使…

    Python 2023年9月14日
    063
  • pyhton_Pandas教程

    Pandas 是 Python 语言的一个扩展程序库,用于数据分析。 Pandas 是一个开放源码、BSD 许可的库,提供高性能、易于使用的数据结构和数据分析工具。 Pandas …

    Python 2023年11月3日
    037
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球