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

由于我们的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多所高校数据,估计需要两天才能跑完...)

python 3爬取 全国高校对四川历年招生数据(文理省控线,文理专业线)存入Excel表_第1张图片python 3爬取 全国高校对四川历年招生数据(文理省控线,文理专业线)存入Excel表_第2张图片python 3爬取 全国高校对四川历年招生数据(文理省控线,文理专业线)存入Excel表_第3张图片python 3爬取 全国高校对四川历年招生数据(文理省控线,文理专业线)存入Excel表_第4张图片

 

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

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

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

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

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生成的...

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

按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合用的方式,不懂用法的请百度。

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

提出后这些网址后,你发现不全,不能请求,还需要在前面添加 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")

 

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

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

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

接下来是分析重点:

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

一批: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")
        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")
def get_schoolAreaPoint(info):
    school_point_url="https://gkcx.eol.cn"+info[1].strip()
    school_specialty_point_url="https://gkcx.eol.cn"+info[2].strip()
    #把省控线切割为列表
    s1=school_point_url.split('/')
    #把省份变为四川
    s1[-3]='10005'
    #把专业线切割为列表
    s2 = school_specialty_point_url.split('/')
    #文理科数据存放列表
    infolist_like=[]
    infolist_wenke=[]
    # 把列表合成字符网址
    url='/'.join(s1)
    html=GetHtml(url)
    #地址
    soup = BeautifulSoup(html, "html.parser")
    soup1=soup.find_all('span')
    adress=''
    for i in soup1:
        if i.string!=None and '号' in list(i.string):
            adress=i.string
    #print(adress)

    #**************理科省控线*****************#
    #本科一批
    flag1=True
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string=='暂时没有数据':
                flag1=False
    if flag1:
        for i in soup2:
            l=[]
            cont=0
            for j in i:
                cont+=1
                if cont==10 and j.string not in['年份','最高分','平均分','最低分','省控线','批次']:
                    l.append(j.span.string[:3])
                elif j!='\n' and j.string not in['年份','最高分','平均分','最低分','省控线','批次']:
                    l.append(j.string)
            if l!=[]:
                infolist_like.append(l)

    # 本科二批
    flag2=True
    s1[-1]='10037.htm'
    url='/'.join(s1)
    html=GetHtml(url)
    soup=BeautifulSoup(html,'html.parser')
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string=='暂时没有数据':
                flag2=False
    if flag2:
        for i in soup2:
            l = []
            cont = 0
            for j in i:
                cont += 1
                if cont == 10 and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.span.string[:3])
                elif j != '\n' and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.string)
            if l != []:
                infolist_like.append(l)

    #本科三批
    flag3 = True
    s1[-1] = '10038.htm'
    url='/'.join(s1)
    html= GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser')
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string == '暂时没有数据':
                flag3 = False
    if flag3:
        for i in soup2:
            l = []
            cont = 0
            for j in i:
                cont += 1
                if cont == 10 and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.span.string[:3])
                elif j != '\n' and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.string)
            if l != []:
                infolist_like.append(l)

    #专科批

    flag4 = True
    s1[-1] = '10155.htm'
    url = '/'.join(s1)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser')
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string == '暂时没有数据':
                flag4 = False
    if flag4:
        for i in soup2:
            l = []
            cont = 0
            for j in i:
                if cont == 10 and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.span.string[:3])
                elif j != '\n' and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.string)
            if l != []:
                infolist_like.append(l)

    for i in infolist_like:
       print(i)
  
    print("正在写入Excrl%s理科数据............"%info[0])
    #创建工作簿((理科)指定编码
    file=xlwt.Workbook(encoding='utf-8')
    #创建表
    table1=file.add_sheet(info[0]+'理科线')
    value=['年份','最高分','平均分','最低分','省控线','批次','通讯地址']
    table1.col(6).width=256*20
    for i in range(len(value)):
        table1.write(0,i,value[i])
    table1.write(1,6,adress)
    for i in range(len(infolist_like)):
        for j in range(len(infolist_like[i])):
            table1.write(i+1,j,infolist_like[i][j])

    #*********************文科省控线*****************************#
    #把理科转变成文科
    s1[-2]='10034'
    s1[-1]='10036.htm'
    url = '/'.join(s1)
    html = GetHtml(url)
    soup=BeautifulSoup(html,'html.parser')
    # 本科一批
    flag1 = True
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string == '暂时没有数据':
                flag1 = False
    if flag1:
        for i in soup2:
            l = []
            cont = 0
            for j in i:
                cont += 1
                if cont == 10 and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.span.string[:3])
                elif j != '\n' and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.string)
            if l != []:
                infolist_wenke.append(l)
    # 本科二批
    flag2 = True
    s1[-1] = '10037.htm'
    url = '/'.join(s1)
    html = GetHtml(url)
    soup = BeautifulSoup(html,'html.parser')
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string == '暂时没有数据':
                flag2 = False
    if flag2:
        for i in soup2:
            l = []
            cont = 0
            for j in i:
                cont += 1
                if cont == 10 and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.span.string[:3])
                elif j != '\n' and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.string)
            if l != []:
                infolist_wenke.append(l)
    # 本科三批
    flag3 = True
    s1[-1] = '10038.htm'
    url='/'.join(s1)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser')
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string == '暂时没有数据':
                flag3 = False
    if flag3:
        for i in soup2:
            l = []
            cont = 0
            for j in i:
                cont += 1
                if cont == 10 and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.span.string[:3])
                elif j != '\n' and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.string)
            if l != []:
                infolist_wenke.append(l)

    # 专科批
    flag4 = True
    s1[-1] = '10155.htm'
    url = '/'.join(s1)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser')
    soup2 = soup.find_all('tr')
    for i in soup2:
        for j in i:
            if j.string == '暂时没有数据':
                flag4 = False
    if flag4:
        for i in soup2:
            l = []
            cont = 0
            for j in i:
                if cont == 10 and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.span.string[:3])
                elif j != '\n' and j.string not in ['年份', '最高分', '平均分', '最低分', '省控线', '批次']:
                    l.append(j.string)
            if l != []:
                infolist_wenke.append(l)
    for i in infolist_wenke:
        print(i)
    #创建文科省控
    print("正在写入Excel%s文科数据........."%info[0])
    table2=file.add_sheet("%s文科数据"%info[0])
    value = ['年份', '最高分', '平均分', '最低分', '省控线', '批次', '通讯地址']
    table2.col(6).width = 256 * 20
    for i in range(len(value)):
        table2.write(0, i, value[i])
    table2.write(1, 6, adress)
    for i in range(len(infolist_wenke)):
        for j in range(len(infolist_wenke[i])):
            table2.write(i + 1, j, infolist_wenke[i][j])

上面的代码是可一直把最开始网址配合上面两个的函数,先把url传到search_University(url,info),然后再把info给

get_schoolAreaPoint(info)这个函数,就能打印保存Excel表了。

接下来该爬取每个高校对四川的专业线:

专业线有三个参数,地区(默认所在高校的省份,),文理(默认理科),年份(默认2017)

方法同上,我们点击多个地区,年份,文理,分析得到网址,分析如下:

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

https://gkcx.eol.cn/schoolhtm/specialty/30/10035/specialtyScoreDetail_2017_10005.htm

30是院校代码,10035是理科,10034文科,2017是年份,1005是省份代码

所以还是改网址,然后对改动后的网址进行访问,就能得到我们需要的网址,然后进行数据提取。

还是提出源代码:

#**********************每个高校对四川招生的专业录取线******************************
   #专业数据是2008到2017
    infolist_specialtyScore=[]
    #2017理科
    s2[-1]='specialtyScoreDetail_2017_10005.htm'
    url='/'.join(s2)
    html=GetHtml(url)
    soup=BeautifulSoup(html,'html.parser').find_all('tr')
    for i in soup:
        l=[]
        cont=0
        for j in i:
            cont+=1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
               if cont==12:
                l.append(j.string.strip())
               else: l.append(j.string)
        if l!=[]:
            infolist_specialtyScore.append(l)
    # 2016理科
    s2[-1] = 'specialtyScoreDetail_2016_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)

    # 2015理科
    s2[-1] = 'specialtyScoreDetail_2015_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2014理科
    s2[-1] = 'specialtyScoreDetail_2014_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2013理科
    s2[-1] = 'specialtyScoreDetail_2013_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)

    # 2012理科
    s2[-1] = 'specialtyScoreDetail_2012_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2011理科
    s2[-1] = 'specialtyScoreDetail_2011_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2010理科
    s2[-1] = 'specialtyScoreDetail_2010_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)

    # 2009理科
    s2[-1] = 'specialtyScoreDetail_2009_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2008理科
    s2[-1] = 'specialtyScoreDetail_2008_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据',' ','']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
     #创建理科专业表
    print("正在写入Excel%s理科专业数据........."%info[0])
    table3=file.add_sheet(info[0]+"理科专业线")
    value=['专业','年份','最高分','平均分','最低分','录取批次']
    for i in range(len(value)):
        table3.write(0,i,value[i])
    for i in range(len(infolist_specialtyScore)):
        for j in range(len(infolist_specialtyScore[i])):
            table3.write(i+1,j,infolist_specialtyScore[i][j])
    print("Excel%s理科专业数据写入成功!" % info[0])
    #**********文科********
    # 2017文科
    #转换为文科代码
    infolist_specialtyScore=[]
    s2[-2]='10034'
    s2[-1] = 'specialtyScoreDetail_2017_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2016文科
    s2[-1] = 'specialtyScoreDetail_2016_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)

    # 2015文科
    s2[-1] = 'specialtyScoreDetail_2015_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2014文科
    s2[-1] = 'specialtyScoreDetail_2014_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2013文科
    s2[-1] = 'specialtyScoreDetail_2013_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)

    # 2012文科
    s2[-1] = 'specialtyScoreDetail_2012_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2011文科
    s2[-1] = 'specialtyScoreDetail_2011_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2010文科
    s2[-1] = 'specialtyScoreDetail_2010_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)

    # 2009文科
    s2[-1] = 'specialtyScoreDetail_2009_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 2008文科
    s2[-1] = 'specialtyScoreDetail_2008_10005.htm'
    url = '/'.join(s2)
    html = GetHtml(url)
    soup = BeautifulSoup(html, 'html.parser').find_all('tr')
    for i in soup:
        l = []
        cont = 0
        for j in i:
            cont += 1
            if j.string not in ['专业名称', '年份', '最高分', '平均分', '最低分', '录取批次', '\n', '暂时没有数据', ' ', '']:
                if cont == 12:
                    l.append(j.string.strip())
                else:
                    l.append(j.string)
        if l != []:
            infolist_specialtyScore.append(l)
    # 创建理科专业表
    print("正在写入Excel%s文科专业数据........." % info[0])
    table4 = file.add_sheet(info[0] + "文科专业线")
    value = ['专业', '年份', '最高分', '平均分', '最低分', '录取批次']
    for i in range(len(value)):
        table4.write(0, i, value[i])
    for i in range(len(infolist_specialtyScore)):
        for j in range(len(infolist_specialtyScore[i])):
            table4.write(i + 1, j, infolist_specialtyScore[i][j])
    print("Excel%s文科专业数据写入成功!" % info[0])
    for i in infolist_specialtyScore:
        print(i)

最后把excel保存一下,就是镇楼图那样一个学校一个表,每个表四页,省控理科线,省控文科线,专业理科线,专业文科线。

D:\QQPCMgr(1)\Desktop\高校数据/'这个是我在桌面创建的一个文件夹的路径,可以不指定路径,就会保存到当前程序运行的目录下。
 #指定保存路径
    file.save('D:\QQPCMgr(1)\Desktop\高校数据/' + info[0] + '录取数据.xls')
    print("%s所有数据写入成功!" % info[0])

最后附上main函数,函数入口

def main():
    #text=open("全国高校.txt",'r').readlines()
    start=time.perf_counter()
    for i in range(30,2577):
        info = []
        url="https://gkcx.eol.cn/schoolhtm/schoolTemple/school"+str(i)+".htm"
        print(url)
        search_University(url,info)
        print(info)
        #特殊判断个别院校与其他多数学校差别(没有歧视的意思,个别学校网址或者其他数据问题),就跳过,否则一大堆错误,处理的脑壳疼
        if len(info)<3 or info[1].strip()==info[2].strip() or "http:" in info[1].strip().split('/'):
            continue
        get_schoolAreaPoint(info)
        print("查询第%d个学校"%(int(i)-29))
    end=time.perf_counter()
    print("花费时间:%.2f"%(end-start))
if __name__ == '__main__':
    main()

 

博主就不贴出完整源代码了,几乎都贴出来了,因为博主爬取的数据好给项目组用,如果有人确实需完整,留言,看到后博主会回复你,根据情况私给源代码。这里博主要说一下,尽管处理了大部分特殊情况的学校但程序还是停掉,这里博主每次请求一个学校的时候打印了网址,里面有id,只需要重新在for循环,左边改成断掉的id就可以继续了,至于为什么为这样,可能是windows长时间运行程序会崩溃或者是楼主没处理好数据,或者还是有特殊学校没处理掉,或者用法问题......如果博主的思维和代码对您有用,记得点赞。

----------------------------------------------------------------内容到此结束---------------------------------------------------------------------------------------

 

你可能感兴趣的:(python,学习之路,网络爬虫)