Python批量获取高校基本信息

2023-05-16

文章目录

  • 前言
  • 一、需求
  • 二、分析
  • 三、处理
  • 四、运行效果


前言

为了更好的掌握数据处理的能力,因而开启Python网络爬虫系列小项目文章。

  1. 小项目小需求驱动,每篇文章会使用两种以上的方式(Xpath、Bs4、PyQuery、正则等)获取想要的数据。
  2. 博客系列完结后,将会总结各种方式。

一、需求

  • 获取高校数据

    • 高校排行(软科综合、校友会综合、武书连)
    • 基本信息(博士点、硕士点、创建时间、占地面积、学校地址)
  • 多种数据存储方式

    • 本地文件存储

    • redis

    • MongoDB

二、分析

F12 打开抓包工具,刷新https://www.gaokao.cn/school/search接口页面

在这里插入图片描述

name.json 接口包含所有的高校id

在这里插入图片描述

进入学校详情页,获取到info.json接口信息

在这里插入图片描述

数据可以直接通过请求接口即可返回
已获取学校id(一共2820个数据,可以用上协程异步访问提高获取的数据的速度)
已获取学校信息的接口https://static-gkcx.gaokao.cn/www/2.0/json/live/v2/school/102/info.json(只需要修改下学校id即可访问其它学校信息)

三、处理

编写获取大学id的接口


import requests
import json
HEADERS = {"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36"}

# 获取大学school_id
def get_school_id():
    url= "https://static-data.gaokao.cn/www/2.0/school/name.json"
    res = requests.request("GET",url=url,headers=HEADERS)
    res.encoding = "utf-8"
    # 转为json格式
    data = json.loads(res.text)
    return data

获取一次以后,本地可以进行处理提取学校id

import re
def get_id():
    f = open("name.txt", "r", encoding="utf-8")
    f1 = f.read()
    deal = re.compile(r"'school_id': '(?P<id>.*?)'",re.S)
    result = deal.findall(f1)
    # print(len(result))
    f.close()
    return  result

编写访问学校信息的接口请求


def get_school_info_1():
    url = "https://static-data.gaokao.cn/www/2.0/school/3419/info.json"
    res = requests.request("GET",url=url,headers=HEADERS)
    res.encoding = "utf-8"
    # 转为json格式
    data = json.loads(res.text)
    return data

协程异步访问接口请求(本地文件存储)

import asyncio
import aiohttp
import aiofiles


# 获取学校详细信息
async def get_school_info(url,sem):
    try:
        async with sem:
            async with aiohttp.ClientSession() as session:
                # 发送请求
                async with session.get(url) as res:
                    # 读取数据
                    content = await res.text(encoding="utf-8")
                    data = json.loads(content)
                    # 高校排行- 软科综合/校友会排名/武书连/US世界
                    school_info = {}
                    school_info["学校名称"] = data["data"]["name"]
                    school_info["软科综合"] = data["data"]["ruanke_rank"]
                    school_info["武书连"] = data["data"]["wsl_rank"]
                    school_info["校友会"] = data["data"]["xyh_rank"]
                    school_info["US世界"] = data["data"]["us_rank"]
                    # 博士点/硕士点/国家重点学科
                    school_info["博士点"] = data["data"]["num_doctor"]
                    school_info["硕士点"] = data["data"]["num_master"]
                    school_info["国家重点学科"] = data["data"]["num_subject"]
                    # 创建时间/占地面积/学校地址
                    school_info["创建时间"] = data["data"]["create_date"]
                    school_info["占地面积"] = data["data"]["area"]
                    school_info["学校地址"] = data["data"]["address"]
                    # 写入文件
                    async with aiofiles.open("school_info.txt",mode="a") as f:
                        await f.write(f"{str(school_info)}\n")
                        print("一条数据下载完毕!")
    except Exception as e:
        print(e)
 
 async def main(list_id):
    # 添加信号量控制速度
    sem = asyncio.Semaphore(100)
    tasks = []
    for i in list_id:
        # https://static-data.gaokao.cn/www/2.0/school/3419/info.json
        url = f"https://static-data.gaokao.cn/www/2.0/school/{i}/info.json"
        # 创建任务
        task = asyncio.create_task(get_school_info(url,sem))
        tasks.append(task)
    await asyncio.wait(tasks)



if __name__ == '__main__':
    # 本地获取id
    id_list = get_id()
  	asyncio.run(main(id_list))

写入Redis数据库,
如有报错DataError: Invalid input of type: ‘NoneType’. Convert to a byte, string or number first.
解决方法,降低redis版本 pip install redis==2.10.6

# 获取学校详细信息
async def get_school_info(url,sem):
    try:
        async with sem:
            async with aiohttp.ClientSession() as session:
                # 发送请求
                async with session.get(url) as res:
                    # 读取数据
                    content = await res.text(encoding="utf-8")
                    data = json.loads(content,encoding="utf-8")
                    # 高校排行- 软科综合/校友会排名/武书连/US世界
                    school_info = {}
                    school_name = data["data"]["name"]
                    school_info["软科综合"] = data["data"]["ruanke_rank"]
                    school_info["武书连"] = data["data"]["wsl_rank"]
                    school_info["校友会"] = data["data"]["xyh_rank"]
                    school_info["US世界"] = data["data"]["us_rank"]
                    # 博士点/硕士点/国家重点学科
                    school_info["博士点"] = data["data"]["num_doctor"]
                    school_info["硕士点"] = data["data"]["num_master"]
                    school_info["国家重点学科"] = data["data"]["num_subject"]
                    # 创建时间/占地面积/学校地址
                    school_info["创建时间"] = data["data"]["create_date"]
                    school_info["占地面积"] = data["data"]["area"]
                    school_info["学校地址"] = data["data"]["address"]
                    # 写入redis文件中
                    r = connect_redis()
                    r.hset("school",school_name,json.dumps(school_info))
                    print("一条数据写入成功")
    except Exception as e:
        print(e)
  
  # 连接Redis数据库
def connect_redis():
    pool  = redis.ConnectionPool(host="127.0.0.1", port=6379,db=3)
    r = redis.Redis(connection_pool=pool)
    return r

写入MongoDB数据库



import pymongo
from pymongo import MongoClient
# MongoDB数据库初始化
def get_db(database,user=None,pwd=None):
    client = MongoClient(host="localhost",port=27017)
    db = client[database]
    # 有账号密码即验证
    if user:
        db.authenticate(user,pwd)
    return db

# 增加多条数据
def insert_data_many(collection, data):
    db = get_db("school")
    result = db[collection].insert_many(data)
    return result

async def get_s
chool_info(url,sem):
    try:
        async with sem:
            async with aiohttp.ClientSession() as session:
                # 发送请求
                async with session.get(url) as res:
                    # 读取数据
                    content = await res.text(encoding="utf-8")
                    data = json.loads(content,encoding="utf-8")
                    # 高校排行- 软科综合/校友会排名/武书连/US世界
                    school_info = {}
                    school_info["学校名称"] = data["data"]["name"]
                    school_info["软科综合"] = data["data"]["ruanke_rank"]
                    school_info["武书连"] = data["data"]["wsl_rank"]
                    school_info["校友会"] = data["data"]["xyh_rank"]
                    school_info["US世界"] = data["data"]["us_rank"]
                    # 博士点/硕士点/国家重点学科
                    school_info["博士点"] = data["data"]["num_doctor"]
                    school_info["硕士点"] = data["data"]["num_master"]
                    school_info["国家重点学科"] = data["data"]["num_subject"]
                    # 创建时间/占地面积/学校地址
                    school_info["创建时间"] = data["data"]["create_date"]
                    school_info["占地面积"] = data["data"]["area"]
                    school_info["学校地址"] = data["data"]["address"]
                    insert_data_many("school",[school_info])
                    print("一条数据写入成功")
    except Exception as e:
        print(e)
        

四、运行效果

通过Redis可视化工具查看写入的2821条数据

在这里插入图片描述

MongoDB可视化工具查询数据

在这里插入图片描述

本地读取数据

请添加图片描述

完整源码文件附在在知识星球
我正在「Python^self-study」和朋友们讨论有趣的话题,你⼀起来吧?
https://t.zsxq.com/076uG3kOn

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python批量获取高校基本信息 的相关文章

随机推荐

  • 显卡Memory Clock上限问题排查实践

    背景 有一台ASUS 笔电某次重启后 xff0c 发现memory clock被限制为最大300Mhz 而之前的上限是1500Mhz 感到很奇怪 xff0c 之前查过一次 xff0c 但并未解决 今日下决心排查 排查过程 1 xff0c 怀
  • sorry, this application cannot run under a virtual machine

    win11下运行某应用程序A xff0c 报此错误 网上不少文章采用关闭Hyper V的做法 xff0c 但查看后发现并未勾选Hyper V 经搜索 xff0c 有效的解决办法是 xff1a 以管理员权限打开cmd xff0c 执行 bcd
  • TP Link 路由器 设置

    入手某型号的TP LINK 路由器一台 希望做些定制化的设置 记录一下 1 xff0c 光猫拨号改为路由器拨号 光猫的型号是吉比特某款 xff0c 其地址是192 168 1 1 xff0c 此光猫没有无线 所接的路由器地址是192 168
  • 空目录批量添加文件.gitkeep

    背景 1 xff0c 有个项目存在多个空目录 为保持目录结构 xff0c 希望提交时也能提交这些空目录 手动搜寻空目录比较麻烦 xff0c 希望能采用命令行自动搜索 2 xff0c OS为WINDOWS 11 方法 1 xff0c 切换当前
  • 路由器拨号密码恢复

    背景 路由器拨号上网的密码因时间久远遗忘了 xff0c 恢复并记录下过程 步骤 1 xff0c 安装wireshark choco install wireshark y 注意 实践发现wireshark安装后 xff0c 启动提示还需要安
  • 指定 make install 的安装目录的方法

    方法1 xff1a configure prefix 61 your dir make make install 方法2 xff1a configure make make install DESTDIR 61 your dir 方法3 x
  • 如何删除outlook中的重复邮件

    问题背景 xff1a outlook 卸载重装后 xff0c 会把之前已收的邮件 xff0c 再次下载到本地 xff0c 出现大量重复邮件 解决思路 xff1a 搜索outlook邮件删除重复邮件的工具 xff0c 有outlook dup
  • Win10安装安卓模拟器入坑记

    笔记本换了硬盘 xff0c 安装Win10之后 xff0c 装了一堆软件和工具 xff0c 包括Docker for Windows等 xff0c 然后打算安装一个安卓模拟器 之前一直用的逍遥 xff0c 也没碰到啥问题 xff0c 这次就
  • C# 8.0 新特性

    使用C xff03 8 0中的模式 xff0c 做得更多 Visual Studio 2019预览版2已经发布 xff01 伴随它的还有一些C xff03 8 0的功能 xff0c 供您试用 主要是关于模式匹配 xff0c 但我会在最后提到
  • Android:java.io.IOException: Cannot run program "/system/xbin/su": error=13, Permission denied

    java io IOException Cannot run program 34 system xbin su 34 error 61 13 Permission denied 我的情况 同一套App程序 之前跑在Android4 0中没
  • 还在怕不可以和众多女朋友一起聊天,python教你创建多窗口,再也不怕露馅了

    需求描述 创建一个多用户 xff0c 多房间的全双工聊天室 多用户 xff0c 多房间的意思是可以有多个聊天室 xff0c 每个聊天室里可以有多个用户 xff0c 并且用户可以通过输入房间号进入聊天室 全双工的意思是聊天室中的用户在接收其他
  • webrtc媒体服务器介绍

    一 为什么需要流媒体服务 xff1f 众所周知webrtc原生的网络连接方式是P2P通信模型 xff0c 即通信双方是对等的 如下图左侧图 xff0c 通信双方直接进行音视频传输 xff0c 中间的服务器仅做两端的信令交互 将这种P2P方式
  • C语言——基础查漏补缺(二):《C程序设计试题汇编》应试概念总结

    相关文章 xff1a C语言 基础查漏补缺 xff08 一 xff09 xff1a 超长文帮你理清一些概念 C语言 基础查漏补缺 xff08 三 xff09 xff1a 谭浩强红书刷题笔记大杂烩 C语言 基础查漏补缺 xff08 四 xff
  • 6. 用冒泡法实现对10个整数按从小到大的顺序排序输出

    用冒泡法实现对10个整数按从小到大的顺序排序输出 xff08 完成sort1函数 xff09 span class hljs comment include lt stdio h gt span span class hljs keywor
  • Python图形绘制

    文章目录 前言一 turtle海龟绘图二 Python图形绘制三 绘画小黄人习题巩固 前言 海龟绘图很适合用来引导孩子学习编程 最初来自于 Wally Feurzeig Seymour Papert 和 Cynthia Solomon 于
  • 一个项目带你走进软件测试2

    文章目录 前言一 前期准备二 第一阶段1 熟悉软件项目2 阅读测试计划 三 第二阶段1 根据需求规格说明书设计测试用例2 执行测试用例3 提交bug 三 第三阶段关于项目面试问答 文档下载地址 前言 该项目针对在线的项目 xff08 鹏保宝
  • 查看ubuntu版本

    方法1 xff1a 使用命令 xff1a cat proc version 查看 proc目录下记录的当前系统运行的各种数据 version记录的版本信息可以直接通过cat查看到 xff0c 还可以看到我的gcc版本呢 Linux vers
  • 【接口自动化】接口报错500问题解决

    问题呈现 xff1a Python 43 requests接口报错返回500 xff08 后端没进行相关校验 xff0c 直接返回500 xff09 解决探索 xff1a Python 43 request生成的数据放在postman跑 x
  • 【部署教程入门级别】开源会议室小程序部署

    文章目录 前言一 项目整体二 前要准备1 安装Python 开发环境2 安装redis非关系数据库3 安装mysql服务器和客户端4 安装git工具5 安装微信开发工具6 Github或Gitee注册账号 三 正式部署1 pull源码2 部
  • Python批量获取高校基本信息

    文章目录 前言一 需求二 分析三 处理四 运行效果 前言 为了更好的掌握数据处理的能力 xff0c 因而开启Python网络爬虫系列小项目文章 小项目小需求驱动 xff0c 每篇文章会使用两种以上的方式 xff08 Xpath Bs4 Py