本文基于requests
库向目标网站发送get请求并爬取四六级成绩。
环境搭建
解释器版本:3.9.13
所需第三方库:requests
、pandas
数据文件:Excel文件
Excel文件需按顺序包含以下图片中的字段
源代码
from time import sleep
import requests
import pandas as pd
info_name = input('请输入学生信息表的文件名(含后缀名):') # 输入文件名
data = pd.read_excel(f'{info_name}') # 读取文件
# 1 四级,2 六级
sel = [1, 2] # 选择查询四级还是六级
# 添加几个字段,用于存储爬取到的信息
# 注意 从2(索引从0开始)开始,因为我的表中前面已经有2个字段,这里需要根据自己的信息表调整
data.insert(2, '准考证号', '')
data.insert(3, '四级成绩', '')
data.insert(4, '六级成绩', '')
data.insert(5, '听力部分', '')
data.insert(6, '阅读部分', '')
data.insert(7, '写作部分', '')
user_agent = 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36 Edg/124.0.0.0'
cookie = 'HMF_CI=5b52030a4a6043c6a5c9718deb1c1df4eef33feff9cf7f6a6b224c6e032d2033a1111911a162c1fa476327bc3942674e863429706fa21ea02d768573d13a119432; community=Home; language=1; HMY_JC=c7854a57df0daad9e9b495ce4536f5381e084f0371abb16fb680c4e0514bee5c7b,; Hm_lvt_dc1d69ab90346d48ee02f18510292577=1739683854,1740545495; HMACCOUNT=B8621ECFA636714D; _abfpc=c2a5e3ac1773ec741ad3533baced8035c4618d9c_2.0; cna=23693ddbda211f4bf7a8f0ecd7cff753; Hm_lpvt_dc1d69ab90346d48ee02f18510292577=1740545513; HBB_HC=e64a5461ef9fc586f1ba30c426a9d79cc96b9dfeb2bdc6336df761e4e6db9280d7c4d664e036daa383c3b0cbe7610b83ad; HOY_TR=GCRDZUEWVOPNMQSX,A491285B0367CDEF,Pfueavsbnodghwjl,0'
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br, zstd',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
'Origin': 'https://cjcx.neea.edu.cn',
'Referer': 'https://cjcx.neea.edu.cn/',
'Cookie': cookie,
'User-Agent': user_agent,
}
# 由于是批量,用一个列表存储所有考生的参数
params_list = []
for i in range(len(data)):
params_list.append({
'km': '', # 考试科目,默认为空
'xm': data.iloc[i, 0], # 姓名
'no': data.iloc[i, 1], # 准考证号
'source': 'mb',
})
# 四六级成绩查询网址
'''
https://cachecloud.neea.cn/api/latest/results/cet?km=1&xm=%E5%91%A8%E5%85%83%E5%BD%AC&no=fgdfbsfvs&source=pc
'''
url = 'https://cachecloud.neea.cn/api/latest/results/cet'
# 遍历每一个考生的数据
for i in range(len(data)):
# requests.get(url,params,**args) **args可传入请求头headers
print("开始爬取%s的成绩......" % params_list[i]['xm'])
# 遍历四级或六级
for o in sel:
params_list[i]['km'] = o
km = ['四级' if params_list[i]['km'] == 1 else '六级'][0]
response = requests.get(url, headers=headers, params=params_list[i], )
# 判断是否请求成功
if response.status_code == 200:
# 由于response是json格式,可用response.json()接受
json_data = response.json()
if json_data['code'] == 0:
# 开始存储成绩信息
data.iloc[i, 2] = json_data['zkzh'] # 准考证号
data.iloc[i, [3 if params_list[i]['km'] == 1 else 4]] = json_data['score'] # 四级或六级成绩
data.iloc[i, 5] = json_data['sco_lc'] # 听力部分
data.iloc[i, 6] = json_data['sco_rd'] # 阅读部分
data.iloc[i, 7] = json_data['sco_wt'] # 写作部分
info = f"{i+1}:{params_list[i]['xm']}查询成功," + km + f"成绩为:{json_data['score']}"
print(info)
else:
print(f"{i + 1}:{params_list[i]['xm']}未参加" + km + "考试...或是信息有误")
else:
print('请求失败!')
sleep(0.5)
print("***")
sleep(1) # 休息1秒,防止爬取过快IP被封
print("已全部查询完毕,正在导出到excel......")
insert = '四六级成绩'
grade_name = info_name[:-5] + insert + info_name[-5:]
# 导出至excel文件中
data.to_excel(grade_name)
print("导出完毕.")
注意事项
代码中第21行的cookie
的值由于具有时效性,过一段时间可能就会失效。若代码运行报错,可以试试改为自己的浏览器所对应的cookie
。对于如何查找cookie
,可以看看你要的六级成绩批量查询,它来啦…_改代码提前查成绩六级-优快云博客。