栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

需求分析

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

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

有什么学校,那我可不知道啊,别说全国了,就连本地有几所大学我都数不明白呢。不过好在,就是获取学校信息嘛,这难不倒我,使用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

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/947560.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号