其实特简单,1分钟爬取全国高校信息并制成大屏可视化

大家好,记得当初高考完,我选学校的时候是在书店买的高校信息排名的书,然而书中的信息都是很久之前的,并没有什么太大帮助。

【注】文末提供技术交流群

干货推荐

今天就来带大家爬点真正有用的东西,全国高校信息,涵盖绝大多数高校,并制作可视化看板。话不多说,进入正题!

数据爬取

地址:https://www.gaokao.cn/school/140图片F12 打开开发者工具,通过抓包工具很轻松就获取到了 json 文件。图片我们直接对该链接发起请求,就可以获取对应大学的信息。

另外对比发现 https://static-data.eol.cn/www/2.0/school/140/info.json,关键参数 140 为学校ID,但ID不是连续的,所以,我们爬取时只能根据大致的学校数量进行爬取。

爬取代码

导入模块
import aiohttp
import asyncio
import pandas as pd
from pathlib import Path
from tqdm import tqdm
import time

简单说明一下主要模块的用途:

  • aiohttp:可以实现单线程并发 IO 操作。如果仅用在客户端,发挥的威力不大,只是为了搭配 asyncio 来使用,因为 requests 不支持异步。如果把 asyncio 用在服务器端,例如 Web 服务器,由于 HTTP 连接就是 IO 操作,因此可以用 单线程 + coroutine 实现多用户的高并发支持。

  • asyncio:提供了完善的异步IO支持,可以将多个协程(coroutine)封装成一组 Task 然后并发执行。

  • pandas:将爬取的数据转为 DataFrame 类型,并生成 csv 文件。

  • pathlib:面向对象的编程方式来表示文件系统路径。

  • tqdm:只需使用 tqdm(iterable) 包装任何可迭代对象,就能让你的循环生成一个智能进度条。

生成URL序列

通过指定的 URL 模板与 max_id 生成 URL 序列,这里添加了一个去重操作,如果之前已采集过高校信息,它会根据同目录下的文件,剔除已采集的高校ID,仅采集未获取过的高校信息。

def get_url_list(max_id):
    url = 'https://static-data.eol.cn/www/2.0/school/%d/info.json'
    not_crawled = set(range(max_id))
    if Path.exists(Path(current_path, 'college_info.csv')):
        df = pd.read_csv(Path(current_path, 'college_info.csv'))
        not_crawled -= set(df['学校id'].unique())
    return [url%id for id in not_crawled]
采集JSON数据

通过协程对URL序列发出请求,注意要限制并发量,Window:500,Linux:1024

async def get_json_data(url, semaphore):
    async with semaphore:
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36',
        }
        async with aiohttp.ClientSession(connector=aiohttp.TCPConnector(ssl=False), trust_env=True) as session:
            try:
                async with session.get(url=url, headers=headers, timeout=6) as response:
                    # 更改相应数据的编码格式
                    response.encoding = 'utf-8'
                    # 遇到IO请求挂起当前任务,等IO操作完成执行之后的代码,当协程挂起时,事件循环可以去执行其他任务。
                    json_data = await response.json()
                    if json_data != '':
                        return save_to_csv(json_data['data'])
            except:
                return None
数据解析保存

JSON数据中的字段有很多,大家可以根据自己的情况解析保存自己需要的字段。

def save_to_csv(json_info):
    save_info = {}
    save_info['学校id'] = json_info['school_id']              # 学校id
    save_info['学校名称'] = json_info['name']                  # 学校名字
    level = ""
    if json_info['f985'] == '1' and json_info['f211'] == '1':
        level += "985 211"
    elif json_info['f211'] == '1':
        level += "211"
    else:
        level += json_info['level_name']
    save_info['学校层次'] = level                               # 学校层次
    save_info['软科排名'] = json_info['rank']['ruanke_rank']    # 软科排名
    save_info['校友会排名'] = json_info['rank']['xyh_rank']     # 校友会排名
    save_info['武书连排名'] = json_info['rank']['wsl_rank']     # 武书连排名
    save_info['QS世界排名'] = json_info['rank']['qs_world']     # QS世界排名
    save_info['US世界排名'] = json_info['rank']['us_rank']      # US世界排名
    save_info['学校类型'] = json_info['type_name']              # 学校类型
    save_info['省份'] = json_info['province_name']              # 省份
    save_info['城市'] = json_info['city_name']                  # 城市名称
    save_info['所处地区'] = json_info['town_name']              # 所处地区
    save_info['招生办电话'] = json_info['phone']                # 招生办电话
    save_info['招生办官网'] = json_info['site']                 # 招生办官网


    df = pd.DataFrame(save_info, index=[0])

    header = False if Path.exists(Path(current_path, 'college_info.csv')) else True
    df.to_csv(Path(current_path, 'college_info.csv'), index=False, mode='a', header=header)
调度程序

调度整个采集程序。获取URL>>限制并发量>>创建任务对象>>挂起任务

async def main(loop):
    # 获取url列表
    url_list =  get_url_list(5000)
    # 限制并发量
    semaphore = asyncio.Semaphore(500)
    # 创建任务对象并添加到任务列表中
    tasks = [loop.create_task(get_json_data(url, semaphore)) for url in url_list]
    # 挂起任务列表
    for t in tqdm(asyncio.as_completed(tasks), total=len(tasks)):
        await t

以上就是程序运行的主要代码。

运行效果

这里采集ID在5000以内的高校信息,如果要尽可能多的采集高校信息的话,建议多次运行,直至无新增数据。

第一次运行(采集到2140行)图片第二次运行(采集到680行)图片通过两次运行共采集到2820行数据。下面我们开始可视化部分。

Tableau可视化

相比于其他的可视化工具或者第三方绘图库,我更倾向于 Tableau,上手十分简单,想要了解的可以看一下 Tableau Public,这里发布了很多大牛的作品。

https://public.tableau.com/app/discover

它唯一的缺点就是收费,如果是学生的话,可以免费使用,否则,建议先用免费版的 Tableau Public,等到充分了解后再考虑付费。

对于本次的可视化,总共绘制有四个图表。

高校数量分布地图

图片

高校数量排名前三的分别是江苏、广东、河南(仅供参考)

软科高校排名TOP10

图片根据软科排名来看,全国TOP10的高校绝大多数都是综合类,理工类的只有第七名的中国科学技术大学。

高校层次分布

图片从采集的数据中来看, 211 的高校占比本科院校约 9.5% ,985 的高校占比本科院校约 3.5%,果然是凤毛麟角。

高校类型分布

图片学校类型主要还是理工类和综合类,二者数量基本持平,都遥遥领先于其他的类型。数量第二层级为财经类,师范类,医药类。

合成看板

将上述的工作表合并成一个看板,过程十分简单,只需要将图标拖拽到指定位置即可。图片再添加一个筛选操作,点击地图中的某个省份联动其他工作表。图片

看板已发布到 Tableau Public。可以在线编辑,或下载整个可视化工作包,链接如下:
https://public.tableau.com/shared/ZCXWTK6SP?:display_count=n&:origin=viz_share_link

这就是今天要和大家分享的内容,包含数据采集->数据处理->可视化。

小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加入Python学习交流群共同探讨学习。

技术交流

欢迎转载、收藏、有所收获点赞支持一下!

在这里插入图片描述

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

长按关注

  • 1
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
虫(Web Crawler)是一种自动程序,用于从互联网上收集信息。其主要功能是访问网页、提数据并存储,以便后续分析或展示。虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓的场景。 虫的工作流程包括以下几个关键步骤: URL收集: 虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获。 请求网页: 虫使用HTTP或其他协议向目标URL发起请求,获网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 虫对获的HTML进行解析,提有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助虫定位和提目标数据,如文本、图片、链接等。 数据存储: 虫将提的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反虫机制,虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反虫应对: 由于虫的存在,一些网站采了反虫措施,如验证码、IP封锁等。虫工程师需要设计相应的策略来应对这些挑战。 虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
好的,做一个基于Jupyter电影评论数据的可,需要进行以下步骤: 1. 确定数据来源:可以从虫中获电影评论数据,也可以从文件中读数据。 2. 确定数据处理方式:对于虫获的数据,需要对其进行清洗和整理,以便进行可。可以使用Pandas等库进行数据处理。可以使用jieba库进行中文分词。 3. 确定可方式:根据数据的点和需求,选择适合的可方式进行展示。可以使用Matplotlib、Seaborn等库进行数据可。 4. 进行大展示:将可结果呈现在一个大幕上,并进行布局、样式调整等操作。 下面是一个简单的示例代码,以从虫获电影评论数据并进行可为例: ```python # 导入所需的库 import requests import pandas as pd import jieba from wordcloud import WordCloud import matplotlib.pyplot as plt # 数据 url = 'https://movie.douban.com/subject/33420285/comments?status=P' response = requests.get(url) data = response.text # 数据清洗和整理 comments = re.findall('<span class="short">(.*?)</span>', data) comment_list = [] for comment in comments: comment_list.append(comment.strip()) # 中文分词 words = ''.join(comment_list) word_list = jieba.cut(words) # 数据处理 word_count = {} for word in word_list: if len(word) <= 1: continue if word in word_count: word_count[word] += 1 else: word_count[word] = 1 # 生成词云 wc = WordCloud(font_path='simhei.ttf', background_color='white', width=800, height=600, max_words=100).generate_from_frequencies(word_count) # 可展示 plt.imshow(wc, interpolation='bilinear') plt.axis('off') plt.show() ``` 以上代码演示了一个简单的电影评论数据可过程,实际应用中还需要根据具体需求进行更加复杂的数据处理和可操作。同时,大展示的实现方式也需要根据具体情况进行选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值