赞
踩
网页链接:【软科排名】2023年最新软科中国大学排名|中国最好大学排名
点击xhr后发现数据不存在,在搜索框(尽量搜索数字和字母)搜索,发现数据在js文件中,这是一个JSONP的格式,相对于json的格式
对js文件进行分析, 它定义了一个函数__NUXT_JSONP__,控制台中复制,发现其为一个函数,点击进入另一个js文件
在re处打上断点,刷新网站,继续执行脚本得到
此时的t
代码操作:
- 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 函数中,以便在前端接收到响应后调用该函数来处理数据。
结果展现:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。