JavaScript爬虫基础篇:HTTP 请求与响应
在互联网的世界里,数据无处不在。无论是新闻资讯、商品信息,还是社交媒体动态,这些数据都以各种形式存储在服务器上。而爬虫,就是我们获取这些数据的得力助手。今天,我们就来聊聊爬虫的基础——HTTP 请求与响应,以及如何用 Axios 和 node-fetch 这两个工具轻松上手。
一、HTTP 请求:和服务器打招呼
想象一下,你去朋友家做客,首先得敲门吧?HTTP 请求就像是你敲门的动作,告诉服务器“我来了,我想干啥”。服务器收到你的请求后,会回复你“好嘞,给你数据”或者“不行,你不能这么做”。
1.1 常见的 HTTP 请求方法
-
GET:就像你问朋友“你家有啥好吃的吗?”这是用来获取数据的。
-
POST:相当于你递给朋友一个包裹,说“这个给你,帮我存着”。这是用来提交数据的。
-
PUT/PATCH:类似于“我帮你把这个东西修一下”,用来更新数据。
-
DELETE:就像你说“这个东西不要了,扔了吧”,用来删除数据。
二、Axios 和 node-fetch:你的得力工具
在 JavaScript 世界里,发送 HTTP 请求有多种方式,但 Axios 和 node-fetch 是两个非常受欢迎的工具。它们就像你手中的万能钥匙,能轻松打开服务器的大门。
2.1 为什么选择它们?
-
Axios:它支持浏览器和 Node.js,返回的是 Promise,这样你可以很方便地处理异步操作。而且,它还支持拦截器,可以自动转换 JSON 数据,简直是懒人的福音。
-
node-fetch:轻量级,专注于 Node.js 环境,语法简洁,适合快速开发。就像一把小巧的瑞士军刀,关键时刻能派上大用场。
三、用 Axios 发送 HTTP 请求
3.1 安装 Axios
在项目中安装 Axios:
npm install axios
3.2 发送 GET 请求
const axios = require('axios');// 发送 GET 请求
axios.get('https://api.example.com/data').then(response => {console.log('服务器返回的数据:', response.data);}).catch(error => {console.error('请求出错:', error);});
就像你敲门后,朋友把好吃的递给你,response.data 就是朋友给你的“好吃的”。
3.3 发送 POST 请求
const axios = require('axios');// 发送 POST 请求
axios.post('https://api.example.com/login', {username: 'user123',password: 'pass123'
}).then(response => {console.log('登录成功,返回数据:', response.data);}).catch(error => {console.error('登录失败:', error);});
这就像你递给朋友一个包裹,里面装着你的用户名和密码。
3.4 设置请求头
有时候,你需要告诉服务器一些额外的信息,比如你是什么类型的客户端(User-Agent),或者携带 Cookie:
const axios = require('axios');axios.get('https://api.example.com/data', {headers: {'User-Agent': 'MyApp/1.0','Cookie': 'session=abc123'}
}).then(response => {console.log('响应数据:', response.data);}).catch(error => {console.error('出错:', error);});
这就像是你敲门时,顺便告诉朋友“我是用手机来的,还带着上次的通行证”。
四、用 node-fetch 发送 HTTP 请求
4.1 安装 node-fetch
在项目中安装 node-fetch:
npm install node-fetch
4.2 发送 GET 请求
const fetch = require('node-fetch');// 发送 GET 请求
fetch('https://api.example.com/data').then(response => response.json()) // 将响应体转换为 JSON.then(data => {console.log('服务器返回的数据:', data);}).catch(error => {console.error('请求出错:', error);});
4.3 发送 POST 请求
const fetch = require('node-fetch');// 发送 POST 请求
fetch('https://api.example.com/login', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({username: 'user123',password: 'pass123'})
}).then(response => response.json()).then(data => {console.log('登录成功,返回数据:', data);}).catch(error => {console.error('登录失败:', error);});
4.4 设置请求头和参数
const fetch = require('node-fetch');fetch('https://api.example.com/data', {method: 'GET',headers: {'User-Agent': 'MyApp/1.0','Cookie': 'session=abc123'}
}).then(response => response.json()).then(data => {console.log('响应数据:', data);}).catch(error => {console.error('出错:', error);});
五、处理 JSON 和 HTML 数据
5.1 JSON 数据
JSON 是服务器返回数据的常见格式,就像朋友给你递了一盒巧克力,Axios 和 node-fetch 都能轻松处理:
// Axios 示例
axios.get('https://api.example.com/data').then(response => {console.log('JSON 数据:', response.data);});// node-fetch 示例
fetch('https://api.example.com/data').then(response => response.json()).then(data => {console.log('JSON 数据:', data);});
5.2 HTML 数据
如果服务器返回的是 HTML(比如网页内容),就像朋友给你递了一本菜谱,你可以用 cheerio 这样的工具来解析:
const fetch = require('node-fetch');
const cheerio = require('cheerio');fetch('https://example.com').then(response => response.text()) // 获取 HTML 文本.then(html => {const $ = cheerio.load(html); // 加载 HTMLconst title = $('title').text(); // 提取标题console.log('网页标题:', title);});
六、请求头与参数:让请求更专业
6.1 什么是请求头?
请求头就像是你敲门时的自我介绍。你可以告诉服务器:
-
User-Agent:我是用什么设备来的(比如浏览器类型)。
-
Cookie:我上次来的时候,你给我的通行证。
-
Content-Type:我给你递的包裹里面装的是什么类型的东西(比如 JSON、表单数据)。
6.2 如何设置请求头?
// Axios 示例
axios.get('https://api.example.com/data', {headers: {'User-Agent': 'MyApp/1.0','Cookie': 'session=abc123'}
});// node-fetch 示例
fetch('https://api.example.com/data', {method: 'GET',headers: {'User-Agent': 'MyApp/1.0','Cookie': 'session=abc123'}
});
6.3 如何设置请求参数?
有时候,你需要在 GET 请求中携带一些参数,比如搜索关键词:
// Axios 示例
axios.get('https://api.example.com/search', {params: {query: '爬虫',page: 1}
});// node-fetch 示例
fetch('https://api.example.com/search?query=爬虫&page=1');
这就像是你敲门时说“我来查爬虫相关的资料,第一页就好”。
七、总结
通过 Axios 和 node-fetch,你可以轻松发送 HTTP 请求并处理响应数据。Axios 更适合需要复杂功能的场景,而 node-fetch 则是轻量级的选择。无论是获取 JSON 数据还是解析 HTML 页面,这些工具都能帮你在爬虫的道路上一路畅通。
如果你是初学者,建议先从 Axios 开始,它的语法更友好,功能也更强大。等你熟悉后,可以尝试 node-fetch,看看它的简洁风格是否更适合你的项目需求。
相关文章:
JavaScript爬虫基础篇:HTTP 请求与响应
在互联网的世界里,数据无处不在。无论是新闻资讯、商品信息,还是社交媒体动态,这些数据都以各种形式存储在服务器上。而爬虫,就是我们获取这些数据的得力助手。今天,我们就来聊聊爬虫的基础——HTTP 请求与响应&#x…...
Python中的count()方法
文章目录 Python中的count()方法基本语法在不同数据类型中的使用1. 列表(List)中的count()2. 元组(Tuple)中的count()3. 字符串(String)中的count() 高级用法1. 指定搜索范围2. 统计复杂元素 注意事项 Python中的count()方法 前言:count()是Python中用于序列类型&a…...
LWIP_MQTT连接ONENET
前言: 使用正点原子STM32F407, LWIP,MQTT demo,验证LwIP的MQTT连接ONENET物联网平台,测试整个链路是否畅通,后面再详细分析LWIP移植和MQTT协议的使用。 26 基于 MQTT 协议连接 OneNET 服务器 本章主要介绍 lwIP 如何通过 MQTT 协议将设备连接到 OneNET…...
代码随想录刷题|Day20(组合总数,组合总数2、分割回文串)
回溯算法 Part02 组合总数 力扣题目链接 代码随想录链接 视频讲解 题目描述: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你…...
文件描述符(File Descriptor, FD)详解及利用方法
文件描述符(FD)是 Linux/Unix 系统中用于访问文件、管道、套接字等 I/O 资源的整数标识符。每个进程默认打开 3 个标准文件描述符: FD名称默认绑定设备用途0stdin键盘标准输入(读取数据)1stdout终端屏幕标准输出&…...
Minecraft盔甲机制详解(1.9之后)
Minecraft的盔甲有很多种,但是评判盔甲的好坏,通常玩家会使用一个变量来评判——护甲值 护甲值的机制很简单,一格护甲值 (半个灰色的衣服图标)最多能提供4%的防御 护甲值在不开作弊的生存模式理论上限是20点…...
ArcGIS Desktop使用入门(四)——9版本与10版本区别
系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…...
R语言之环境清理
有时候 R 环境中残留的变量可能会导致警告,可以尝试清理工作空间并重新加载数据。 警告信息: In mget(objectNames, envir ns, inherits TRUE) : 重新评估被中断的许诺 # 观察前6行 head(iris)# 观察数据结构 str(iris)# 探知数据的极值和分位数,以及…...
javaSE————网络编程套接字
网络编程套接字~~~~~ 好久没更新啦,蓝桥杯爆掉了,从今天开始爆更嗷; 1,网络编程基础 为啥要有网络编程呢,我们进行网络通信就是为了获取丰富的网络资源,说实话真的很神奇,想想我们躺在床上&a…...
FreeRTOS二值信号量详解与实战教程
FreeRTOS二值信号量详解与实战教程 📚 作者推荐:想系统学习FreeRTOS嵌入式开发?请访问我的FreeRTOS开源学习库,内含从入门到精通的完整教程和实例代码! 1. 二值信号量核心概念解析 二值信号量(Binary Semaphore)是Fre…...
Java命名规则
在 Java 项目中,命名规则遵循一定的约定俗成规范,目的是提高代码可读性和团队协作效率。以下是 Java 项目命名的核心规则和常见实践: 一、项目整体命名 项目名 使用小写字母 短横线(kebab-case)…...
赛灵思 XCVU440-2FLGA2892E XilinxFPGA Virtex UltraScale
XCVU440-2FLGA2892E 属于 Xilinx Virtex UltraScale 系列,是面向高端应用的旗舰 FPGA 器件。该系列产品以出色的高并行处理能力、丰富的逻辑资源和高速互联能力闻名,广泛用于 高性能计算、数字信号处理等对计算能力和带宽要求极高的场景。采用先进的 20n…...
Spring Cloud Alibaba微服务-微服务介绍和搭建
1. 课程介绍 单体服务中有订单,用户,库存, 两个缺陷: a. 是以应用的维度进行负载均衡,资源占用大 b. 当其中一个模块宕机,整个应用就不能用了; nacos;ribbon,loadBa…...
KALI安装JAVA8和切换JDK版本
一、安装JDK1.8 1、直接使用下面的地址下载java 1.8: https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz 2、建立目录,将下载的jdk的安装包复制过去并进行解压 sudo mkdir -p /usr/local/java cp jdk-8u202-linux-x64.t…...
C语言中冒泡排序和快速排序的区别
冒泡排序和快速排序都是常见的排序算法,但它们在原理、效率和应用场景等方面存在显著区别。以下是两者的详细对比: 一、算法原理 1. 冒泡排序 原理:通过重复遍历数组,比较相邻元素的大小,并在必要时交换它们的位置。…...
今日行情明日机会——20250417
指数目前在区间内缩量震荡 2025年4月17日涨停主要行业方向分析 一、核心主线方向 化工(产能优化涨价预期) • 涨停家数:11家(最强方向)。 • 代表标的: ◦ 红宝丽(2连板)ÿ…...
C# 对列表中的元素的多个属性进行排序
目录 前言一、OrderBy、OrderByDescending、ThenBy、ThenByDescending二、Sort 前言 在开发过程中,我们经常需要 根据列表中的元素的某个属性进行排序,下面我们将简单介绍常用的排序函数。 例如此处有一个类,拥有的元素为编号和值 public …...
QML 信号与槽
QML 信号与槽 QML 是 Qt 框架中用于构建现代化、流畅用户界面的声明式语言,其信号与槽(Signals and Slots)机制是实现组件间通信和交互的核心特性。与 C 的信号与槽类似,QML 的信号与槽提供了一种松耦合的方式,允许界…...
一篇讲完自动化测试基础-Python【万字详细讲解】12
✨博客主页: https://blog.csdn.net/m0_63815035?typeblog 💗《博客内容》:.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 📢博客专栏: https://blog.csdn.net/m0_63815035/cat…...
极限编程(XP)简介及其价值观与最佳实践
目录 一、什么是极限编程(XP)二、极限编程的核心价值观1. 沟通2. 简单3. 反馈4. 勇气 三、极限编程的12个最佳实践1. 结对编程2. 40小时工作制3. 简单设计4. 代码规范5. 测试驱动开发(TDD)6. 系统隐喻7. 持续集成8. 重构9. 客户在…...
四层板的蛇形走线技巧:原理、策略与应用
在四层板的设计过程中,蛇形走线是一种常见且重要的布线方式。它能够满足特定的设计需求,如调整信号线长度、实现等长布线等,但如果使用不当,也可能会带来一些负面影响,如增加信号衰减、引入电磁干扰等。以下将详细探讨…...
面向对象—有理数类的设计
目录 1.代码呈现 1.1编写toString、equals方法 1.2测试代码 1.3有理数类的代码 2.论述题 3.有理类设计 1.代码呈现 1.1编写toString、equals方法 (1)toString方法 Overridepublic String toString(){if(this.v20){return "Undefined";}return this.v1 "/…...
408数据结构绪论刷题001
答案:D 解析: • A选项:数据元素是组成数据对象的基本单位 ,它只是数据的基本个体,不能完整定义数据结构,所以A选项错误。 • B选项:数据对象是性质相同的数据元素的集合,仅仅描述…...
Leetcode 3359. 查找最大元素不超过 K 的有序子矩阵【Plus题】
1.题目基本信息 1.1.题目描述 给定一个大小为 m x n 的二维矩阵 grid。同时给定一个 非负整数 k。 返回满足下列条件的 grid 的子矩阵数量: 子矩阵中最大的元素 小于等于 k。 子矩阵的每一行都以 非递增 顺序排序。 矩阵的子矩阵 (x1, y1, x2, y2) 是通过选择…...
文件系统 软硬连接
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、理解文件系统 🌠磁盘结构 二、软硬连接 🌟软硬链接 🌠软链接: 🌠硬链接: 🌟理解软硬链接的应…...
Halcon-交互式处理图像模式
draw_rectangle1,这是halcon一个交互函数,当运行到这句话时,我们可以通过鼠标左键在图片上画一个矩形,然后通过鼠标右键结束交互过程。然后,我们就可以得到我们绘制矩形的左上角的点坐标,以及右下角的点坐标…...
计算机视觉——JPEG AI 标准发布了图像压缩新突破与数字图像取证的挑战及应对策略
概述 今年2月,经过多年旨在利用机器学习技术开发一种更小、更易于传输和存储且不损失感知质量的图像编解码器的研究后,JPEG AI国际标准正式发布。 来自JPEG AI官方发布流,峰值信噪比(PSNR)与JPEG AI的机器学习增强方法…...
Oracle 19c部署之数据库软件安装(二)
在完成了Oracle Linux 9的初始化配置之后,我们准备安装Oracle 19c数据库软件。 Oracle数据库支持两种主要的安装方式:图形化安装和静默安装。这两种方法各有优缺点,选择哪种取决于你的具体需求、环境配置以及个人偏好。 图形化安装 图形化安…...
音视频相关协议和技术内容
视频编解码: H264(AVC,MPEG-4 Part 10) 高压缩率,支持多种分辨率和帧率,用于在线流媒体、会议、数字电视 编码过程: 分块处理,将视频帧划分为宏块(16x16)使用帧预测和…...
在Vmware15(虚拟机免费) 中安装纯净win10详细过程
一、软件备选 1. VMware15.5.1 网盘下载地址 链接: https://pan.baidu.com/s/1y6GLJ2MG-1tomWblt3otsg?pwdim8e 提取码: im8e 2. windows镜像下载 去官网下载ios包 链接:https://www.microsoft.com/zh-cn/software-download/windows10 二、在VMware15.5.1下安装w…...
