目录
前言
本文介绍了如何使用 axios 发起 HTTP 请求获取网页新浪新闻军事 HTML 内容,通过cheerio 库解析网页内容并获取指定文本标题及链接,然后再通过提取的链接进行二次爬取以获取日期、作者、内容信息,最终通过 fs 模块将数据以 JSON 文件的形式保存至本地。
一、设计思路
- 使用 axios 发起 HTTP 请求获取首页的 HTML 内容。
- 使用 cheerio 解析 HTML 内容,提取出标题和链接信息。
- 遍历提取出的链接列表,再次使用 axios 发起 HTTP 请求获取各个新闻详情页的 HTML 内容。
- 再次使用 cheerio 解析详情页 HTML 内容,提取出日期、作者和内容信息。
- 将所有信息组织成 JSON 格式的数据,并使用 fs 模块将数据保存到本地的 JSON 文件中。
二、实现方法
- 使用 axios 库发起 HTTP 请求获取网页内容。
- 使用 cheerio 库解析 HTML 内容,提取所需信息。
- 使用 async/await 来处理异步操作,确保代码的顺序执行。
- 使用 try/catch 来处理异常情况,确保程序的健壮性。
- 使用 fs 模块来进行文件读写操作,将数据保存为 JSON 文件。
三、核心代码及注解
// 导入模块
const axios = require('axios');
const cheerio = require('cheerio');
const fs = require('fs');
// URL
const URL = 'https://news.sina.com.cn/';
// 主函数,用于获取新闻数据并保存到本地
async function fetchDataFirst() {
try {
// 一次获取新闻首页的 HTML 内容
const response = await axios.get(URL);
if (response.status !== 200) {
throw new Error('Failed to fetch FirstData');
}
// 使用 cheerio 解析 HTML 内容
const html = response.data;
const $ = cheerio.load(html);
const dataFirst = [];
// 提取标题和链接信息
$('.blk_340 .link_c666 li').each((index, element) => {
const title = $(element).find('a').text().trim();
const href = $(element).find('a').attr('href');
dataFirst.push({ title, href });
});
// 二次获取,获取每篇新闻的详情信息
const dataSecond = await fetchDataSecond(dataFirst);
// 写入文件,将数据保存为 JSON 文件
const fileName = './sina-self.json';
await fs.promises.writeFile(fileName, JSON.stringify(dataSecond, null, 2));
} catch (error) {
console.error('Fetch failed', error.message);
}
}
// 辅助函数,用于获取每篇新闻的详情信息
async function fetchDataSecond(dataFirst) {
try {
const dataSecond = [];
for (const item of dataFirst) {
const { title, href } = item;
const response = await axios.get(href);
if (response.status !== 200) {
console.error('Failed to fetch SecondData');
}
// 使用 cheerio 解析详情页 HTML 内容
const html = response.data;
const $ = cheerio.load(html);
// 提取日期、作者和内容信息
const date = $('.date-source .date').text().trim();
const auther = $('.date-source .source').text().trim();
const content = $('.article p').text().trim();
// 将提取的信息组织成对象,并添加到数组中
dataSecond.push({ title, href, date, auther, content });
}
return dataSecond;
} catch (error) {
console.error('Fetch failed', error.message);
throw error;
}
}
// 调用主函数,开始执行爬取任务
fetchDataFirst();
这段代码实现了从新浪新闻首页获取新闻数据,并将数据保存到本地的 JSON 文件中。通过 axios 发起 HTTP 请求获取页面内容,再通过 cheerio 解析 HTML 内容,提取出所需信息。最后将提取的信息组织成 JSON 格式,并使用 fs 模块将数据保存到本地文件。