有什么学校可以报?通过爬虫获取学校信息"/>
快高考了,有什么学校可以报?通过爬虫获取学校信息
需求分析
今天是端午节,本来应该高高兴兴的吃吃粽子,过过节,但是呢,没想到妹妹今日很忧愁,连饭都吃不下了。我很担心,问她怎么了
她说,“仙草哥哥,马上就要高考了,有什么学校可以报呢?现在疫情我不想离家太远,本地有没有好的学校呢?学校发的手册上的内容查阅起来太困难了!”
有什么学校,那我可不知道啊,别说全国了,就连本地有几所大学我都数不明白呢。不过好在,就是获取学校信息嘛,这难不倒我,使用python的爬虫来实现就好了
注意:本次我采用的地址是阳光高考中的院校查询,其中已经明确给出了名单中不包括港澳台等地区的学校
页面分析
打开阳光高考中的院校查询,我们能够看到其中有很多信息
其中院校名称,所在地,学历层次,满意度等等都是文字内容,并不难获取。其中唯一不一样的在于“双一流”和“研究院”,这里没有文字,而是通过一个对号的符号作为标记的。因此,这里要和其他项不同,有符号标记的,就记录为是,没符号标记的就记录为否
目前总共有138页,每一页显示20个,总共大概有2750多所学校,还是非常多的,那么就从第一页开始,一直往后边获取,直到某一页中不足20个学校,就说明结束了。当然,如果我们获取到了全部的数据也可以对其进行简单的分析,例如挑选出满意度高的学校,某个地区的全部学校等等。当然我自己只准备获取一下全部学校的信息
实现分析
首先导入requests模块,并且构造一个url地址
import requests# 这里应当填写的是从第多少个学校开始
url = ",option-qg,\searchType-1,start-{此处可变}.dhtml"
然后通过该url的响应,解析其中的内容
from lxml import etreehtml = 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
创建时间:2022-06-03
更新时间:2022-06-03
"""import requests
import re
import json
import time
from lxml import etreeschool = list()
num = 0try:while True:url = f",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:breakschool.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 += 20print(f"已经完成{num}个学校啦!")time.sleep(1)continueprint("恭喜,已经全部完成了!")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 .git
多数爬虫程序很快就会由于对方地址和服务变化导致失效,因此无法保证当你看到这篇文章时,文中的程序仍然可以使用。如果文中的程序已失效,需要自行或者求助他人进行重写
另外,切勿将爬虫程序用于非法用途,或者错误的滥用造成对方网站的负担,谢谢!
更多推荐
快高考了,有什么学校可以报?通过爬虫获取学校信息
发布评论