千家信息网

怎么用Python爬取学校专业的数据

发表于:2025-01-26 作者:千家信息网编辑
千家信息网最后更新 2025年01月26日,本篇文章给大家分享的是有关怎么用Python爬取学校专业的数据,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言今天各地的2020年高考
千家信息网最后更新 2025年01月26日怎么用Python爬取学校专业的数据

本篇文章给大家分享的是有关怎么用Python爬取学校专业的数据,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

前言

今天各地的2020年高考成绩陆续可以查询了,考生的志愿填报也随即提上日程。

俗话说,七分考,三分报。想必同学们一定不想因高分低报而浪费分数,也不想低分高报而与大学失之交臂。

如何获取数据

我们使用Python获取了中国教育在线网站的高校数据,共2904条。以下展示数据获取部分代码:

https://gkcx.eol.cn/school/search

具体思路如下:

  1. 分析网页,通过翻页可以发现数据是动态加载的,因此通过Chrome浏览器进行抓包分析获取真实的URL请求地址,并确定请求方式(get还是post);

  2. 使用requests请求网页数据;

  3. 使用json解析并提取数据;

  4. 使用pandas将数据保存到本地

首先打开网址,使用Chrome浏览器的检查功能,切换到Network-XHR,点击翻页进行网络数据抓包,很容易发现数据都是被封装在json中的,如下图所示:

切换到Headers处,确定请求的方法为post请求,得到数据请求的URL地址,其中page参数代表页数,通过遍历即可获取所有数据。代码如下:

# 导入包import numpy as npimport pandas as pdimport requestsimport jsonfrom fake_useragent import UserAgentimport time# 获取一页def get_one_page(page_num):    # 获取URL    url = 'https://api.eol.cn/gkcx/api/'    # 构造headers    headers = {        'User-Agent': UserAgent().random,        'Origin': 'https://gkcx.eol.cn',        'Referer': 'https://gkcx.eol.cn/school/search?province=&schoolflag=&recomschprop=',    }    # 构造data    data = {        'access_token': "",        'admissions': "",        'central': "",        'department': "",        'dual_class': "",        'f211': "",        'f985': "",        'is_dual_class': "",        'keyword': "",        'page': page_num,        'province_id': "",        'request_type': 1,        'school_type': "",        'size': 20,        'sort': "view_total",        'type': "",        'uri': "apigkcx/api/school/hotlists",    }    # 发起请求    try:        response = requests.post(url=url, data=data, headers=headers)    except Exception as e:        print(e)         time.sleep(3)         response = requests.post(url=url, data=data, headers=headers)    # 解析获取数据    school_data = json.loads(response.text)['data']['item']    # 学校名    school_name = [i.get('name') for i in school_data]    # 隶属部门    belong = [i.get('belong') for i in school_data]    # 高校层次    dual_class_name = [i.get('dual_class_name') for i in school_data]    # 是否985    f985 = [i.get('f985') for i in school_data]    # 是否211    f211 = [i.get('f211') for i in school_data]    # 办学类型    level_name = [i.get('level_name') for i in school_data]    # 院校类型    type_name = [i.get('type_name') for i in school_data]    # 是否公办    nature_name = [i.get('nature_name') for i in school_data]    # 人气值    view_total = [i.get('view_total') for i in school_data]    # 省份    province_name = [i.get('province_name') for i in school_data]    # 城市    city_name = [i.get('city_name') for i in school_data]    # 区域    county_name = [i.get('county_name') for i in school_data]    # 保存数据    df_one = pd.DataFrame({        'school_name': school_name,        'belong': belong,        'dual_class_name': dual_class_name,        'f985': f985,        'f211': f211,        'level_name': level_name,        'type_name': type_name,        'nature_name': nature_name,        'view_total': view_total,        'province_name': province_name,        'city_name': city_name,        'county_name': county_name,    })    return df_one# 获取多页def get_all_page(all_page_num):    # 存储表    df_all = pd.DataFrame()    # 循环页数    for i in range(all_page_num):        # 打印进度        print(f'正在获取第{i + 1}页的高校信息')        # 调用函数        df_one = get_one_page(page_num=i+1)        # 追加        df_all = df_all.append(df_one, ignore_index=True)        # 随机休眠        time.sleep(np.random.uniform(2))    return df_allif __name__ == '__main__':    # 运行函数    df = get_all_page(all_page_num=148)

通过上述程序,共获取到2904条数据,数据预览如下:

df.head()

以上就是怎么用Python爬取学校专业的数据,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

0