lzy20021010

用Python编写爬虫爬取福建省新高考选科要求数据
为方便学生选科走班,福建省教育厅学生工作处开发了《福建省高考综合改革——选科走班指南》程序。本来想提取数据整理一份...
扫描右侧二维码阅读全文
27
2019/08

用Python编写爬虫爬取福建省新高考选科要求数据

为方便学生选科走班,福建省教育厅学生工作处开发了《福建省高考综合改革——选科走班指南》程序。本来想提取数据整理一份自己规定的报考专业目录内的专业选科要求。但苦于电脑版页面不知用的何种“奇技淫巧”,HTML代码中没有数据,也没办法复制。手机版虽然可以复制,但不支持自定义显示数量,只能一个一个点,极其麻烦。
后来学习了Python爬虫开发,发现这问题很容易解决。

《福建省高考综合改革——选科走班指南》程序

抓包获取接口

打开Chrome浏览器开发人员工具,切换到“Network”选项卡,进行抓包。
抓取到的API
API地址(调用方式:GET) https://wjt-subject-tool-api.sdp.101.com/v1/actions/manage
参数
2019年8月30日补充,若不发送前两个参数,可以取到所有院校和专业的数据。
按院校或专业查询:

参数说明
school_name院校名称
subject_name专业名称
page当前页数
page_size每页显示数目
_用途不明,默认值:1566884950161

按科目查询:

参数说明
f_subject:首选科目
s_subject再选科目
page当前页数
page_size每页显示数目
_用途不明,默认值:1566884950161

编写Python程序

将下列代码保存为.py文件,用Python运行。运行前需要用pip安装requests、retrying、pandas库。
本文提供的程序代码的查询方式均为“按科目查询”。若要实现“按院校或专业查询”,改一下变量即可。

'''
福建省教育厅《2021年拟在闽招生普通高校本科专业选考科目要求指引》
数据全自动爬取 v2
'''
import requests
from retrying import retry
import json
import pandas as pd
import sys

def getTerm1():
    #输入查询条件
    print("福建省教育厅《2021年拟在闽招生普通高校本科专业选考科目要求指引》")
    print("数据全自动爬取 v2")
    print("")
    print("支持的首选科目要求:")
    print("物理或历史均可")
    print("仅物理")
    print("仅历史")
    f_subject = input("请输入首选科目要求:")
    return f_subject
def getTerm2():
    print("支持的再选科目要求:")
    print("不提再选科目要求")
    print("地理必须选考方可报考")
    print("化学、地理均须选考方可报考")    
    print("化学、地理选考其中一门即可报考")
    print("化学、生物均须选考方可报考")
    print("化学、生物选考其中一门即可报考")
    print("化学、思想政治选考其中一门即可报考")
    print("化学必须选考方可报考")
    print("生物、地理均须选考方可报考")
    print("生物、地理选考其中一门即可报考")
    print("生物、思想政治选考其中一门即可报考")
    print("生物必须选考方可报考")
    print("思想政治、地理均须选考方可报考")
    print("思想政治、地理选考其中一门即可报考")
    print("思想政治必须选考方可报考")
    s_subject = input("请输入再选科目要求:")
    return s_subject
@retry(stop_max_attempt_number = 5)
def getData(f_subject,s_subject):
    print("数据量较大,请稍后......")
    #获取数据总数
    url1 = "https://wjt-subject-tool-api.sdp.101.com/v1/actions/manage?f_subject="+f_subject+"&s_subject="+s_subject+"&page=1&page_size=1&_=1566823308884"
    headers = {"user-agent":"Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"}
    response1 = requests.get(url1,headers=headers,timeout = 10)
    data1 = json.loads(response1.content.decode())
    total = str(data1["total"])
    if total == '0':
        print("此组合无数据!")
        sys.exit(0)
    else:
        #获取全部数据
        url2 = "https://wjt-subject-tool-api.sdp.101.com/v1/actions/manage?f_subject="+f_subject+"&s_subject="+s_subject+"&page=1&page_size="+total+"&_=1566823308884"
        response2 = requests.get(url2,headers=headers,timeout = 60)
        data2 = json.loads(response2.content.decode())    
        return data2['items']
        print("网络错误,请检查网络后重试!")
def run():
    #实现主要逻辑
    data = getData(getTerm1(),getTerm2())
    filename = input("请输入欲导出的文件名(不需要输入后缀名):")
    print("正在输出格式化数据...")
    df = pd.DataFrame(data)
    df.to_csv(filename+'.csv',encoding='utf_8_sig')
    print("数据处理完成!")
if __name__ == '__main__':
    run()

程序导出的数据是.csv格式,可以处理后用Excel另存为为.xlsx文件进行筛选、排序等操作。

导出结果截图

程序下载

百度网盘:https://pan.baidu.com/s/1dv9h0Ts8hs6vlXvIrR3zkQ
.py文件和Pyinstaller导出的.exe文件(可直接运行,无需安装Python和程序依赖的库)

Last modification:August 30th, 2019 at 10:01 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment