python 3爬取 全国高校对四川历年招生数据(文理省控线,文理专业线)存入Excel表

本文介绍了如何使用Python 3爬取全国高校对四川历年招生的文理省控线和专业线数据,并将数据存储到Excel表格中。通过requests、Beautifulsoup和re库解析网页,利用xlwt处理Excel文件。爬取过程涉及识别学校ID,解析省控线和专业线网址,以及处理不同年份、文理科的数据。虽然网站结构复杂,但通过分析网址规律,实现了自动化爬取。
摘要由CSDN通过智能技术生成

由于我们的acm的指导老师对项目组布置的一个高考志愿学校推荐系统,是大数据和机器学习的结合,我负责的是爬取数据,给机器学习小组用,网页数据不在你搜索当前学校网页上看到的那样,是通过js生成的。数据来源:https://gkcx.eol.cn/soudaxue/queryschool.html,这个网址的数据相对来说很齐全....目前来说能够找到高校录取数据最多的网址。

提示:由于网站更新,采用ajax异步请求数据(网页源代码没有数据)然后加载到网页中,所以本博客源码没法使用,但是爬取逻辑思路还是很重要的,可以供大家学习,需要更新后能用的代码请点击传送门:https://blog.csdn.net/memory_qianxiao/article/details/88767327最新分析以及可使用代码,供大家参考。

 

环境:python3.6  +pycharm或者你喜欢的编译器

第三方库:requests(网页请求库),Beautifulsoup(网页解析库),re(正则解析提取库),xlwt(python操作excel库)

这里我先放出效果图镇楼:(楼主爬了一下午加晚上才爬取了800多所高校数据,估计需要两天才能跑完...)

 

首先我们会输入学校,输入学校之后进入学校主页,就能看到部分数据。这里我就随便点了一个。

而我们需要的数据是录取分数线,专业录取分数线(可以点击更多看到,也可以点击上面的各省录取线,专业录取线)

而我们查询学校的网址是:

https://gkcx.eol.cn/soudaxue/queryschool.html&keyWord1=输入的学校名字

然后就会进入上图那样的主页,看到部分数据。然后我们看网址:

https://gkcx.eol.cn/schoolhtm/schoolTemple/school140.htm 发现,school后面跟了一个数字,140这个就是学校的id,每个学校对应了一个id,当我们输入名字的时候,就找到了一个id。我们需要学校id进入学校主页,因为你只输入关键字是不能进入到主页的,当你手动点击那个连接才能进入,而这个连接就是带学校id。那怎么获取学校的id呢,那就是输入关键字,手动点击进入学校以后看到网址就有了。废话了这么多,原来还需要手动点!!!!那太难受了,能不能程序自动了?

反正博主是没法~~~~哈哈,(当初我开始的我还把每个学校的名字爬下来,打算通过名字,输入,然后获取id)然而网页输入关键字后,就没有你需要的东西~~难不难受?是通过js生成的...

按F12进入network在js里面最后一个能看到我们需要的网址,但是源网页没有,没有!没有!也就是你通过程序关键字输入的返回的网页代码没有的,既然没有怎么提取?

所以博主的解决办法是暴力搜索,所以曾经acm经历带来的好处,算法学的不怎么样,但是思想还是受影响的,于是博主就手动输入ID从1开始尝试,然后id间距增大。最终经过博主的不断尝试,发现一个规律:ID是从30开始的到2577之间的才是有效的。

也就是我们需要学校的数据开始网址https://gkcx.eol.cn/schoolhtm/schoolTemple/school30.htm ****北京工业大学

结束网址:https://gkcx.eol.cn/schoolhtm/schoolTemple/school2577.htm ***三亚理工职业学院

所以我们for循环一次,30到2578id就能遍历所有高校主页,然后请求这个url就ok。

  for i in range(532,2577):
        url="https://gkcx.eol.cn/schoolhtm/schoolTemple/school"+str(i)+".htm"

当我们有了每个学校的url以后,就能请求的网页中找到省控线网址(默认是地址学校所在省,默认理科,默认年份2017年)

所以我们需要通过程序进入每个学校主页,爬取这些数据,顺便把学校名字和地址也爬取了,存入一个列表,后面就能用。

这里贴出爬取省控线网址,专业线网址,学校,名字。采用re和beaufifulsoup合用的方式,不懂用法的请百度。

提出后这些网址后,你发现不全,不能请求,还需要在前面添加 https://gkcx.eol.cn,才能够正常访问我们需要的网页。

def search_University(url,info):
    try:
        html=GetHtml(url)
        soup=BeautifulSoup(html,"html.parser")
        pattern=re.compile(r"var schoolname='([\u4e00-\u9fa5]{1,20}?)'")
        university_name=re.findall(pattern,html)
        if university_name!=[]:
            info.append(university_name[0])
            soup1 = soup.find_all("a")
            for a_xian in soup1:
                if a_xian.string=='各省录取线':
                    #print(a_xian['href'])
                    info.append(a_xian['href'])
                if a_xian.string=='专业录取线':
                    #print(a_xian['href'])
                    info.append(a_xian['href'])
    except:
            print("Error")

 

接下来我们会爬取历年文理科对四川省控线,数据如下边这样。

我们需要的省控线参数有地区(默认是学习所在省),文理科(默认理科),批次(默认一批)。

接下来是分析重点:

我们点击四川省,文理都点一些,批次我点击本科一批,二批,三批,专科批,发现网址如下:

一批:https://gkcx.eol.cn/schoolhtm/schoolAreaPoint/30/10005/10035/10036.htm
二本:https://gkcx.eol.cn/schoolhtm/schoolAreaPoint/30/10005/10035/10037.htm
三本:https://gkcx.eol.cn/schoolhtm/schoolAreaPoint/770/10005/10035/10038.htm
专科:https://gkcx.eol.cn/schoolhtm/schoolAreaPoint/770/10005/10035/10155.htm

最后我再说下点击那么多网址总结规律(acm思想锻炼的还是可以的):

ttps://gkcx.eol.cn/schoolhtm/schoolAreaPoint/**学校ID**770/**省份**10005/**文理**10034/**批次10036.htm

770是学校ID,1005是四川省的代码,10034是文科,10035是理科,一批:10036,二批:10037,三批:10038,专科批:10155

所以我们需要请求的省份,文理,批次都可以改动请求,然后提取数据。这里直接给出提取的源码省控线的源码

def search_University(url,info):
    try:
        html=GetHtml(url)
        soup=BeautifulSoup(html,"html.parser")
        patt
  • 14
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落凡尘.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值