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

import re #正则表达式  匹配
import requests
import csv
import os


def 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.text

def get_dict_value(key):
    try:
        result = dict_value[key].replace('"', "")
    except:
        result = key.replace('"', "")
    return result

def 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

汐ya~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值