irpas技术客

快高考了,有什么学校可以报?通过爬虫获取学校信息_仙草哥哥

未知 7512

需求分析

今天是端午节,本来应该高高兴兴的吃吃粽子,过过节,但是呢,没想到妹妹今日很忧愁,连饭都吃不下了。我很担心,问她怎么了

她说,“仙草哥哥,马上就要高考了,有什么学校可以报呢?现在疫情我不想离家太远,本地有没有好的学校呢?学校发的手册上的内容查阅起来太困难了!”

有什么学校,那我可不知道啊,别说全国了,就连本地有几所大学我都数不明白呢。不过好在,就是获取学校信息嘛,这难不倒我,使用python的爬虫来实现就好了

注意:本次我采用的地址是阳光高考中的院校查询,其中已经明确给出了名单中不包括港澳台等地区的学校

页面分析

打开阳光高考中的院校查询,我们能够看到其中有很多信息

其中院校名称,所在地,学历层次,满意度等等都是文字内容,并不难获取。其中唯一不一样的在于“双一流”和“研究院”,这里没有文字,而是通过一个对号的符号作为标记的。因此,这里要和其他项不同,有符号标记的,就记录为是,没符号标记的就记录为否

目前总共有138页,每一页显示20个,总共大概有2750多所学校,还是非常多的,那么就从第一页开始,一直往后边获取,直到某一页中不足20个学校,就说明结束了。当然,如果我们获取到了全部的数据也可以对其进行简单的分析,例如挑选出满意度高的学校,某个地区的全部学校等等。当然我自己只准备获取一下全部学校的信息

实现分析

首先导入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,这里是该项目github链接地址???????

如需下载,可以通过git直接下载

git clone https://github.com/sagegrass/spider01.git

多数爬虫程序很快就会由于对方地址和服务变化导致失效,因此无法保证当你看到这篇文章时,文中的程序仍然可以使用。如果文中的程序已失效,需要自行或者求助他人进行重写

另外,切勿将爬虫程序用于非法用途,或者错误的滥用造成对方网站的负担,谢谢!


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #快高考了