1 本文背景
近期在做一个高考志愿智能决策系统,并想引入专业介绍功能,此系统的用户提供志愿推荐的同时,来普及各种专业的信息,方便用户了解了多数专业的具体情况后,再根据系统的推荐,来得到比较理性并且适合自己的专业选择。
因此,此功能的实现,需要借助高考志愿中所有的专业信息,包括专业大类,具体专业。
2 技术选型
Python + requests库 + xlwt库
3 数据来源
网站:https://gkcx.eol.cn/special
4 网站分析
此网页设计十分规整,一共 25 页,格式统一,这意味着接下来如果此网站的反爬机制不强,我们会很容易地进行数据预分析(如 JSON 数据)并找到数据的规律。  首先进行网页检查,在 NetWork 一栏中,先找几个文件,看它们的响应是否是对应我们需要的专业信息数据  是一堆 JS 代码,显然里面不存在网页中的专业信息数据,因此,我们初步推测网页中的数据是异步加载上去的能让用户体验更好,现在大多数网站都是这样,传统网站已经不多了  我们接下来用 NetWork 中的 Type 字段进行分类,分析 xhr 类型的异步文件就可以了,也是从前几个开始找,这里就不再一一演示了,最终,我在下面红框中的响应文件中找到了线索  这一看就是我们需要的专业信息了,这里也没有用 Unicode 给汉字编码,直接显示了汉字,那么就更好判断了  我们用 JSON 工具,来对其中的信息进行更直观的格式化  OK,看了一下所有的 JSON 数据,正好是一整页网页的专业信息,接下来看一下此 JSON 对应的网络请求  结果是: https://api.eol.cn/gkcx/api/?access_token=&keyword=&level1=1&level2=&page=1&signsafe=&size=30&sort=&uri=apidata/api/gkv3/special/lists
接下来再看一下第二页的这个请求是多少: https://api.eol.cn/gkcx/api/?access_token=&keyword=&level1=1&level2=&page=2&signsafe=&size=30&sort=&uri=apidata/api/gkv3/special/lists
对比,只有page 参数的值是变化的,因此,接下来的请求也可以模拟了。
开始写代码就可以了。
5 代码编写
import requests
import xlwt
workbook = xlwt.Workbook(encoding = 'utf-8')
worksheet = workbook.add_sheet('MyWorksheet')
rowCount = 0
worksheet.write(rowCount, 0, '专业介绍id 主键')
worksheet.write(rowCount, 1, '大类id')
worksheet.write(rowCount, 2, '名称')
worksheet.write(rowCount, 3, '专业代码')
worksheet.write(rowCount, 4, '本科/专科')
worksheet.write(rowCount, 5, '修学年限')
worksheet.write(rowCount, 6, '授予学位')
header = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36'}
for i in range(25):
pageNum = i + 1
print("https://api.eol.cn/gkcx/api/?access_token=&keyword=&level1=1&level2=&page=" + str(pageNum) + "&signsafe=&size=30&sort=&uri=apidata/api/gkv3/special/lists")
response = requests.get("https://api.eol.cn/gkcx/api/?access_token=&keyword=&level1=1&level2=&page=" + str(pageNum) + "&signsafe=&size=30&sort=&uri=apidata/api/gkv3/special/lists", headers = header)
response.encoding = 'utf-8'
info = response.json()
onePageItems = info['data']['item']
totalResult = []
keyIndex = 2
for item in onePageItems:
result = []
result.append(keyIndex)
result.append(item['level3_name'])
result.append(item['name'])
result.append(item['spcode'])
result.append(item['level1_name'])
result.append(item['limit_year'])
result.append(item['degree'])
totalResult.append(result)
keyIndex += 1
for result in totalResult:
rowCount += 1
worksheet.write(rowCount, 0, result[0])
worksheet.write(rowCount, 1, result[1])
worksheet.write(rowCount, 2, result[2])
worksheet.write(rowCount, 3, result[3])
worksheet.write(rowCount, 4, result[4])
worksheet.write(rowCount, 5, result[5])
worksheet.write(rowCount, 6, result[6])
workbook.save('Excel_test.xls')
6 测试结果
成功爬取~ 

附加
另外,关于每个专业的具体描述信息 
我也写了实现,下图为结果,爬取思路相似,不再详细介绍


最后,汇总两次爬虫的信息 
|