> 文档中心 > 爬取世界大学排行 正则匹配 全部年份

爬取世界大学排行 正则匹配 全部年份

 

import re #正则表达式  匹配import requestsimport csvimport osdef get_text(year):    url = "https://www.shanghairanking.cn/_nuxt/static/1647508426/rankings/arwu/{}/payload.js".format(year)    print(url)    headers = { 'Referer': 'https://www.shanghairanking.cn/rankings/arwu/{}'.format(year), 'User-Agent': 'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/93.0.4577.63Safari/537.36Edg/93.0.961.38'    }#防反爬虫    response = requests.get(url, headers=headers)#向网站发起请求,并获取响应对象参数    return response.textdef get_dict_value(key):    try: result = dict_value[key].replace('"', "")    except: result = key.replace('"', "")    return resultdef printUnivList(ulist, year):    os.mkdir('./{}'.format(year))#创建目录对应一个年份    f = open('./{}/{}.csv'.format(year, year), 'w', encoding='utf-8', newline="")    csv_writer = csv.writer(f)    csv_writer.writerow(["排名", "学校名称", "国家", "国家排名", "总分", "校友排名"])#表头    csv_writer.writerows(ulist)#多行写入列表    f.close()for year in range(2003, 2022):#循环从2003至2022年    res_str = get_text(str(year))#获得对应年份的源代码,str(year)将其作为字符串    repx = re.compile(r'univNameCn:"(.*?)",univUp.*?region:(.*?),regionRanking:(.*?),score:(.*?),indData:{"\d+?":(.*?),"')    hash_str = repx.findall(res_str, re.S)#re.s可匹配换号符    #正则表达式匹配对应数据compile()与findall()一起使用,返回一个列表    parameter = re.findall(r'}\((.*?)\)\)\);', res_str)[0].replace('"', "").split(',')    #replace去掉字符串,split用,分隔成列表    parameter_name = re.findall(r'\(function\((.*?)\){', res_str)[0].split(",")    dict_value = dict(zip(parameter_name, parameter))    #将parameter_name, parameter合并    res_list = []    for j in range(len(hash_str)): i = hash_str[j] rank = j + 1  # 排名 name = i[0]  # 校名 country = get_dict_value(i[1])  # 国家 regional_ranking = get_dict_value(i[2])   # 地区排名 score = get_dict_value(i[3])  # 成绩 alumni_award = get_dict_value(i[4])  # 校友获奖 res_list.append([rank, name, country, regional_ranking, score, alumni_award]) #将一所大学全部数据放入`一个列表里    printUnivList(res_list, year)