基于Node.js的网页爬虫

目录

前言

一、设计思路

二、实现方法

三、核心代码及注解


前言

        本文介绍了如何使用 axios 发起 HTTP 请求获取网页新浪新闻军事 HTML 内容,通过cheerio 库解析网页内容并获取指定文本标题及链接,然后再通过提取的链接进行二次爬取以获取日期、作者、内容信息,最终通过 fs 模块将数据以 JSON 文件的形式保存至本地。


一、设计思路

  1. 使用 axios 发起 HTTP 请求获取首页的 HTML 内容。
  2. 使用 cheerio 解析 HTML 内容,提取出标题和链接信息。
  3. 遍历提取出的链接列表,再次使用 axios 发起 HTTP 请求获取各个新闻详情页的 HTML 内容。
  4. 再次使用 cheerio 解析详情页 HTML 内容,提取出日期、作者和内容信息。
  5. 将所有信息组织成 JSON 格式的数据,并使用 fs 模块将数据保存到本地的 JSON 文件中。

二、实现方法

  1. 使用 axios 库发起 HTTP 请求获取网页内容。
  2. 使用 cheerio 库解析 HTML 内容,提取所需信息。
  3. 使用 async/await 来处理异步操作,确保代码的顺序执行。
  4. 使用 try/catch 来处理异常情况,确保程序的健壮性。
  5. 使用 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 模块将数据保存到本地文件。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值