Nodejs cnbeta-rss : 抓取 cnbeta 全文 + 热门评论 [开源]

Nodejs cnbeta-rss : 抓取 cnbeta 全文 + 热门评论 [开源]

github : https://github.com/vfasky/cnbeta-rss

cnbeta-rss

  • cnbeta 全文 + 热门评论 feed 输出

  • 基于 nodejs , mongoDb 性能强劲

  • 在 2 分钟内完成与 cnbeta.com 新内容的同步

demo :

特色 :

版权声明 :

  • 程序抓取的内容,版权归原作者所有

  • 不得利用抓取的内容取得任何形式的收入,除非原作者授权

  • 程序源代码的授权是 : BSD

为什么会有这个程序?

  • cnbeta.com 的广告太多了, 打开速度相当慢

  • 已经习惯用 RSS 阅读器看新闻, cnbeta 的 RSS 没有全文输出


8 回复

Nodejs cnbeta-rss : 抓取 cnbeta 全文 + 热门评论 [开源]

GitHub 地址


cnbeta-rss

项目简介

  • cnbeta 全文 + 热门评论 feed 输出
  • 基于 Node.js 和 MongoDB,性能强劲
  • 在 2 分钟内完成与 cnbeta.com 新内容的同步

Demo


特色

  • 简单的 MVC 实现

    • 可以作为入门示例,便于理解 MVC 架构。
  • 实现了简单的定时任务

    • 定时任务用于定期抓取 cnbeta 的最新内容。
  • 性能明显优于 PHP 版本


版权声明

  • 程序抓取的内容,版权归原作者所有

    • 抓取的内容仅用于学习和研究,不得用于商业用途。
  • 不得利用抓取的内容取得任何形式的收入

    • 除非原作者授权,否则不得将抓取的内容用于盈利性活动。
  • 程序源代码的授权是 : BSD

    • 源代码采用 BSD 许可证,允许自由使用和修改。

为什么会有这个程序?

  • cnbeta.com 的广告太多,打开速度慢

    • cnbeta 网站广告过多,影响了浏览体验。
  • 习惯用 RSS 阅读器看新闻,但 cnbeta 的 RSS 没有全文输出

    • 使用 RSS 阅读器时,发现 cnbeta 的 RSS 没有提供全文输出,因此开发此程序。

示例代码

以下是项目中的一部分核心代码,用于抓取 cnbeta 最新文章和热门评论:

const axios = require('axios');
const cheerio = require('cheerio');

// 抓取 cnbeta 最新文章列表
async function fetchArticles() {
  const response = await axios.get('http://www.cnbeta.com');
  const $ = cheerio.load(response.data);
  
  // 选择文章标题和链接
  const articles = [];
  $('.title a').each((index, element) => {
    articles.push({
      title: $(element).text(),
      link: $(element).attr('href')
    });
  });

  return articles;
}

// 抓取文章全文和评论
async function fetchArticleDetails(articleLink) {
  const response = await axios.get(articleLink);
  const $ = cheerio.load(response.data);

  // 提取文章正文
  const content = $('#article_content').html();
  
  // 提取热门评论
  const comments = [];
  $('.comment-item').each((index, element) => {
    comments.push({
      user: $(element).find('.username').text(),
      comment: $(element).find('.comment-content').text()
    });
  });

  return { content, comments };
}

// 主函数
async function main() {
  const articles = await fetchArticles();
  for (const article of articles) {
    const details = await fetchArticleDetails(article.link);
    console.log(`Title: ${article.title}`);
    console.log(`Content: ${details.content}`);
    console.log(`Comments: ${JSON.stringify(details.comments, null, 2)}`);
  }
}

main();

这段代码展示了如何使用 axios 进行网页请求,并使用 cheerio 解析 HTML 获取所需的数据。通过这些数据,可以生成 RSS Feed 并存储到 MongoDB 中。


开源了的吗??

地址能否测试一下,你抓取的记录数量(希望万级以上)的和时间,评估一下性能?

地址: http://cnbeta.cnodejs.net
现在才运行1星期,到达万级需要一个月(视  cnbeta  每天的更新量)

很厉害的样子,马上订阅。

LZ您好,下载了你的仓库然后安装完所有依赖的packages后运行node app.js显示以下错误,不知道哪里做的不对: vents.js:71 throw arguments1; // Unhandled ‘error’ event ^ Error: listen EACCES at errnoException (net.js:769:11) at Server._listen2 (net.js:892:19) at listen (net.js:936:10) at Server.listen (net.js:985:5) at Object.<anonymous> (/Users/liaau003f/n/cnbeta-rss/cnbeta/app.js:52:27) at Module._compile (module.js:449:26) at Object.Module._extensions…js (module.js:467:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.runMain (module.js:492:10)

enter image description here

根据提供的信息,“Nodejs cnbeta-rss : 抓取 cnbeta 全文 + 热门评论 [开源]” 这个帖子介绍了一个基于 Node.js 和 MongoDB 实现的项目,用于抓取 Cnbeta(一个科技新闻网站)的文章全文及热门评论,并生成 RSS 输出。

该项目的主要特点包括:

  • 利用 Node.js 技术实现,性能强劲。
  • 能够在2分钟内完成与 Cnbeta 新内容的同步。
  • 提供了一个简单的 MVC 架构,适合作为入门学习示例。
  • 包含了简单的定时任务功能。
  • 使用 MongoDB 存储数据,确保高效的数据处理能力。
  • 程序源代码采用 BSD 协议进行开源授权。

该项目不仅能够帮助用户摆脱网页中过多广告的干扰,还提供了文章的全文阅读功能。此外,它还能抓取热门评论,让用户更好地了解社区讨论。

GitHub 项目地址:https://github.com/vfasky/cnbeta-rss

以下是该项目的核心功能实现代码示例:

安装依赖

首先需要安装必要的 Node.js 包,例如 axios 用于 HTTP 请求、cheerio 用于解析 HTML 文档、mongoose 用于操作 MongoDB 数据库等。

npm install axios cheerio mongoose express

示例代码:抓取文章并保存到 MongoDB

const axios = require('axios');
const cheerio = require('cheerio');
const mongoose = require('mongoose');

// 连接到 MongoDB
mongoose.connect('mongodb://localhost:27017/cnbeta', { useNewUrlParser: true, useUnifiedTopology: true });

// 定义文章模型
const ArticleSchema = new mongoose.Schema({
    title: String,
    content: String,
    url: String,
});

const Article = mongoose.model('Article', ArticleSchema);

// 抓取文章内容
async function fetchArticle(url) {
    try {
        const response = await axios.get(url);
        const $ = cheerio.load(response.data);
        
        const title = $('title').text();
        const content = $('.content_detail').html(); // 假设正文在 .content_detail 类中
        
        // 创建新的文章实例并保存到数据库
        const article = new Article({ title, content, url });
        await article.save();

        console.log(`Article saved: ${title}`);
    } catch (error) {
        console.error(`Error fetching article from ${url}:`, error);
    }
}

// 调用函数抓取指定 URL 的文章
fetchArticle('http://www.cnbeta.com/articles/123456.htm');

注意,上述代码中的 CSS 选择器(如 .content_detail)需要根据实际页面结构进行调整。另外,为了抓取评论,可以使用类似的方法从评论页面获取数据。

回到顶部