2021软科中国大学排名(Python抓取前200名)

2021软科中国大学排名(Python抓取)

  由于软科官网使用动态渲染技术,将数据封装在js文件中,导致无法直接抓取所有的排名记录。用普通的请求方式只能抓取到前30条记录。虽然也可以通过自动化测试工具selenium模拟浏览器行为把数据提取出来,但毕竟繁琐。本文通过拿到网页js文件,然后通过正则表达式提取出排名信息的方式,将所有大学排名抓取出来。具体步骤如下:
  (1)右键点击检查(Chrome),来到控制面板,点击network,找到payload.js,双击找到请求头headers,便可以找到请求地址(Request URL)。
2021软科中国大学排名(Python抓取前200名)_第1张图片
  (2)取出Request URL地址开始编码获取,得到的结果并存入Excel中如下:
2021软科中国大学排名(Python抓取前200名)_第2张图片
2021软科中国大学排名(Python抓取前200名)_第3张图片

具体代码为:

import requests
import re
import pandas as pd

#请求目标链接中请求数据
def get_data(url,headers):
    try:
        response = requests.get(url,headers=headers)
        response.encoding = 'utf-8'
        data = str(response.text)#将获取的数据转换为字符串
    except:
        print('加载数据失败')
    return  data

#提取关键信息
def parse_data(data):
    name = (re.findall('univNameCn:"(.*?)".*?', str(data), re.S))#利用正则表达式提取需要的文本
    score = (re.findall('score:(.*?),.*?', str(data), re.S))
    result = []
    for i in range(len(name)):#将获取的数据合并
        result.append([i+1,name[i],score[i]])
    return result

#输出结果
def print_data(detail,num):#num表示需要输出的结果数
    tplt = "{0:^10}\t{1:^10}\t{2:^10}"
    print(tplt.format('排名', '学校名', '得分'))
    for item in range(num):
        temp =detail[item]
        print(tplt.format(temp[0],temp[1],temp[2]))

#将获取的结果保存到Excel中
def save_excel(detail,columns):
    file = pd.DataFrame(detail,columns=columns)
    file.to_excel('软科中国大学排名.xlsx',index=False)


def main():
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36"
    }
    url = 'https://www.shanghairanking.cn/_nuxt/static/1647508426/rankings/bcur/2021/payload.js'
    columns = ['排名','学校名称','软科总得分']
    row_data = get_data(url,headers)
    rank = parse_data(row_data)
    print_data(rank,200)#输出前200条数据
    save_excel(rank,columns)

if __name__=="__main__":
    main()

你可能感兴趣的:(爬虫,开发语言,后端,爬虫,python,正则表达式)