Scrapy实战篇(八)之爬取教育部高校名单抓取和分析

2023-11-02 02:50

本文主要是介绍Scrapy实战篇(八)之爬取教育部高校名单抓取和分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  本节我们以网址https://daxue.eol.cn/mingdan.shtml为初始链接,爬取教育部公布的正规高校名单。

  思路:

    1、首先以上面的地址开始链接,抓取到下面省份对应的链接。

    2、在解析具体的省份源代码,获取数据。虽然山东和河南的网页结构和其他不同,我们也不做特殊处理,直接不做抓取即可;将抓取到的数据存储到mongodb数据库

    3、对高校数据做数据分析及数据可视化。

抓取数据

1、定义数据结构

class daxueItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()province = Field()   # 省份name = Field()       # 学校名称bianhao = Field()    # 学校编号zhishujigou = Field() # 直属机构diqu = Field()        # 所属城市名称jibei = Field()      # 学校级别

2、编写爬虫

class DaxueSpider(scrapy.Spider):name = 'daxue'#allowed_domains = ['daxue.eol.cn']start_urls = ['https://daxue.eol.cn/mingdan.shtml']def parse(self, response):              #初始网页的解析函数soup = BeautifulSoup(response.text, 'lxml')gx_url_list = soup.find_all(name='div', class_='province')for gx_url in gx_url_list:url = gx_url.a['href']yield Request(url = url,callback = self.parse_daxue_list)  #回调函数def parse_daxue_list(self,response):#response.encoding = 'utf-8'  # 解决中文乱码soup = BeautifulSoup(response.text, 'lxml')prov = soup.find_all(name='div', class_='title')[0].text.replace('正规高校名单', '')    #获取省份名称dx_list = soup.find_all(name='table', class_='table-x')for dx_details in dx_list:for dx_detail in dx_details.find_all(name='tr'):if (dx_detail == dx_details.find_all(name='tr')[0] or dx_detail == dx_details.find_all(name='tr')[1]):continueelse:daxue = daxueItem()daxue['province'] = provdaxue['name'] = dx_detail.find_all(name='td')[1].textdaxue['bianhao'] = dx_detail.find_all(name='td')[2].textdaxue['zhishujigou'] = dx_detail.find_all(name='td')[3].textdaxue['diqu'] = dx_detail.find_all(name='td')[4].textdaxue['jibei'] = dx_detail.find_all(name='td')[5].textyield daxue

3、将数据存入mongodb数据库,编写pipeline

class MongoPipeline(object):def __init__(self,mongo_url,mongo_db,collection):self.mongo_url = mongo_urlself.mongo_db = mongo_dbself.collection = collection@classmethoddef from_crawler(cls,crawler):return cls(mongo_url=crawler.settings.get('MONGO_URL'),mongo_db = crawler.settings.get('MONGO_DB'),collection = crawler.settings.get('COLLECTION'))def open_spider(self,spider):self.client = pymongo.MongoClient(self.mongo_url)self.db = self.client[self.mongo_db]def process_item(self,item, spider):name = self.collectionself.db[name].insert(dict(item))return itemdef close_spider(self,spider):self.client.close()

4、配置setting文件,需要配置的项:mongodb的连接信息,放开pipeline即可,没有其他复杂的配置。

5、运行项目即可获取数据;刨除山东和河南,我们共抓取数据2361条,全部高校数据均被抓取下来。

代码链接:https://gitee.com/liangxinbin/Scrpay/tree/master/scrapydaxue

分析数据

1、以饼图展示全国高校中,本科和专科的数据占比,代码

def daxue():client = pymongo.MongoClient(host='localhost', port=27017)db = client['test']  # 指定数据库collection = db['daxue']  # 指定集合daxue = collection.find()dx_data = DataFrame(list(daxue))         # 将读取到的mongo数据转换为DataFrame数据集合dx_data = dx_data.drop(['_id'],axis=1)df_jibei = dx_data['jibei']              # 从数据集中取出学校级别一列df = df_jibei.value_counts()             # 统计专科很本科的数据量labels = df.index   # 显示在图形上的标签sizes = df.values   # 要在图中显示的数据# 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falsefig1, ax1 = plt.subplots()ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)  # 使用pie()方法绘制饼图。ax1.axis('equal')ax1.set(title="全国高校本科专科占比")  # 设置饼图标题
plt.show()

抓取的数据中,本科1121,专科1240,由此可见,占比差异不大。

 2、以条形图展示各个身份的高校数量

def daxue_shuliang():client = pymongo.MongoClient(host='localhost', port=27017)db = client['test']  # 指定数据库collection = db['daxue']  # 指定集合daxue = collection.find()dx_data = DataFrame(list(daxue))dx_data = dx_data.drop(['_id'], axis=1)df = dx_data['province']df1 = df.value_counts()ind = np.arange(len(df1.values))width = 0.8fig, ax = plt.subplots()rects1 = ax.bar(ind,df1.values, width, color='SkyBlue')# # Add some text for labels, title and custom x-axis tick labels, etc.ax.set_ylabel('数量')ax.set_title('全国高校分布情况')ax.set_xlabel('省份')ax.set_xticklabels((df1.index))ax.legend()x = np.arange(len(df1.index))# 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.yticks(np.arange(0, 180, 10))                  # 设置y轴的刻度范围plt.xticks(x, df1.index, rotation=45, fontsize=9)  # 设置x轴上显示的省份个数# 在图形上面添加数值,并设置数值的位置# for x, y in enumerate(df1.values):#     plt.text(x, y + 100, '%s' % round(y,2), ha='left')
plt.show()

 

可以看到,江苏省和广东省的高校数量遥遥领先,刚好,这两个省份也是全国经济最发达的两个省份(个人见解);由此可见,教育对省份经济的促进作用。

 

上面我们从省份的维度查看了高校的分布,现在我们从城市的角度出发,在看一下高校在各个城市的分布情况。

def daxue_shuliang_city():client = pymongo.MongoClient(host='localhost', port=27017)db = client['test']  # 指定数据库collection = db['daxue']  # 指定集合daxue = collection.find()dx_data = DataFrame(list(daxue))dx_data = dx_data.drop(['_id'], axis=1)df = dx_data['diqu']df1 = df.value_counts()df1 = df1[df1.values >= 15]             #因城市太多,我们只取了城市大学数量超过15的城市print(df1)ind = np.arange(len(df1.values))width = 0.5fig, ax = plt.subplots()rects1 = ax.bar(ind,df1.values, width, color='SkyBlue')# # Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_title('全国高校分布情况')ax.set_xlabel('城市')ax.set_ylabel('数量')ax.set_xticklabels((df1.index))ax.legend()x = np.arange(len(df1.index))# 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.yticks(np.arange(0, 100, 10))                  # 设置y轴的刻度范围plt.xticks(x, df1.index, rotation=45, fontsize=9)  # 设置x轴上显示的省份个数# 在图形上面添加数值,并设置数值的位置# for x, y in enumerate(df1.values):#     plt.text(x, y + 100, '%s' % round(y,2), ha='left')
plt.show()

从图中可以考到,首都北京的高校数量时最多的,排名前五的城市依次是北京,武汉,广州,重庆,和上海,这五个城市在全国都是经济非常发达的城市。因此我们大致可以得出,城市大学数量和城市经济呈正相关。

 

可能会有人郁闷了,上面我们以省份为维度时,高校数量最多的省份是江苏省,但是以城市为维度时,大学数量超过15的城市,属于江苏省的只有南京和苏州,且排名都不怎么靠前,那好,接下来我们以江苏省为基准,查看江苏省内高校数量的分布情况。

def daxue_shuliang_prov_jiangsu():client = pymongo.MongoClient(host='localhost', port=27017)db = client['test']  # 指定数据库collection = db['daxue']  # 指定集合daxue = collection.find()dx_data = DataFrame(list(daxue))dx_data = dx_data.drop(['_id'], axis=1)dx_data = dx_data[dx_data['province'] == '江苏省']dx_data = dx_data.sort_values('diqu')df1 = dx_data['diqu']df1 = df1.value_counts()ind = np.arange(len(df1.values))width = 0.5fig, ax = plt.subplots()rects1 = ax.bar(ind,df1.values, width, color='SkyBlue')# # # Add some text for labels, title and custom x-axis tick labels, etc.#
    ax.set_title('江苏省高校分布情况')ax.set_xlabel('城市')ax.set_ylabel('数量')ax.set_xticklabels((df1.index))ax.legend()#
    x = np.arange(len(df1.index))# 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.yticks(np.arange(0, 60, 10))                  # 设置y轴的刻度范围plt.xticks(x, df1.index, rotation=45, fontsize=9)  # 设置x轴上显示的省份个数# 在图形上面添加数值,并设置数值的位置# for x, y in enumerate(df1.values):#     plt.text(x, y + 100, '%s' % round(y,2), ha='left')
plt.show()

从图中可以看到,江苏省除了南京市和苏州市之外,其他城市大学数量分布较为均匀,基本都在10个左右;如果加上南京和苏州,计算江苏省内城市平均大学数量,应该会超过10个,城市大学数量平均10个,这在其他省份应该不太多,这也从另一方面说明了为什么江苏省内地区发展均为均衡的原因吧。

 

我们接着查看全国各省份有大学城市的城市大学平均个数

def daxue_shuliang_prov_mean():client = pymongo.MongoClient(host='localhost', port=27017)db = client['test']  # 指定数据库collection = db['daxue']  # 指定集合daxue = collection.find()dx_data = DataFrame(list(daxue))dx_data = dx_data.drop(['_id'], axis=1)
dx_prov = dx_data.groupby('province')    #按照省份对数据进行分组dx_avg_list = []for name, group in dx_prov:    #遍历分组之后的数据,计算平均个数,形成省份和平均数量的字典,添加到列表中dx_avg_dic = {}dx_avg_dic['prov'] = namedx_avg_dic['avg'] = (group['province'].count()/len(group.groupby('diqu')['name'].count())).round(decimals=2)dx_avg_list.append(dx_avg_dic)dx_df = DataFrame(list(dx_avg_list))        #以字典的列表构造df数据集df1 = dx_df.sort_values('avg',ascending=False)ind = np.arange(len(df1['avg']))width = 0.5fig, ax = plt.subplots()rects1 = ax.bar(ind, df1['avg'], width, color='SkyBlue')# # # Add some text for labels, title and custom x-axis tick labels, etc.#
    ax.set_title('全国省份平均高校数量')ax.set_xlabel('省份')ax.set_ylabel('数量')ax.set_xticklabels(df1['prov'])ax.legend()x = np.arange(len(df1['avg']))# 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['SimHei']plt.rcParams['axes.unicode_minus'] = Falseplt.yticks(np.arange(0, 100, 10))  # 设置y轴的刻度范围plt.xticks(x, df1.prov, rotation=45, fontsize=9)  # 设置x轴上显示的省份个数
plt.show()

包含北京,上海,天津,重庆四大直辖市

 

刨除北京,上海,天津,重庆四大直辖市

从上面两张图可以看出,在刨除北京,上海,天津,重庆四个直辖市之后,城市平均大学数量排名第一的是 江苏省,达到了11.13个,也印证了我们上面的分析。

有趣的是,排名第二的河北省,经济却比较落后,可能是距离北京太近了吧,O(∩_∩)O哈哈~

至此,我们完成了对全国高校数据的抓取和分析,仅仅是小试牛刀,完整代码请参见: https://gitee.com/liangxinbin/Scrpay/blob/master/Vsualization.py

 

转载于:https://www.cnblogs.com/lxbmaomao/p/10458107.html

这篇关于Scrapy实战篇(八)之爬取教育部高校名单抓取和分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/327594

相关文章

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud