当前位置:   article > 正文

Python网络爬虫及数据可视化(软科中国大学专业排名|计算机科学与技术)_对中国大学专业排名网站中2021年,计算机科学与技术专业,进行数据爬取和数据可视化

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

设计内容:

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

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

具体实现思路如下:

1.使用requests库中的get方法获取网页源代码。

2.配合使用BeautifulSoup进行简单的网页结构数据分析及清洗,提取出该专业的前10所大学的数据(学校名称、总分)。

3.使用matplotlib库绘制柱状图

4.用sqlite3将数据写入数据库中

以下是实现后的效果图:

在编写代码之前先将所使用到的库(requests、BeautifulSoup、matplotlib、sqlite3)安装配置好所需环境

  1. >>>pip install requests
  2. >>>pip install bs4
  3. >>>pip install matplotlib
  4. >>>pip install sqlite3

环境搭建完毕后下面进入正题,上代码:

  1. # 导入requests
  2. import requests
  3. # 导入BeautifulSoup
  4. from bs4 import BeautifulSoup
  5. # 导入matplotlib
  6. import matplotlib.pyplot as plt
  7. # 导入numpy
  8. import numpy as np
  9. # 导入sqlite3
  10. import sqlite3
'
运行

以上第一步,首先将下载好的库导入项目中。

第二步开始前我们需要对其网页html结构进行分析,在Chrome浏览器下按F12进入开发者工具,在开发者工具上方可以看到箭头一样的标识按钮,使用它可以快速跳转到指定样式的html结构内部,举个例子:

在这里我们可以得知我们需要的两个数据之一学校名称“清华大学”写在<a></a>标签内,另外我们需要的表示学校分数的数据则写在<div></div>标签内,其标签类名分别定义为:class="name-cn",class="score",在该排名榜网页中其他的学校如:“北京大学”,“浙江大学”,“哈尔滨工业大学”...等也是如此结构,在我们了解需要的数据在html中的基本结构后就可以开始了

  1. # 发送请求,获取响应
  2. response = requests.get('https://www.shanghairanking.cn/rankings/bcmr/2021/080901')
  3. # 从响应中获取数据
  4. home_page = response.content.decode(encoding='utf-8')
  5. # 创建BeautifulSoup对象
  6. soup = BeautifulSoup(home_page, 'lxml')
  7. # 查找网页中的学校名称和成绩数据
  8. school_name = soup.find_all(attrs={'class': 'name-cn'})
  9. score = soup.find_all(attrs={'class': 'score'})
  10. # 创建两个新的列表以便后续使用
  11. school_name_Result = []
  12. score_Result = []
  13. # 遍历将爬取出来的网页数据写入一个新的列表
  14. for i in range(15):
  15. school_name_Result.append(school_name[i].text)
  16. score_Result.append(score[i].text)
  17. # 逆序列表
  18. school_name_Result.reverse()
  19. score_Result.reverse()

以上步骤首先我们通过使用requests中的get方法对该网页进行发送请求,获取响应。

随后通过response.content.decode(encoding='utf-8')从响应中获取数据,创建BeautifulSoup对象将获取到的数据传入指定解析器为lxml。

在第二步开始前我们已经进行过分析

接着通过Beautiful下的find_all方法来通过attrs来指定属性字典进行查找获取到所有类名为'name-cn'的学校名称和类名为'score'的学校分数。

最后我们通过遍历并拿到所需的排名前十五所大学的数据(学校名称、学校分数)分别保存在两个新的列表中,将两组数据按从先到后排序。

  1. # 设置图形化界面的整体长宽大小
  2. plt.figure(figsize=(15,10))
  3. plt.xticks(rotation=45) # 设置x轴显示方法
  4. # 设置y轴最大最小值
  5. plt.ylim(0,100)
  6. # 传递可用参数生成可视化图形
  7. plt.bar(school_name_Result, score_Result)
  8. # 设置标题
  9. plt.title("2021中国大学专业排名————计算机科学与技术")
  10. for i in range(len(school_name_Result)):
  11. plt.text(school_name_Result[i], score_Result[i], score_Result[i], ha="center")
  12. plt.show() # 显示创建的绘图对象

第三步调用matplotlib库初始可视化界面默认参数,设置其长宽大小,x、y轴所使用到的数据,

最后通过show()方法显示可视化界面。

在这里我们可能会出现一个问题导致无法成功运行程序

 提示报错:UserWarning: Glyph 21271 (\N{CJK UNIFIED IDEOGRAPH-5317}) missing from current font.
  FigureCanvasAgg.draw(self)

这是因为matplotlib中文乱码的问题

解决这个问题有两种方案:

①将Mircosoft YaHei UI字体文件(一般在C:\Windows\Fonts路径内可以找到)添加到

自己的python安装目录\Lib\site-packages\matplotlib\mpl-data\fonts\ttf

②添加以下代码为matplotlib库指定默认字体:

  1. # 解决Matplotlib中文乱码问题
  2. mpl.rcParams['font.sans-serif'] = ['SimHei']
  1. # 连接数据库,如没有则新建该数据库
  2. con = sqlite3.connect('csData.db')
  3. print("Open database successfully")
  4. # 在数据库对象中创建一个列表包含主键和两个属性列
  5. stmt="CREATE TABLE if not exists SNAME(ID INT PRIMARY KEY NOT NULL,schoolName CHAR NOT NULL,score FLOAT NOT NULL)"
  6. con.execute(stmt)
  7. print("Table created successfully")
  8. # 创建数据库游标
  9. cur=con.cursor()
  10. # 创建两个列表用于后续保存数据
  11. sqlString=[]
  12. sqlString_Result=[]
  13. # 遍历排名列表并暂时保存于新建的变量中用于传递参数
  14. for i in rank:
  15. sc=school_name_Result[i];
  16. sr=score_Result[i]
  17. sqlString.append(i+1)
  18. sqlString.append(sc)
  19. sqlString.append(sr)
  20. # 将列表强制转换成元组
  21. changeTuple=tuple(sqlString)
  22. sqlString_Result.append(changeTuple)
  23. # 清空字典
  24. sqlString.clear()
  25. # 批量执行多条数据库语句
  26. cur.executemany("insert into SNAME values(?,?,?)",sqlString_Result)
  27. # 选中数据库SNAME中的所有数据
  28. cur.execute("select * from SNAME")
  29. # 遍历返回多个元组
  30. for item in cur.fetchall():
  31. print(item)
  32. print("Check database successfully")

最后通过Python中数据库相关的语句对sqlite3数据库进行操作,数据处理使用到了部分数据类型之间的转换,

通过上述方案即可解决。

完成以上所有步骤后程序正常运行~~~

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读