前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者:Python头条

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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

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

高考成绩可以查询了,用Python爬取数据:看看哪些学校专业更受宠 Python 第1张

 

如何获取数据

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

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

 

具体思路如下:

  1. 分析网页,通过翻页可以发现数据是动态加载的,因此通过Chrome浏览器进行抓包分析获取真实的URL请求地址,并确定请求方式(get还是post);
  2. 使用requests请求网页数据;
  3. 使用json解析并提取数据;
  4. 使用pandas将数据保存到本地

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

高考成绩可以查询了,用Python爬取数据:看看哪些学校专业更受宠 Python 第2张

 

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

# 导入包
import numpy as np
import pandas as pd
import requests
import json
from fake_useragent import UserAgent
import 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_all

if __name__ == '__main__':
    # 运行函数
    df = get_all_page(all_page_num=148) 

 

 

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

df.head() 

 

高考成绩可以查询了,用Python爬取数据:看看哪些学校专业更受宠 Python 第3张
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄