服务端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

相关文章

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

Java整合Protocol Buffers实现高效数据序列化实践

《Java整合ProtocolBuffers实现高效数据序列化实践》ProtocolBuffers是Google开发的一种语言中立、平台中立、可扩展的结构化数据序列化机制,类似于XML但更小、更快... 目录一、Protocol Buffers简介1.1 什么是Protocol Buffers1.2 Pro

Python实现数据可视化图表生成(适合新手入门)

《Python实现数据可视化图表生成(适合新手入门)》在数据科学和数据分析的新时代,高效、直观的数据可视化工具显得尤为重要,下面:本文主要介绍Python实现数据可视化图表生成的相关资料,文中通过... 目录前言为什么需要数据可视化准备工作基本图表绘制折线图柱状图散点图使用Seaborn创建高级图表箱线图热

MySQL数据脱敏的实现方法

《MySQL数据脱敏的实现方法》本文主要介绍了MySQL数据脱敏的实现方法,包括字符替换、加密等方法,通过工具类和数据库服务整合,确保敏感信息在查询结果中被掩码处理,感兴趣的可以了解一下... 目录一. 数据脱敏的方法二. 字符替换脱敏1. 创建数据脱敏工具类三. 整合到数据库操作1. 创建服务类进行数据库

MySQL中处理数据的并发一致性的实现示例

《MySQL中处理数据的并发一致性的实现示例》在MySQL中处理数据的并发一致性是确保多个用户或应用程序同时访问和修改数据库时,不会导致数据冲突、数据丢失或数据不一致,MySQL通过事务和锁机制来管理... 目录一、事务(Transactions)1. 事务控制语句二、锁(Locks)1. 锁类型2. 锁粒

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC