Node.js 实现简单爬虫

devtools/2025/2/12 19:31:50/

介绍

爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。
本文将使用 Nodejs 编写一个简单的爬虫脚本,爬取一个美食网站,获取菜品的标题和图片链接,并以表格的形式输出。

准备工作

1、初始化项目

首先,确保已安装 Node,然后创建一个新的文件目录,运行以下命令初始化 Node.js 项目

npm init -y

2、安装依赖

使用 axios 库来进行 HTTP 请求
使用 cheerio 库来解析 HTML 内容
使用 node-xlsx 库来将数据写入 Excel 文件

npm install axios cheerio node-xlsx --save

代码实现

1、创建爬虫脚本

在项目根目录下创建一个 crawler.js 文件,并写入以下代码

import axios from "axios";
import cheerio from "cheerio";// 目标网页的URL,这里使用 下厨房 这个美食网站作为测试
const targetUrl = "https://www.xiachufang.com/category/40076/";// 请求目标网页,获取HTML内容
const getHtml = async () => {const response = await axios.get(targetUrl);if (response.status !== 200) {throw new Error("请求失败");}return response.data;
};// 解析HTML内容,获取菜品的标题和图片链接
const getData = async (html) => {const $ = cheerio.load(html);const list = [];$(".normal-recipe-list li").each((i, elem) => {const imgUrl = $(elem).find("img").attr("src");const title = $(elem).find("p.name a").text();list.push({title: title.replace(/[\n\s]+/g, ""),imgUrl,});});return list;
};

2、以 Excel 表格形式保存数据

import xlsx from "node-xlsx";
import fs from "fs";// 根据 表头数据 和 列表数据 转换成二维数组
const transData = (columns, tableList) => {const data = columns.reduce((acc, cur) => {acc.titles.push(cur.header);acc.keys.push(cur.key);return acc;},{ titles: [], keys: [] });const tableBody = tableList.map((item) => {return data.keys.map((key) => item[key]);});return [data.titles, ...tableBody];
};const writeExcel = (list) => {// 表头const columns = [{ header: "菜名", key: "title" },{ header: "图片链接", key: "imgUrl" },];// 构建表格数据const tableData = transData(columns, list);const workbook = xlsx.build([{name: "菜谱",data: tableData,},]);// 写入文件fs.writeFileSync("./菜谱.xlsx", workbook, "binary");
};

3、执行

(async () => {const html = await getHtml();const list = await getData(html);await writeExcel(list);console.log("执行完毕");
})();

运行爬虫

在终端中运行以下命令来执行爬虫代码

node crawler.js

效果图

Effect Picture

总结

通过学习这个简单的示例,您可以进一步探索更复杂的爬虫应用,处理更多类型的网页和数据,并加入更多功能来实现您自己的爬虫项目。


http://www.ppmy.cn/devtools/158291.html

相关文章

ESP8266配置为TCP客户端,连接电脑和手机(使用Arduino配置)

一、简介 基于 ESP8266 的 Arduino 代码,其主要功能是将 ESP8266 连接到指定的 Wi-Fi 网络,并与指定 IP 地址和端口号的服务器建立 TCP 连接。在连接成功后,实现了串口和网络数据的双向传输,也就是将从串口接收到的数据通过 Wi-Fi…

(篇五)基于PyDracula搭建一个深度学习的软件之融入大华相机

1大华python文件解读 我们正常打开MVviewer会发现这些文件。我的应用场景是PLC给我一个信号,我就触发拍照程序,那么我需要选取哪一个文件作为研究基础呢? 1.1 异步回调byCallBack和手动轮询byGetFrame 异步回调 采用 异步回调 (attachGr…

【Linux系统】—— 简易进度条的实现

【Linux系统】—— 简易进度条的实现 1 回车和换行2 缓冲区3 进度条的准备代码4 第一版进度条5 第二版进度条 1 回车和换行 先问大家一个问题:回车换行是什么,或者说回车和换行是同一个概念吗?   可能大家对回车换行有一定的误解&#xff0…

JVM(Java 虚拟机)

Java语言的解释性和编译性(通过JVM 的执行引擎) Java 代码(.java 文件)要先使用 javac 编译器编译为 .class 文件(字节码),紧接着再通过JVM 的执行引擎(Execution Engine&#xff09…

React受控组件的核心原理与实战精要

在 React 中,受控组件(Controlled Component) 是一种重要的模式,用于通过组件的状态来管理表单元素的值。这种模式不仅确保了数据的一致性和可预测性,还便于与其他功能(如验证和格式化)集成。本…

使用deepseek快速创作ppt

目录 1.在DeekSeek生成PPT脚本2.打开Kimi3.最终效果 DeepSeek作为目前最强大模型,其推理能力炸裂,但是DeepSeek官方没有提供生成PPT功能,如果让DeepSeek做PPT呢? 有个途径:在DeepSeek让其深度思考做出PPT脚本&#xf…

JUnit5 单元测试详解

目录 一、什么是单元测试,为什么要进行单元测试? 二、JUnit 框架介绍 1.如何引进这些Jar包? 2.如何查看是否引进? ⑴. Project(项目) ⑵. Modules(模块) ⑶. Libraries&#…

【系统设计】Spring、SpringMVC 与 Spring Boot 技术选型指南:人群、场景与实战建议

在 Java 开发领域,Spring 生态的技术选型直接影响项目的开发效率、维护成本和长期扩展性。然而,面对 Spring、SpringMVC 和 Spring Boot 这三个紧密关联的框架,开发者常常陷入纠结:该从何入手?如何根据团队能力和业务需…