服务端nodejs抓取jsonp接口数据

2024-04-11 17:58

本文主要是介绍服务端nodejs抓取jsonp接口数据,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

众所周知,jsonp 接口返回的是一段 js 脚本,在浏览器中使用 script 标签引入、加载成功后,会直接执行其中的脚本方法,以参数的形式直接返回真正有用的接口数据,以此达到跨域请求的目的。但是如果在非浏览器环境(node执行环境)中怎么来抓取呢,本文就主要介绍一下,服务端nodejs抓取jsonp接口数据 的思路方法和踩过的坑。

Node+Axios Jsonp

前言

出于好奇,最近在研究使用 node 程序分析股票的数据,看看能不能找到一些规律。
但前提是要获取一批数据,所以查看了几个相关的网站平台,通过开发者工具的 network 查看,其中接口数据基本都是使用 jsonp 格式的。

温馨提示: 不要过度频繁爬取数据,可能涉及网络安全问题。

方法思路

  1. node 服务端使用 axios 获取 jsonp 返回的内容
  2. 使用 typeof 查看返回内容的类型
  3. 解析 jsonp 返回的内容、执行其中的 callback 方法

关键在于这第三步,在 node 环境中如何动态的执行这一段 String 类型的代码。

Node环境动态执行脚本

  1. eval()

直接调用,使用本地作用域。

function test() {let x = 10, y = 20;let sum = eval('x + y')console.log(sum);  // 30
}
  1. Function

eval 不同的是,Function 创建的函数只能在全局作用域中运行。
test() 执行会报错:ReferenceError: x is not defined

// 报错
function test() {let x = 10, y = 20;let fn = new Function('return x + y')let sum = fn()console.log(sum) // ReferenceError: x is not defined
}// 正常执行
global.x = 10
global.y = 20
function test() {let fn = new Function('return x + y')let sum = fn()console.log(sum) // 30
}
  1. vm.runInThisContext (推荐)

vmnode 的核心模块,vm 可以使用 v8Virtual Machine contexts 动态地编译和执行代码,而代码的执行上下文与当前进程隔离。
被执行的代码无法获取本地作用域,只能在当前的 global 对象的上下文中编译并执行 code

const vm = require('vm')global.x = 10
global.y = 20
function test() {let sum = vm.runInThisContext('x + y')console.log(sum) // 30
}

完整代码实现

// index.jsconst vm = require('vm')
const axios = require('axios')// 在 global 对象上挂载对应的 callback 方法
global.jQuery11230971606670044967_1649312313646 = function(res) {// jsonp 接口返回的数据console.log(res)// do something
}async function getData() {let { data } = await axios({url: 'https://push2.eastmoney.com/api/qt/clist/get?cb=jQuery11230971606670044967_1649312313646&fid=f62&po=1&pz=10&pn=1&np=1&fltt=2&invt=2&fs=m%3A90+t%3A3&stat=1&fields=f12%2Cf14%2Cf2%2Cf3%2Cf62%2Cf184%2Cf66%2Cf69%2Cf72%2Cf75%2Cf78%2Cf81%2Cf84%2Cf87%2Cf204%2Cf205%2Cf124&ut=b2884a393a59ad64002292a3e90d46a5'})// 查看返回内容的类型console.log(typeof data)// 执行 callbackvm.runInThisContext(data)
}// 调用抓取数据的方法
getData()

特别提醒:
浏览器环境与 Node 执行环境挂载全局对象是有区别的。
在浏览器环境中,全局作用域可以使用 var 来声明一个变量或方法,会自动挂载到 window 对象上;
但是在 Node 环境中,每个文件或者模块,都会被封闭在一个单独的作用域,因此不管在哪里声明的变量,相对于当前模块或文件,都是在局部作用域,不会自动挂载到全局 global 对象中,如果要使用必须手动去挂载。

欢迎访问:天问博客

这篇关于服务端nodejs抓取jsonp接口数据的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/894788

相关文章

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

Python Selenium动态渲染页面和抓取的使用指南

《PythonSelenium动态渲染页面和抓取的使用指南》在Web数据采集领域,动态渲染页面已成为现代网站的主流形式,本文将从技术原理,环境配置,核心功能系统讲解Selenium在Python动态... 目录一、Selenium技术架构解析二、环境搭建与基础配置1. 组件安装2. 驱动配置3. 基础操作模

Spring Validation中9个数据校验工具使用指南

《SpringValidation中9个数据校验工具使用指南》SpringValidation作为Spring生态系统的重要组成部分,提供了一套强大而灵活的数据校验机制,本文给大家介绍了Spring... 目录1. Bean Validation基础注解常用注解示例在控制器中应用2. 自定义约束验证器定义自

Java对接Dify API接口的完整流程

《Java对接DifyAPI接口的完整流程》Dify是一款AI应用开发平台,提供多种自然语言处理能力,通过调用Dify开放API,开发者可以快速集成智能对话、文本生成等功能到自己的Java应用中,本... 目录Java对接Dify API接口完整指南一、Dify API简介二、准备工作三、基础对接实现1.

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel

SQL常用操作精华之复制表、跨库查询、删除重复数据

《SQL常用操作精华之复制表、跨库查询、删除重复数据》:本文主要介绍SQL常用操作精华之复制表、跨库查询、删除重复数据,这些SQL操作涵盖了数据库开发中最常用的技术点,包括表操作、数据查询、数据管... 目录SQL常用操作精华总结表结构与数据操作高级查询技巧SQL常用操作精华总结表结构与数据操作复制表结

Redis中的数据一致性问题以及解决方案

《Redis中的数据一致性问题以及解决方案》:本文主要介绍Redis中的数据一致性问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Redis 数据一致性问题的产生1. 单节点环境的一致性问题2. 网络分区和宕机3. 并发写入导致的脏数据4. 持

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程