快高考了,有什么学校可以报?通过爬虫获取学校信息
需求分析
今天是端午节,在欢庆地品尝着香喷喷的粽子时过节本应是件值得庆祝的事儿。然而却不料妹妹今日整日没食欲。
她兴奋地告诉我,“仙草哥哥”,马上就要高考 season 了,在这个特殊时期我想不要离家太远以免感染风险。你认为哪些学校值得考虑呢?最近我发现本地的教育资源分布不太均匀,在手册上查找资料总是很费劲。”
有什么学校?单本地也不行吧?光本地就有多少所大学都数不过来呢!不过好在其实就是获取相关信息嘛!这点对我来说不成问题!完全可以通过编写一段简单的代码来实现
请注意:本次采用的地址为阳光高考这一平台内的院校查询功能,在其列表中已明确列出未包含港澳台地区学校的项目。
页面分析
打开阳光高考中的院校查询,我们能够看到其中有很多信息

其中院校名称、所在地、学历层次等具体信息等同于文字内容,并不难获取等同于等同于等同于等同于等同于等同于等同于等等都是文字内容,并不难获取
总体上共有138页每个页面展示20个大致估计共有2750多所学校可以说数量非常庞大因此系统会从起始页面开始逐步加载直至某一页显示的数量少于二十个则停止加载过程完成数据收集后可以进行初步分析比如筛选出评价较高的学府并针对所有区域内的所有学校开展后续研究我打算仅关注所有学校的概况信息
实现分析
首先导入requests模块,并且构造一个url地址
import requests
# 这里应当填写的是从第多少个学校开始
url = "https://gaokao.chsi.com.cn/sch/search--ss-on,option-qg,\
searchType-1,start-{此处可变}.dhtml"
然后通过该url的响应,解析其中的内容
from lxml import etree
html = etree.HTML(r.text)
info = {
"院校名称": html.xpath("//td[1]/a/text()"),
"院校所在地": html.xpath("//td[2]/text()"),
"教育行政主管部门": html.xpath("//td[3]/text()"),
"学历层次": html.xpath("//td[4]/text()")
}
通过判断页面中的学校数量是否小于20,来确定是否到了最后一页
if (len(html.xpath("//tr")) < 20):
print("已经达到结尾")
最后将获取到的所有数据,通过json进行保存,完成记录
with open("school.txt", "w") as f:
f.write(json.dumps(info))
请勿直接复制粘贴!
完整代码示例
"""
作者:sagegrass
程序名:高等学校信息爬取
联系方式:sagegrass@outlook.com
创建时间:2022-06-03
更新时间:2022-06-03
"""
import requests
import re
import json
import time
from lxml import etree
school = list()
num = 0
try:
while True:
url = f"https://gaokao.chsi.com.cn/sch/search--ss-on,option-qg,searchType-1,start-{num}.dhtml"
r = requests.get(url, headers={"user-agent": "Mozilla 5.0"}, timeout=10)
for s in (t := etree.HTML(r.text).xpath("//table[@class='ch-table']/tr")[1::]):
if len(t) <= 1:
break
school.append({"院校名称": re.sub("\s", "", s.xpath("./td[1]/a/text()")[0] if len(s.xpath("./td[1]/a/text()")) else s.xpath("./td[1]/text()")[0]),
"院校所在地": re.sub("\s", "", s.xpath("./td[2]/text()")[0]),
"教育行政主管部门": re.sub("\s", "", s.xpath("./td[3]/text()")[0]),
"学历层次": re.sub("\s", "", s.xpath("./td[4]/text()")[0]),
"双一流建设高校": "是" if len(s.xpath("./td[5]/i/text()")) else "否",
"研究生院": "是" if len(s.xpath("./td[6]/i/text()")) else "否",
"满意度": re.sub("\s", "", s.xpath("./td[7]/a/text()")[0]) if len(s.xpath("./td[7]/a/text()")) > 0 else "--"})
else:
num += 20
print(f"已经完成{num}个学校啦!")
time.sleep(1)
continue
print("恭喜,已经全部完成了!")
assert(False)
except Exception as e:
with open("院校记录.json", "w") as f:
f.write(json.dumps(school, indent=2, ensure_ascii=False))
if not isinstance(e, AssertionError):
raise
程序运行结果展示

完整的代码以及操作指南已发布在GitHub上托管,请访问以下链接获取:项目gh代码仓库地址
如需下载,可以通过git直接下载
git clone https://github.com/sagegrass/spider01.git
大多数爬虫程序很快会因为目标网站的地址和服务发生变化而失效。这意味着当你看到这篇文章时,并不能确定其中提到的程序仍然有效。如果文章中提到的程序已经失效,则需自行修复或寻求他人帮助来修复
另外,请注意不要在任何情况下将爬虫程序用于非法用途或不当利用其功能导致对方网站受到负面影响。
