大家好,今天我们来利用python技术助力高考,获取网上的本专科专业选考科目要求,用到的Python模块有:Requests、Json、BeautifulSoup、Pandas ,主要思路是Requests获取接口请求,利用BeautifulSoup 解析网站的数据,最后利用Pandas库生成Excel文件。本期我们来获取江苏省,历史类的所有高校的专业选考科目要求实现的结果展示如下:
下面我们就来看看如何实现:
首先打开网址我们按F12检查网站信息,我们选择江苏,首选科目选择历史,点击查询 浏览器 NetWork中就会显示出调用的URL,和相对应的请求参数
请求参数,经过分析 我们可以得出 江苏代码32 ,历史类代码08 记住这个在后面查看详情里面用到。
这时我们通过requests请求就能得到系统返回的json数据。
下面我们来分析详情的参数:
yxdm为学校编码,yxmc为学校名称,xkm为所选科目:08代表历史
我们利用BeautifulSoup模块进行解析,最终提取出所有的信息导出到excel。
具体实现代码如下:
import requests
from urllib.parse import urlencode
from urllib.parse import unquote
import time
import hashlib
import pandas as pd
import random
from bs4 import BeautifulSoup
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36',
}
json_data = {
'ssdm': '32',
'sxkm': '08',
'kskms': '',
'xkml': '',
'qttj': '',
'cxtj': ''
}
def get_xk(yxdm, ssmc, zswz,dq):
list = []
url = 'https://xkcx2024/xxdetail.jsp?yxdm={}&yxmc={}&sxkm=08&kskms=&qttj=&cxtj=&xkml='.format(
yxdm, ssmc)
response = requests.post(url, headers=headers)
content = response.text
page = BeautifulSoup(content, 'html.parser')
for trs in page.findAll('tr'):
for tds in trs.findAll('td'):
list.append(tds.text)
chunks = 7
chunks_list = [list[i:i + chunks] for i in range(0, len(list), chunks)]
lists_with_new_element = [sublist + [yxdm, ssmc, zswz, '历史',dq] for sublist in chunks_list]
print(lists_with_new_element)
result.extend(lists_with_new_element)
print(yxdm+':'+ssmc+':已下载...'
if __name__ == '__main__':
result=[]
title = ['序号', '层次', '专业(类)名称', '首选科目', '再选科目及选考要求', '所含专业和代码', '招考方向', '学校代码', '学校名称', '学校网址', '首选科目','地区']
response = requests.post('https://xkcx2024/GetYxxxServlet', headers=headers,data=json_data)
data = response.json()
schools=data['yxs']
for school in schools:
random_time = random.uniform(1, 2)
time.sleep(random_time)
dm=school['yxdm']
mc=school['yxmc']
wz=school['zswz']
dq=school['ssmc']
get_xk(dm, mc, wz,dq)
df = pd.DataFrame(result, columns=title)
df.to_excel('历史类选科.xlsx', index=False)
print('done')
希望得到大家的关注和点赞,我们下期见。