2021软科中国大学排名(Python抓取)
??由于软科官网使用动态渲染技术,将数据封装在js文件中,导致无法直接抓取所有的排名记录。用普通的请求方式只能抓取到前30条记录。虽然也可以通过自动化测试工具selenium模拟浏览器行为把数据提取出来,但毕竟繁琐。本文通过拿到网页js文件,然后通过正则表达式提取出排名信息的方式,将所有大学排名抓取出来。具体步骤如下: ??(1)右键点击检查(Chrome),来到控制面板,点击network,找到payload.js,双击找到请求头headers,便可以找到请求地址(Request URL)。 ??(2)取出Request URL地址开始编码获取,得到的结果并存入Excel中如下:
具体代码为:
import requests
import re
import pandas as pd
def get_data(url):
try:
response = requests.get(url)
data = str(response.text)
return data
except:
print('加载数据失败')
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):
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]))
def save_excel(detail,columns):
file = pd.DataFrame(detail,columns=columns)
file.to_excel('软科中国大学排名.xlsx',index=False)
def main():
url = 'https://www.shanghairanking.cn/_nuxt/static/1632381606/rankings/bcur/2021/payload.js'
columns = ['排名','学校名称','软科总得分']
row_data = get_data(url)
rank = parse_data(row_data)
print_data(rank,200)
save_excel(rank,columns)
if __name__=="__main__":
main()
|