Node.js实现爬虫程序的核心逻辑是通过发送网络请求获取目标页面的HTML内容,再解析页面结构提取需要的数据,整个过程可以拆分为请求发送、页面解析、数据处理三个核心步骤,下面逐步介绍具体实现方法。

一、准备所需依赖库
实现Node.js爬虫不需要从零封装网络请求和解析逻辑,常用的两个核心库可以大幅降低开发成本:
- axios:用于发送HTTP请求,支持Promise语法,使用简单,能快速获取目标页面的响应内容。
- cheerio:可以像使用jQuery一样解析HTML字符串,提供便捷的选择器语法来提取页面中的数据。
首先初始化Node.js项目并安装这两个依赖:
# 初始化项目 npm init -y # 安装依赖 npm install axios cheerio
二、发送请求获取页面内容
使用axios发送GET请求到目标页面,获取返回的HTML字符串,需要注意部分网站会有反爬机制,可能需要设置请求头模拟浏览器访问。
const axios = require('axios');
// 目标页面地址,这里以示例站点为例
const targetUrl = 'https://ipipp.com/demo';
// 发送请求获取页面内容
async function fetchPage(url) {
try {
const response = await axios.get(url, {
headers: {
// 模拟浏览器请求头,降低被反爬拦截的概率
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
});
return response.data;
} catch (error) {
console.error('请求页面失败:', error.message);
return null;
}
}三、解析页面提取数据
拿到HTML字符串后,使用cheerio加载内容,通过CSS选择器定位到需要的数据节点,提取对应的文本或属性值。
const cheerio = require('cheerio');
// 解析页面提取数据
function parsePage(html) {
if (!html) return [];
// 加载HTML内容
const $ = cheerio.load(html);
const result = [];
// 假设目标数据在class为item的div元素中,每个item包含标题和链接
$('.item').each((index, element) => {
const title = $(element).find('.title').text().trim();
const link = $(element).find('a').attr('href');
if (title && link) {
result.push({
title,
link
});
}
});
return result;
}四、完整爬虫示例
把上面的步骤组合起来,就可以得到一个完整的可运行爬虫程序,运行后会输出提取到的数据。
const axios = require('axios');
const cheerio = require('cheerio');
const targetUrl = 'https://ipipp.com/demo';
async function fetchPage(url) {
try {
const response = await axios.get(url, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
});
return response.data;
} catch (error) {
console.error('请求页面失败:', error.message);
return null;
}
}
function parsePage(html) {
if (!html) return [];
const $ = cheerio.load(html);
const result = [];
$('.item').each((index, element) => {
const title = $(element).find('.title').text().trim();
const link = $(element).find('a').attr('href');
if (title && link) {
result.push({
title,
link
});
}
});
return result;
}
// 执行爬虫
async function runCrawler() {
const html = await fetchPage(targetUrl);
const data = parsePage(html);
console.log('提取到的数据:', data);
}
runCrawler();五、注意事项
开发爬虫程序时需要遵守相关规范,避免带来不必要的风险:
- 遵守目标网站的robots.txt协议,不要抓取禁止访问的内容。
- 控制请求频率,避免短时间内发送大量请求给目标服务器造成压力。
- 不要抓取涉及隐私、版权的内容,仅用于合法的学习和测试场景。
- 如果目标页面是动态渲染的,普通请求无法获取完整内容,需要结合puppeteer等无头浏览器工具实现。
以上就是Node.js实现爬虫程序的完整流程,开发者可以根据实际需求调整选择器和请求逻辑,适配不同的目标站点。