首页 > 其他分享 >RSS 获取信息指南(二)

RSS 获取信息指南(二)

时间:2023-04-02 15:58:10浏览次数:39  
标签:指南 获取信息 const bilibili item 内容 页面 data RSS

实现自定义 feed 生成规则的本质是对网页内容进行爬取。而爬取的方式可以分为两种:

  1. 通过 API 获取内容,只要知道内容是从哪个 API 获取的,就可以使用 fetchaxios 获取内容,并将其转换成 RSS 模板。

  2. 通过 HTML 文档获取内容,不同的页面渲染方式需要不同的爬取策略。具体渲染内容可以参考我的另一篇文章:SSR、CSR、SSG 和混合式渲染

    • 对于通过 CSR 渲染的 HTML 页面,例如使用 React 或 Vue 构建的单页面应用,需要使用中间浏览器爬虫(例如 puppeteer)将页面渲染出来,然后解析页面内容
    • 对于通过 SSR、SSG 渲染的 HTML 页面,可以省略页面渲染步骤,直接解析内容
    • 对于混合渲染,根据需要判断并选择上述方式

    判断哪种渲染方式也很简单,通过浏览器控制台的网络查看 document 的内容即可判断。如果里面只有 HTML 模板(例如通过 <div id="root"></div> 加载内容),而没有实际内容,说明是 CSR 方式,反之亦然。解析内容需要使用第三方库,例如 cheerio,它可以像 jQuery 一样操作 HTML 文档内容,然后将解析后的内容填充到 RSS 模板中

优先推荐使用 API 方式获取内容,其次使用 html 页面解析方式

RSSHub 项目实现RSS链接也是依据上述原理,具体查看项目文档:制作自己的 RSSHub 路由

自定义 RSSHub

如果你想添加新的 RSSHub 规则,只需按照项目文档的规范即可实现。另外,如果你不喜欢每次查看信息都需要跳转到外部链接才能看到全部内容,例如阅读bilibili文章,或者因为其他原因,只需要改变原有的HTML解析方式即可实现。下面通过一个例子来说明:

专栏:渔民职业又怎样

RSS订阅地址:https://rsshub.app/bilibili/readlist/521896

// 源码爬取方式如下,每篇文章只有简要描述,没有全部内容,需要跳转链接

const got = require('@/utils/got');

module.exports = async (ctx) => {
    const listid = ctx.params.listid;
    const listurl = `https://www.bilibili.com/read/readlist/rl${listid}`;

    const response = await got({
        method: 'get',
        url: `https://api.bilibili.com/x/article/list/web/articles?id=${listid}&jsonp=jsonp`,
        headers: {
            // 反爬取设置
            Referer: listurl,
        },
    });
    const data = response.data.data;

    ctx.state.data = {
        title: `bilibili 专栏文集 - ${data.list.name}`,
        link: listurl,
        image: data.list.image_url,
        description: data.list.summary ? data.list.summary : '作者很懒,还木有写简介.....((/- -)/',
        item:
            data.articles &&
            data.articles.map((item) => ({
                title: item.title,
                author: data.author.name,
                // 每篇文章只有简要描述,没有全部内容,需要跳转链接
                description: `${item.summary}…<br><img src="${item.image_urls[0]}">`,
                pubDate: new Date(item.publish_time * 1000).toUTCString(),
                link: `https://www.bilibili.com/read/cv${item.id}/?from=readlist`,
            })),
    };
};

改造源码解析:

module.exports = async (ctx) => {
    // 省略部分代码
    const item = await Promise.all(
        // 爬取每一篇文章的内容
        data.articles.map(async (item) => {
            const art_url = `https://www.bilibili.com/read/cv${item.id}/?from=readlist`;
            // 使用缓存策略或获取页面内容
            const itemData = await ctx.cache.tryGet(
                art_url,
                async () =>
                    (
                        await got({
                            method: 'get',
                            url: art_url,
                            headers: {
                                Referer: listurl,
                            },
                        })
                    ).data
            );
            // cheerio 解析内容
            const content = cheerio.load(itemData);
            const eDescription = `<img src="${item.image_urls[0]}">` + content('#read-article-holder').html();
            const publishDate = parseDate(item.publish_time * 1000);
            const single = {
                title: item.title,
                author: data.author.name,
                link: art_url,
                // 文章全部内容
                description: eDescription,
                pubDate: publishDate,
            };
            return single;
        })
    );
    ctx.state.data = {
        // 省略部分代码
        item,
    };
};

上面通过进一步爬取文章来获取内容,由于这个过程需要更长的响应时间,建议对文章数量进行限制,并将程序部署在本地或响应速度较快的服务器上。当然,这只是一个简单的改进方式,仅展示了爬取操作的基本流程。具体要实现什么功能还需要自己编写代码实现。

参考

标签:指南,获取信息,const,bilibili,item,内容,页面,data,RSS
From: https://www.cnblogs.com/chenmijiang/p/17280612.html

相关文章

  • Github + Sphinx+Read the docs 实战入门指南(二)
    引言接上一篇Github+Sphinx+Readthedocs实战入门指南(一),这一篇主要讲解如何自动将指定文档内容部署到Readthedocs中。对于文档,一般有以下基本要求:只维护一份,其他地方自动同步更新可以根据代码注释,动态更新维护相应的API文档支持检索多版本之间的API接口动态查看......
  • Github + Sphinx+Read the docs 实战入门指南(三)
    引言接着上两篇文章Github+Sphinx+Readthedocs实战入门指南(一)Github+Sphinx+Readthedocs实战入门指南(二)我们已经成功地将Sphinx文档部署到了Readthedocs网站,但是这个文档,我们不想每次都要手动更新内容,想要的是:在更改仓库主分支时,自动将相关内容更新部署......
  • Github + Sphinx+Read the docs 实战入门指南(一)
    引言GithubGithub是一个托管网站,目前主要用来托管代码,当然托管其他的也可。但是网不好的小伙伴可以考虑使用Gitee作为平替。SphinxSphinx是什么?Sphinx是一个自动生成文档的工具,可以用简洁的语法快速生成优雅的文档。哪些场景要用Sphinx?如果想要写书,不想陷入复杂的......
  • RssHub + Vercel :在 Vercel 上免费部署你的RssHub!
    RssHub简介RSSHub是一个开源、简单易用、易于扩展的RSS生成器,可以给任何奇奇怪怪的内容生成RSS订阅源。RSSHub借助于开源社区的力量快速发展中,目前已适配数百家网站的上千项内容。官方文档:介绍|RssHub(需要挂代理配置过程......
  • 知乎使用指南
    知乎食用指南目前知乎近版本有一下恶心人的地方那个加入大量广告,每次刷新都夹杂大量广告为了增加广告,将左右翻页变成恶心的上下滑动翻译,在滑动中间增加广告,并且明显感受到左右滑动比上下滑动要好杂七杂八内容太多,导致内容卡顿从初中的时候就开始看知乎,结果知乎越来越恶心,以......
  • Tapdata Connector 实用指南:如何将 CRM 数据从 Salesforce 实时同步到 MongoDB 等其他
    【前言】作为中国的“Fivetran/Airbyte”,Tapdata是一个以低延迟数据移动为核心优势构建的现代数据平台,内置60+数据连接器,拥有稳定的实时采集和传输能力、秒级响应的数据实时计算能力、稳定易用的数据实时服务能力,以及低代码可视化操作等。典型用例包括数据库到数据库的复制......
  • 现代图片性能优化及体验优化指南
    之前,整个《现代图片性能优化及体验优化指南》分了5篇来发,本文是系列合集,方便大家收藏及连贯阅读。图片资源,在我们的业务中可谓是占据了非常大头的一环,尤其是其对带宽的消耗是十分巨大的。对图片的性能优化及体验优化在今天就显得尤为重要。本文,就将从各个方面阐述,在各种新特......
  • 界面组件Telerik ASP.NET MVC使用指南 - 如何自定义网格过滤(一)
    TelerikUIforASP.NETMVC拥有使用JavaScript和HTML5构建网站和移动应用所需的70+UI部件,来满足开发者的各种需求,提供无语伦比的开发性能和用户体验。它主要是针对专业级的ASP.NET开发,通过该产品的强大功能,开发者可以开发出功能丰富、适应标准广泛的响应式应用程序。对于任何......
  • 谷歌网站收录优化指南:让搜索引擎更快找到您的网站!
    谷歌是全球最大的搜索引擎,让您的网站在谷歌中获得更高的收录和排名显得尤为重要。为了帮助您轻松实现这一目标,本文将为您提供一份谷歌网站收录优化指南,让您的网站更快被搜索引擎找到!一、确保网站内容高质量且易于抓取保持内容的原创性:谷歌对原创内容给予更高的权重,因此务必确保您的......
  • C#:解析XML文件的C#指南
    XML是一种常用的数据交换格式,C#提供了许多内置的类和方法来解析和操作XML文件。在这篇文章中,我们将介绍如何使用C#解析XML文件。读取XML文件要读取XML文件,我们可以使用XmlDocument类。以下是一个示例代码,它读取名为example.xml的XML文件并打印其内容:usingSystem;usingSys......