使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析

  • 简介
  • 开发环境
  • 爬取数据
    • 1.获取网站页面
    • 2.解析网页内容
    • 3.存储数据
  • 可视化分析
    • 基本设置
    • 显示评分排名前十的大学
    • 各地区大学比例

简介

软科中国最好大学排名2019


图一

网站格式如上,我们主要爬取排名、学校名称、省市、总分4个数据。并做可视化分析。

开发环境

  1. Python 3.7
  2. PyCharm
  3. 用到的Python库
    • csv (数据存储)
    • BeautifulSoup (网页内容解析)
    • request (网页下载)
    • pandas (数据读取、分析)
    • matplotlib、pylab (画图)

爬取数据

1.获取网站页面

我们使用request库将整个网页内容下载下来。过程非常的简单。

def getHTMLText(url):try:resp = request.urlopen(url)html_data = resp.read().decode('utf-8')return html_dataexcept:return ""pass

这里request.urlopen(url)返回的是一个response对象,再通过read()方法就可以获得网页的内容了。

2.解析网页内容

我们使用BeautifulSoup来解析整个的网页内容。

通过观察网页源代码的方式我们可以发现

数据内容都存放在这个’tbody’元素中。

不难发现网页上的每一行数据都存放在一个’tr’元素中,每个’tr’元素下的前4个’td’元素就是我们要的数据。

def fillUnivList(ulist, html):soup = BeautifulSoup(html, "html.parser")for tr in soup.find('tbody').children:  # 搜索'tbody'后面的子节点if isinstance(tr, bs4.element.Tag):tds = tr('td')ulist.append([tds[0].string, tds[1].string, tds[2].string, tds[3].string])passpasspass

3.存储数据

我们通过上一步爬取下来的ulist是一个二维的列表,我们要把它转换为字典的形式存储到csv文件中。

def ulist_to_dict(ulist):tag_list = ['index', 'name', 'area', 'score']for i, u in enumerate(ulist):ulist.pop(i)ulist.insert(i, dict(zip(tag_list, u)))passpass

通过运行上面的函数我们就可以将列表中的子列表替换成字典。

def write_to_file(items):with(open('university.csv', 'a', encoding='utf_8_sig', newline='')) as f:fieldnames = ['index', 'name', 'area', 'score']w = csv.DictWriter(f, fieldnames=fieldnames)for i in items:w.writerow(i)passpass

可视化分析

基本设置

我们导入matplotlib

import matplotlib.pyplot as plt

接着做一些设置,让我们画出的图像更加美观。

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['font.family'] = 'sans-serif'
# 解决符号'-'乱码问题
plt.rcParams['axes.unicode_minus'] = False
# 设置主题
plt.style.use('ggplot')
# 设置柱形图图片大小
fig = plt.figure(figsize=(8, 5))
colors1 = "#6D6D6D"

接着导入数据

import pandas as pd
column = ['index', 'name', 'area', 'score']
# 打开csv文件
df = pd.read_csv('university.csv', encoding='utf-8', header=None, names=column, index_col='index')

显示评分排名前十的大学

首先我们要对数据按照大学的评分进行排序


我们可以看到通过pandas导入的数据格式是非常清楚的。
因为分数是直接的数值所以我们可以用pandas内置的sort方法进行排序

df_score = df.sort_values('score', ascending=False)  # asc False降序,True升序

这样我们就得到了排序过的数据。

name1 = df_score.name[:10]  # x轴坐标
score1 = df_score.score[:10]  # y轴坐标

这样可以获得数据中的前10项。

plt.bar(range(10), score1, tick_label=name1)  # 绘制条形图,用range保持顺序一致
plt.ylim(min(df_score.score), max(df_score.score)+5)
plt.title("软科中国最好大学排名2019TOP10", color=colors1)
plt.ylabel("评分")
# 标记数值
for x, y in enumerate(list(score1)):plt.text(x, y + 0.01, '%s' % round(y, 1), ha='center')pass
pl.xticks(rotation=90)  # 旋转270°
plt.tight_layout()  # 去除空白
plt.show()


可以看出清华位居第一并且遥遥领先第二名,北京大学、浙江大学、上海交通大学紧随其后。

各地区大学比例

我们要展示各地区大学所占比例首先要进行数量上的统计

df_area_list = df.get("area").to_list()
df_area_set = set(df_area_list)
areas = {}
for area in df_area_set:areas[area] = df_area_list.count(area)pass

首先我们将地区这一列数据单独提取出来然后转换为列表格式df_area_list。在创建一个集合df_area_set,通过创建集合的方式可以非常简便的对列表进行去重。然后根据集合中的每一个元素在列表中统计他们出现的次数,最终将他们存储在字典中。

areas_sorted = dict(sorted(areas.items(), key=lambda mys: (mys[1]), reverse=True))
area = list(areas_sorted.keys())
counts = list(areas_sorted.values())
show_area = area[:15]
show_area.append("其它省")
show_counts = counts[:15]
show_counts.append(sum(counts[15:]))

然后我们将统计好的数据进行进一步的处理,首先对字典进行排序,这里用到了lambda表达式,这样的写法就可以按照字典的值进行排序,如果填写mys[0]的话就会按照字典的键进行排序。
排序完成后我们整理一下要展示的数据就可以进行可视化操作了。

plt.pie(show_counts, labels=show_area, autopct='%1.1f%%', shadow=False, startangle=150, radius=1.0, labeldistance=1.1)
plt.title("全国各地区大学比例", color=colors1)
plt.tight_layout()
plt.show()

plt.pie()画一个饼图,参数如下

  1. x :(每一块)的比例,如果sum(x) > 1会使用sum(x)归一化;
  2. labels :(每一块)饼图外侧显示的说明文字;
  3. explode :(每一块)离开中心距离;
  4. startangle :起始绘制角度,默认图是从x轴正方向逆时针画起,如设定=90则从y轴正方向画起;
  5. shadow :在饼图下面画一个阴影。默认值:False,即不画阴影;
  6. labeldistance :label标记的绘制位置,相对于半径的比例,默认值为1.1, 如<1则绘制在饼图内侧;
  7. autopct :控制饼图内百分比设置,可以使用format字符串或者format function
    '%1.1f’指小数点前后位数(没有用空格补齐);
  8. pctdistance :类似于labeldistance,指定autopct的位置刻度,默认值为0.6;
  9. radius :控制饼图半径,默认值为1;
  10. counterclock :指定指针方向;布尔值,可选参数,默认为:True,即逆时针。将值改为False即可改为顺时针。
  11. wedgeprops :字典类型,可选参数,默认值:None。参数字典传递给wedge对象用来画一个饼图。例如:wedgeprops={‘linewidth’:3}设置wedge线宽为3。
  12. textprops :设置标签(labels)和比例文字的格式;字典类型,可选参数,默认值为:None。传递给text对象的字典参数。
  13. center :浮点类型的列表,可选参数,默认值:(0,0)。图标中心位置。
  14. frame :布尔类型,可选参数,默认值:False。如果是true,绘制带有表的轴框架。
  15. rotatelabels :布尔类型,可选参数,默认为:False。如果为True,旋转每个label到指定的角度。

最终我们得到的图如下

可以看出北京、江苏的优秀大学数量较多。

使用Python爬取“最好大学网”软科中国最好大学排名2019并做可视化分析相关推荐

  1. 爬取的是最好大学网软科中国最好大学排名2019

    1.分析网页 本次爬取的是最好大学网软科中国最好大学排名2019:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html 2.爬取可行性分析: 理论 ...

  2. Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

    爬取过程在这里: Python爬取你好李焕英豆瓣短评并利用stylecloud制作更酷炫的词云图 本文基于前文爬取生成的douban.txt,基于SnowNLP做情感分析. 依赖库: 豆瓣镜像比较快: ...

  3. 用Python爬取淘宝网商品信息

    用Python爬取淘宝网商品信息 转载请注明出处 网购时经常会用到淘宝网 点我去淘宝但淘宝网上的商品琳琅满目,于是我参照中国大学 MOOC的代码写了一个爬取淘宝网商品信息的程序 代码如下: impor ...

  4. 用python输出所有的玫瑰花数_用Python爬取WordPress官网所有插件

    转自丘壑博客,转载注明出处 前言 只要是用WordPress的人或多或少都会装几个插件,可以用来丰富扩展WordPress的各种功能.围绕WordPress平台的插件和主题已经建立了一个独特的经济生态 ...

  5. python爬房源信息_用python爬取链家网的二手房信息

    题外话:这几天用python做题,算是有头有尾地完成了.这两天会抽空把我的思路和方法,还有代码贴出来,供python的初学者参考.我python的实战经历不多,所以代码也是简单易懂的那种.当然过程中还 ...

  6. python爬取千图网_python爬取lol官网英雄图片代码

    python爬取lol官网英雄图片代码可以帮助用户对英雄联盟官网平台的皮肤图片进行抓取,有很多喜欢lol的玩家们想要官方的英雄图片当作自己的背景或者头像,可以使用这款软件为你爬取图片资源,操作很简单, ...

  7. Python爬取不羞涩网小姐姐图片——BeautifulSoup应用

    引言 今年提倡原地过年,相信很多朋友都没有回家过年,像我就被迫留在深圳过年了,无聊之余只能去看看电影爬爬山.今天给大家带来一个打发无聊时光的案例,用Python爬取不羞涩网小姐姐图片,并保存到本地,老 ...

  8. python 爬取淘宝网课

    python爬取淘宝网课,打开web控制台,发现有个链接可以下载到对应的内容,下载的格式是m3u8,用文本打开里面是许多.ts链接,当然百度后得知可以直接下个vlc然后下载,但是还是想用python试 ...

  9. 使用python爬取斗图网的图片

    使用python爬取斗图网的图片 以下是代码部分: # -*- coding: utf-8 -*- """ Created on Wed Apr 14 14:41:42 ...

最新文章

  1. Python计算机视觉——SIFT特征
  2. lm-sensors工具安装和使用
  3. 将指定目录下的sql文件名写入到txt文件中
  4. Thread Group(线程组)
  5. 【模型解读】说说移动端基准模型MobileNets
  6. php静态登录界面代码,JSP_JSP登录验证功能的实现,静态的登录界面的设计login.htm - phpStudy...
  7. Filecoin将启动第一轮全球社区开发者二次方投票资助计划和线上Hackathon
  8. 征集企业非技术面试疑难问题
  9. nessus 命令行新建用户_【笔记3】命令行基础
  10. HTTP Basic Authentication
  11. head first 设计模式(限量珍藏版)挂图
  12. Matlab2014的下载和安装激活过程
  13. python恶搞图_Python恶搞代码
  14. 漫游书海-我的阅读简史
  15. MindMaster如何恢复未保存的内容
  16. 日志收集系统Flume笔记(基础版)
  17. 智能驾驶功能软件平台设计规范 第一部分:系统架构
  18. 智能客服工单系统与工单管理系统的区别
  19. php大转盘程序,jQuery幸运大转盘_jQuery+PHP抽奖程序(下)
  20. 假期的生活,以及wifi和WLAN的区别

热门文章

  1. 虚幻4游戏菜单功能的实现
  2. Django项目实战:CMDB资产扫描和DevOPS自动化运维
  3. 魔塔之拯救白娘子~我的第一个VB6+DX8做的小游戏源码~23开始游戏-存档管理
  4. [WUSTCTF2020]情书-WP
  5. Google地图Api国内域名
  6. Retrofit examples
  7. 采用3D打印制造整枚火箭?Relativity工厂内部曝光
  8. 华为的测试机是什么手机软件,iPhone手机的测距仪你用过吗?华为手机可有类似软件?...
  9. FFMPEG音频视频开发: 视频转码、合并、修改分辨率、比特率
  10. MacOS Homebrew使用文档