为方便学生选科走班,福建省教育厅学生工作处开发了《福建省高考综合改革——选科走班指南》程序。本来想提取数据整理一份自己规定的报考专业目录内的专业选科要求。但苦于电脑版页面不知用的何种“奇技淫巧”,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和程序依赖的库)
文章评论