爬取全国大学排名--数据保存在js文件中的处理办法

网页链接:【软科排名】2023年最新软科中国大学排名|中国最好大学排名

点击xhr后发现数据不存在,在搜索框(尽量搜索数字和字母)搜索,发现数据在js文件中,这是一个JSONP的格式,相对于json的格式

对js文件进行分析, 它定义了一个函数__NUXT_JSONP__,控制台中复制,发现其为一个函数,点击进入另一个js文件

在re处打上断点,刷新网站,继续执行脚本得到

此时的t

代码操作:

python 复制代码
import execjs
import requests
import re

url = "https://www.shanghairanking.cn/_nuxt/static/1706099724/rankings/bcur/2023/payload.js"
response = requests.get(url=url).text
data = re.findall('__NUXT_JSONP__\("/rankings/bcur/2023",(.*?)\);',response)[0]
result = execjs.eval(data)
univData = result['data'][0]['univData']
i = 1
for univ in univData:

    univNameCn = univ['univNameCn']
    univNameEn = univ['univNameEn']
    univTags = '/'.join(univ['univTags'])
    province = univ['province']
    univCategory = univ['univCategory']
    score = univ['score']
    print(i,univNameCn,univNameEn,univTags,province,univCategory,score)
    i+=1

execjs.eval()和call方法的区别如下:

功能:

execjs.eval():用于执行一段JavaScript代码并返回结果。

call方法:通常用于调用JavaScript对象的方法或函数。

用法:

execjs.eval():接受一个JavaScript代码作为参数,并返回执行结果。

call方法:作为JavaScript对象的一个方法,用于调用该对象的方法或函数。通常需要指定调用的方法名,并传递相应的参数。

适用场景:

execjs.eval():适用于在Python中执行JavaScript代码,例如需要动态执行一些JavaScript逻辑或计算。

call方法:适用于在JavaScript中调用对象的方法或函数,例如调用一个对象的成员方法来完成某项操作。

总的来说,execjs.eval()主要用于在Python中执行JavaScript代码,而call方法用于JavaScript对象内部的方法调用。它们在功能和用法上有所不同,根据具体的需求选择合适的方法。

JSONP(JSON with Padding)是一种在网页端通过动态创建 <script> 标签实现跨域请求的方法。由于浏览器的同源策略限制了通过 XMLHttpRequest 对象进行跨域请求,JSONP 就应运而生,它允许从不同域的服务器上请求数据,实现了跨域访问。

JSONP 的原理是利用 <script> 标签没有跨域限制的特点,动态创建一个 <script> 标签,其 src 属性指向目标服务器上的一个接受回调函数参数的 URL。目标服务器在接收到请求后,会将数据包装在一个函数调用中返回,该函数即为前端事先定义好的回调函数。因为返回的是 JavaScript 代码,而不是 JSON 数据,所以可以绕过同源策略的限制。最终,数据会作为参数传递给前端定义的回调函数,从而实现了跨域数据的获取和处理。

JSONP 回调函数就是在 JSONP 请求中定义的用于处理返回数据的 JavaScript 函数。通常情况下,JSONP 请求的 URL 中会有一个参数用来指定回调函数的名称,例如 callback=handleResponse,那么目标服务器在返回数据时,会将数据包装在 handleResponse 函数中,以便在前端接收到响应后调用该函数来处理数据。

结果展现:

相关推荐
hsjkdhs10 小时前
C++之类的继承与派生
开发语言·c++
三十_A10 小时前
【实录】使用 patch-package 修复第三方 npm 包中的 Bug
前端·npm·bug
下位子10 小时前
『AI 编程』用 Claude Code 从零到一开发全栈减脂追踪应用
前端·ai编程·claude
tyro曹仓舒10 小时前
Vue单文件组件到底需不需要写name
前端·vue.js
用户479492835691510 小时前
面试官:讲讲2FA 双因素认证原理
前端·后端·安全
乐影10 小时前
TS 模板字符串类型:从基础到进阶的类型编程魔法
前端·typescript
龙在天10 小时前
CSS 属性值的计算与过程
前端
云鹤_10 小时前
【Amis源码阅读】组件注册方法远比预想的多!
前端·低代码
xinfei10 小时前
ES6 新特性 从 ECMAScript 2015(ES6)到 ECMAScript 2025
前端
GBVFtou10 小时前
vue响应式 track 和trigger 过程
前端