利用axios库在Node.js中进行代理请求的实践

news/2024/4/16 15:24:11/文章来源:https://blog.csdn.net/Z_suger7/article/details/136506232

亿牛云 (3).png

前言

随着互联网的蓬勃发展,Web应用程序越来越依赖于从外部服务器获取数据。在这个过程中,我们经常需要通过代理服务器来访问外部资源。本文将介绍如何充分利用axios库,在Node.js中进行代理请求的最佳实践,并通过一个实际案例来展示其应用。

axios库技术优势

axios是一个强大的基于Promise的HTTP客户端,它在浏览器和Node.js环境中均可使用。在使用axios的过程中,我们可以充分体验到它的技术优势,包括但不限于:

  1. 简单易用:axios提供了简洁而直观的API,使得发送HTTP请求变得轻而易举。
  2. 支持Promise:通过使用Promise,axios使得异步代码更加清晰,易于理解。
  3. 拦截器:axios支持请求和响应拦截器,这为我们提供了在请求和响应发生时进行额外处理的机会。
  4. 并发请求:通过axios,我们可以轻松地同时发送多个并发请求,并在所有请求完成后进行处理。

实现功能

利用axios库在Node.js中进行代理请求,我们可以实现如下功能:

  1. 发送HTTP请求并获取外部资源。
  2. 通过代理服务器访问受限制的资源。
  3. 处理代理请求的异常情况,确保应用的稳定性和可靠性。

爬取QQ音乐数据实践案例

目标分析

假设我们的目标是从QQ音乐网站爬取歌曲数据,包括歌曲名称、歌手、专辑等信息,并将数据保存到本地文件中。

构建爬虫框架

首先,我们需要安装必要的依赖:

npm install axios cheerio

然后,引入相关模块:

const axios = require('axios');
const fs = require('fs');
const cheerio = require('cheerio');

接下来,我们创建代理axios实例:

const proxyAxios = axios.create({baseURL: 'https://proxy.example.com', // 代理服务器地址
});

完整示例爬取过程

接下来,我们编写爬取歌曲数据的代码:

const axios = require('axios');
const fs = require('fs');
const cheerio = require('cheerio');// 设置代理信息
const proxyHost = "www.16yun.cn";
const proxyPort = "5445";
const proxyUser = "16QMSOML";
const proxyPass = "280651";// 创建代理axios实例
const proxyAxios = axios.create({baseURL: 'https://y.qq.com',proxy: {host: proxyHost,port: proxyPort,auth: {username: proxyUser,password: proxyPass}}
});// 发送代理请求获取QQ音乐网站页面内容
proxyAxios.get('/').then(response => {// 解析HTML内容const $ = cheerio.load(response.data);const songs = [];// 提取歌曲数据$('.song-list .song-item').each((index, element) => {const song = {name: $(element).find('.song-name').text(),singer: $(element).find('.singer-name').text(),album: $(element).find('.album-name').text(),};songs.push(song);});// 将歌曲数据保存到本地文件fs.writeFile('songs.json', JSON.stringify(songs, null, 2), err => {if (err) {console.error('保存文件发生错误:', err);} else {console.log('歌曲数据已保存到songs.json');}});}).catch(error => {console.error('代理请求发生错误:', error);});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_996316.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【NVCC,CUDA,NVIDIA驱动】装了pytorch,nvcc -V不能用,但能正常使用gpu

这里写目录标题 问题描述问题原理为什么anaconda安装的Pytorch,其能够直接在gpu上运行NVCC是什么,怎么查看装没装 如果没有NVCC文件夹,应该如何安装NVCC?CUDNN:Local Installer for Linux x86_64和Local Installer for…

单例模式及应用场景

如果希望自己的代码更优雅、可维护性更高以及更简洁,往往离不开设计模式这一解决方案。 在JS设计模式中,最核心的思想:封装变化(将变与不变分离,确保变化的部分灵活,不变的部分稳定)。 那么来…

ssm基于javaEE+springboot校园闲置二手物品拍卖交易平台_ngad7

为提升浏览用户观感及使用体验,本系统要具有易用性和美观性。通过页面的简单提示就可完成操作,校园闲置物品交易平台展示界面应该清楚简洁,使用户通过美观的前台页面能快速定位想要浏览的校园闲置物品交易平台信息。后台界面也应简约&#xf…

YOLOv5创新改进:SPPF创新涨点篇 | SPPELAN:SPP创新结合ELAN ,效果优于SPP、SPPF| YOLOv9

💡💡💡本文独家改进:新颖SPPF创新涨点改进,SPP创新结合ELAN,来自于YOLOv9,助力YOLOv5,将SPPELAN代替原始的SPPF 💡💡💡在多个私有数据集和公开数据集VisDrone2019、PASCAL VOC实现涨点 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12…

基于ACM32 MCU的两轮车充电桩方案,打造高效安全的电池管理

随着城市化进程的加快、人们生活水平的提高和节能环保理念的普及,越来越多的人选择了电动车作为代步工具,而两轮电动车的出行半径较短,需要频繁充电,因此在城市中设置两轮车充电桩就非常有必要了。城市中的充电桩不仅能解决两轮车…

Linux 之三:CentOS7 目录结构 和 日期及时区设置

Linux 目录 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令。/boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。/dev : dev是Device(设备)的缩写…

深度学习1:神经网络原理与算法详解

一、神经网络:模拟大脑的信息处理机制 神经网络,作为深度学习的基础,其灵感来源于人脑神经元之间的复杂连接和信号传递方式。在神经网络中,每个神经元都是一个计算单元,它接收来自其他神经元的输入信号,并…

RabbitMQ 交换器

RabbitMQ 交换器 官方例子 http://www.rabbitmq.com/getstarted.html direct 如上图所示,两个队列绑定到了direct交换器上,第一个队列绑定的 binding key 为 orange ,第二个队列有两个绑定,分别是 black 和 green 。 如上图所示…

Three.js--》探寻Cannon.js构建震撼的3D物理交互体验(二)

我们用three.js可以绘制出各种酷炫的画面,但是当我们想要一个更加真实的物理效果的话,这个时候我们就需要一个物理的库,接下来我们就讲解一下今天要学习的canon,它可以给我们提供一个更加真实的物理效果,像物体的张力、…

Django学习记录08——图表及文件上传案例

1.图表Echarts的应用 Apache ECharts 1.1 使用方法 引用echarts.js即可到官方文档中查询使用 1.2 常用图标的使用 图表展示页面的部署&#xff08;主要展示折线图、柱状图、饼图&#xff09; {% block content %}<div class"container"><div class&qu…

Java单测Mock升级实践

Java单测Mock升级实践 一、背景 众所周知&#xff0c;单元测试是改善代码质量&#xff0c;提升研发交付品质的手段之一&#xff0c;能否写出好的单元测试用例&#xff0c;也是衡量我们研发专业性的标准之一。所以&#xff0c;想要成为一名合格的研发&#xff0c;就应该要有编…

Android Studio中debug功能详解

本文为大家分享了Android Studio debug功能的具体使用方法&#xff0c;供大家参考&#xff0c;具体内容如下 运行debug模式 \1. 进入debug – 点击图中红色圆圈圈起的左边绿色按钮&#xff0c;运行app的debug模式&#xff0c;快捷键ShiftF9 – 点击图中红色圆圈圈起的右边按…

【异常处理】Vue报错 Component template should contain exactly one root element.

问题描述 启动VUE项目后控制台报错&#xff1a; Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.翻译为&#xff1a;组件模板应该只包含一个根元素 查看vue代码&#xff0…

恢复IDEA误删除的git提交,提交被删除,尝试恢复提交

​​​​​​ dgqDESKTOP-JRQ5NMD MINGW64 /f/IdeaProjects/workspace/spzx-parent ((8bb112e...)) $ git reflog 8bb112e (HEAD, origin/master, master) HEAD{0}: checkout: moving from master to 8bb112e5ac18dfe4bbd64adfd06363e46b609f21 8bb112e (HEAD, origin/master, …

Objective-C blocks 概要

1.block的使用 1.1什么是block&#xff1f; Blocks是C语言的扩充功能&#xff1a;带有自动变量&#xff08;局部变量&#xff09;的匿名函数。 “带有自动变量”在Blocks中表现为“截取自动变量" “匿名函数”就是“不带名称的函数” 块&#xff0c;封装了函数调用及调用…

【LeetCode:98. 验证二叉搜索树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目

作者推荐 视频算法专题 本文涉及知识点 树上倍增 树 图论 并集查找 换根法 深度优先 割点 LeetCode3067. 在带权树网络中统计可连接服务器对数目 给你一棵无根带权树&#xff0c;树中总共有 n 个节点&#xff0c;分别表示 n 个服务器&#xff0c;服务器从 0 到 n - 1 编号…

剑指offer 二维数组中的查找 C++

目录 前言 一、题目 二、解题思路 1.直接查找 2.二分法 三、输出结果 前言 最近在牛客网刷题&#xff0c;刷到二维数组的查找&#xff0c;在这里记录一下做题过程 一、题目 描述 在一个二维数组中&#xff08;每个一维数组的长度相同&#xff09;&#xff0c;每一行都按照…

Rust入门:Rust如何调用C静态库的函数

关于Rust调用C&#xff0c;因为接口比较复杂&#xff0c;貌似Rust不打算支持。而对于C函数&#xff0c;则相对支持较好。 如果要研究C/Rust相互关系的话&#xff0c;可以参考&#xff1a; https://docs.rs/cxx/latest/cxx/ Rust ❤️ C 这里只对调用C静态库做一个最简短的介…

Linux第71步_将linux中的多个文件编译成一个驱动模块

学习目的&#xff1a;采用旧字符设备测试linux系统点灯&#xff0c;进一步熟悉其设计原理。采用多文件参与编译&#xff0c;深度学习编写Makefile&#xff0c;有利于实现驱动模块化设计。 1、创建MyOldLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home…