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

网页链接:【软科排名】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 函数中,以便在前端接收到响应后调用该函数来处理数据。

 

结果展现:

 

 

 

 

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是用PyCharm爬取软科-高等教育评价领先品牌院校的内容并按照校名、地区、管理部门、类别、双一流共计5个字段进行解析最后保存到csv文件的代码: ``` import requests from bs4 import BeautifulSoup import csv # 设置请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} # 请求网页 url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html' response = requests.get(url, headers=headers) # 解析网页 soup = BeautifulSoup(response.content, 'html.parser') table = soup.find('table', attrs={'class': 'tablelist'}) # 获取表格头部信息 keys = [] for th in table.find_all('th'): keys.append(th.text) # 获取表格数据 data = [] for tr in table.find_all('tr')[1:]: row = {} tds = tr.find_all('td') row[keys[0]] = tds[0].text.strip() row[keys[1]] = tds[1].text.strip() row[keys[2]] = tds[2].text.strip() row[keys[3]] = tds[3].text.strip() row[keys[4]] = tds[4].text.strip() data.append(row) # 将数据保存到csv文件 with open('university.csv', 'w', encoding='utf-8', newline='') as f: writer = csv.DictWriter(f, fieldnames=keys) writer.writeheader() writer.writerows(data) print('数据保存成功!') ``` 解析: 1. 首先,我们需要设置请求头,以模拟浏览器请求。 2. 然后,我们发送请求获取网页的HTML内容。 3. 接着,我们使用BeautifulSoup库解析HTML内容,找到表格数据。 4. 我们首先获取表头信息,然后逐行获取表格数据,将每行数据保存为一个字典类型,再将所有行的字典类型保存为一个列表。 5. 最后,我们使用csv库将数据写入csv文件。 注意事项: 1. 在写入csv文件时,需要指定编码为utf-8,并设置newline='',否则会出现空行。 2. 在获取表格数据时,需要注意表格头部信息和表格数据的不同处理方式。 3. 在保存数据时,需要注意将数据保存为字典类型,并使用csv.DictWriter()函数进行写入。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力学习各种软件

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

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

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

打赏作者

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

抵扣说明:

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

余额充值