Calibre 使用教程之抓取 RSS 制成电子书

之前 Kindle 伴侣曾经写过一篇文章——在 Google Developer Console 上用 KindleEar 搭建 RSS 推送服务器,架设成功后可以添加你所喜欢的 RSS 订阅源,KindleEar 就可以自动抓取最新文章,并以期刊的形式定时推送到你的 Kindle 中。那除此之外,有没有其他抓取 RSS 订阅源的方法?当然有!Calibre 自身就带有 RSS 抓取功能模块,KindleEar 便是采用的该模块为基础写成的。虽然 Calibre 带有命令行的操作方式,但对于普通用户来讲不怎么友好,所以本文仅以界面操作方式为例作说明。

一、准备订阅源

RSS 订阅地址五花八门没有一定的规律,所以获取 RSS 地址的方法也不尽相同。一般提供 RSS 订阅的站点都会提供一个 RSS 图标,点开就可以得到该站点的 RSS 订阅地址。如果页面上没有此图标,可以查看一下网页的源代码,找到 <link rel="alternate" type="application/rss+xml" title="<title>" href="<url>" /> 这样的行,其中的 <url> 就是 RSS 地址。另外还有一些浏览器如 Firefox、Opera 会自动获取网站的 RSS 订阅地址,并在地址栏上标示小 RSS 图标,也能方便地获取该站点的 RSS 地址。

二、添加订阅源

准备好 RSS 订阅源后,就可以在 Calibre 中添加这些订阅源了。打开 Calibre,在 Calibre 主界面上方的功能图标中找到“抓取新闻”,点击右侧的向下箭头,在弹出的菜单中点“添加自定义新闻源”。

calibre-rss_1

在弹出的对话框中,点击【New recipe】按钮,切换到“添加自定义新闻来源”对话框。在“订阅清单标题”中输入一个名字,比如“我的订阅”(这个名字是一个分类名,其下将会包含一组 RSS 订阅地址)。

最老文章”可以设置抓取文章的时效性,默认情况下,Calibre 只会抓取最近 7 天的文章,如果想要抓取更多,可以自定更改天数。“每个源的最多文章数”可以设置抓取文章的数量上限。不过需要注意的是,这两项设置都受限于网站 RSS 的输出方式,比如有些网站的 RSS 只输出数量有限的最新几篇文章,所以不管在 Calibre 中怎么设置,都受此限制,不一定能获取到指定数量的文章;

接下来,需要在“将新闻加入订阅”中添加我们准保好的 RSS 地址。在“源名称”中也输入 RSS 订阅的名字,比如“Kindle伴侣”;然后再“源网址”中输入 RSS 地址,如“https://bookfere.com/feed”;最后点击【添加源】按钮,就可以把一条 RSS 订阅添加到“订阅清单中的新闻”中了。在一个订阅清单中可以抓取多个 RSS 源,所以可以重复操作输入多个 RSS 源名称和源网址并多次添加。

calibre-rss_2

添加完成 RSS 订阅地址后。点击右下角的【保存】按钮保存,返回到“添加自定义新闻源”界面。如果需要修改,可以在左侧列表选中一个项目,然后点击【Edit this recipe】按钮修改。如果想要修改,则点击【Remove this recipe】按钮删除。没什么问题的话可以点击【关闭】按钮返回 Calibre 主界面。

三、抓取并推送

设置好订阅源后就可以抓取新闻了。同样,在 Calibre 主界面上方的功能图标中找到“抓取新闻”,点击它,会弹出一个“定期新闻下载”的对话框。在左侧列表中找到“自定义”分类,点击展开,就可以找到你刚刚添加的订阅清单,选中后点界面下方的【立即下载】按钮,Calibre 便会开始抓取 RSS 内容。

calibre-rss_3

抓取成功后,Calibre 会生成一本期刊格式的电子书并自动存放到书库中。如果你设置了邮件推送,Calibre 还会把生成好的电子书自动推送到云端,以便自动同步到你的 Kindle 中。

calibre-rss_4

当然,除了这种手动抓取的方式外,还可以通过“计划下载”定时抓取,比如按每周、每月或每隔指定天数抓取 RSS 内容,不过前提是你得一直开着电脑并保持电脑的联网状态。

另外还需要注意,有些网站的 RSS 仅输出摘要,这样 Calibre 也只能抓取到摘要内容;还有就是如果你订阅的 RSS 被墙了,并且你的网络没有使用代理的话,将无法成功抓取。

有帮助,[ 捐助本站 ] 或分享给小伙伴:

发表评论

标注为 * 的是必填项。您填写的邮箱地址将会被保密。如果是在本站首次留言,审核后才能显示。
若提问,请务必描述清楚该问题的前因后果,提供尽可能多的对分析该问题有帮助的线索。

小伙伴们发表了 30 条评论

    • 因为人民网的页面代码结构改变了,导致内置的这个脚本无法正确抓取内容,你需要参考内置的这个脚本以适应新页面代码结构。下面这个脚是修改后的,测试了一下可以正常抓取(脚本的使用可参考《Calibre 使用教程之抓取网站页面制成电子书》这篇文章)。

      from calibre.web.feeds.news import BasicNewsRecipe
      import os
      import time
      
      
      class AdvancedUserRecipe1277129332(BasicNewsRecipe):
          title = u'人民日报'
          oldest_article = 2
          max_articles_per_feed = 100
          __author__ = 'zzh'
      
          pubisher = 'people.com.cn'
          description = 'People Daily Newspaper'
          language = 'zh'
          category = 'News, China'
          remove_javascript = True
          use_embedded_content = False
          no_stylesheets = True
          encoding = 'GB2312'
          language = 'zh'
          conversion_options = {'linearize_tables': True}
          masthead_url = 'http://www.people.com.cn/img/2010wb/images/logo.gif'
      
          feeds = [
              (u'时政', u'http://www.people.com.cn/rss/politics.xml'),
              (u'国际', u'http://www.people.com.cn/rss/world.xml'),
              (u'经济', u'http://www.people.com.cn/rss/finance.xml'),
              (u'体育', u'http://www.people.com.cn/rss/sports.xml'),
              (u'教育', u'http://www.people.com.cn/rss/edu.xml'),
              (u'文化', u'http://www.people.com.cn/rss/culture.xml'),
              (u'社会', u'http://www.people.com.cn/rss/society.xml'),
              (u'传媒', u'http://www.people.com.cn/rss/media.xml'),
              (u'娱乐', u'http://www.people.com.cn/rss/ent.xml'),
              # (u'汽车', u'http://www.people.com.cn/rss/auto.xml'),
              (u'海峡两岸', u'http://www.people.com.cn/rss/haixia.xml'),
              # (u'IT频道', u'http://www.people.com.cn/rss/it.xml'),
              # (u'环保', u'http://www.people.com.cn/rss/env.xml'),
              # (u'科技', u'http://www.people.com.cn/rss/scitech.xml'),
              # (u'新农村', u'http://www.people.com.cn/rss/nc.xml'),
              # (u'天气频道', u'http://www.people.com.cn/rss/weather.xml'),
              (u'生活提示', u'http://www.people.com.cn/rss/life.xml'),
              (u'卫生', u'http://www.people.com.cn/rss/medicine.xml'),
              # (u'人口', u'http://www.people.com.cn/rss/npmpc.xml'),
              # (u'读书', u'http://www.people.com.cn/rss/booker.xml'),
              # (u'食品', u'http://www.people.com.cn/rss/shipin.xml'),
              # (u'女性新闻', u'http://www.people.com.cn/rss/women.xml'),
              # (u'游戏', u'http://www.people.com.cn/rss/game.xml'),
              # (u'家电频道', u'http://www.people.com.cn/rss/homea.xml'),
              # (u'房产', u'http://www.people.com.cn/rss/house.xml'),
              # (u'健康', u'http://www.people.com.cn/rss/health.xml'),
              # (u'科学发展观', u'http://www.people.com.cn/rss/kxfz.xml'),
              # (u'知识产权', u'http://www.people.com.cn/rss/ip.xml'),
              # (u'高层动态', u'http://www.people.com.cn/rss/64094.xml'),
              # (u'党的各项工作', u'http://www.people.com.cn/rss/64107.xml'),
              # (u'党建聚焦', u'http://www.people.com.cn/rss/64101.xml'),
              # (u'机关党建', u'http://www.people.com.cn/rss/117094.xml'),
              # (u'事业党建', u'http://www.people.com.cn/rss/117095.xml'),
              # (u'国企党建', u'http://www.people.com.cn/rss/117096.xml'),
              # (u'非公党建', u'http://www.people.com.cn/rss/117097.xml'),
              # (u'社区党建', u'http://www.people.com.cn/rss/117098.xml'),
              # (u'高校党建', u'http://www.people.com.cn/rss/117099.xml'),
              # (u'农村党建', u'http://www.people.com.cn/rss/117100.xml'),
              # (u'军队党建', u'http://www.people.com.cn/rss/117101.xml'),
              # (u'时代先锋', u'http://www.people.com.cn/rss/78693.xml'),
              # (u'网友声音', u'http://www.people.com.cn/rss/64103.xml'),
              # (u'反腐倡廉', u'http://www.people.com.cn/rss/64371.xml'),
              # (u'综合报道', u'http://www.people.com.cn/rss/64387.xml'),
              # (u'中国人大新闻', u'http://www.people.com.cn/rss/14576.xml'),
              # (u'中国政协新闻', u'http://www.people.com.cn/rss/34948.xml'),
          ]
          keep_only_tags = [
              dict(name='div', attrs={'class': 'clearfix w1000_320 text_title'}),
              dict(name='div', attrs={'class': 'box_con'}),
          ]
          remove_tags = [
              dict(name='div', attrs={'class': 'fr'}),
          ]
    • 可以,不过需要你修改内置脚本代码实现,添加或修改其中的 reverse_article_order 属性,将其设置为 true 即可。

      • 为什么calibre邮件推送的mobi(无论是新的旧的或者both我都试过了),都不能自定义设置字体,是什么原因?有什么解决方法吗?

        • Calibre 抓取的 MOBI 格式是旧的 MOBI7 标准,而原生系统的自定义字体仅支持新的 KF8 标准的 MOBI 格(或 AZW3)格式。

    • 指定封面需要通过自定义脚本实现。你可以参考内置的脚本,自己创建一个自定义脚本,在其中添加 Calibre 提供的get_cover_url() 方法,为抓取的电子书指定封面。

  1. 请问Calibre抓取期刊,设置了邮件推送并且同时用USB连着Kindle,是会同一本期刊重复推送两次么?最近开着Calibre把Kindle连到电脑上时无意中发现期刊前面都写着(2 books),查看文件位置也不一样,在Kindle上的显示是总目录底下跟期刊目录下各有一本

    • 判断是否重复推送两次,可以登录 http://z.cn/myk 检查一下”我的内容“页面“个人文档”中是否有重复推送的内容。

  2. 学到了~我是订阅的pocket,官方提供rss导出,可以把kindle当作稍后阅读工具

  3. 想请问一下为什么用calibre抓取新闻之后在kindle上只显示标题和日期,内容都是空白呢?

  4. 【抓取成功后,Calibre 会生成一本期刊格式的电子书并自动存放到书库中。如果你设置了邮件推送,Calibre 还会把生成好的电子书自动推送到云端,以便自动同步到你的 Kindle 中。】
    这里生成的电子书是epub格式的,推送到云端会收到
    【尊敬的客户,

    您从2016年3月12日6:14 发出的如下文档无法发送到您指定的Kindle上:
    * Wo De Ding Yue [Zhou Liu , 12 3Yue 2016] – calibre.epub

    Kindle个人文档服务目前只能转换并发送以下类型的文档:
    Microsoft Word (.doc, .docx)
    RTF文件(.rtf)
    HTML(.htm, .html)
    TXT文件(.txt)
    Zip, x-zip压缩文件
    Mobi格式电子书

    JPEG (.jpg), GIF (.gif), Bitmap (.bmp) 和 PNG (.png) 格式的图片。
    Adobe PDF (.pdf)文档可维持原文件格式,发送至您的Kindle。

    Adobe PDF (.pdf)文档可转换为Kindle格式发送,目前处于试用阶段。

    如上述格式的文档未成功发送,请确认文档是否受到密码保护或被加密。特别说明,目前最新的Kindle支持读取受密码保护的PDF文档。

    要怎么自动生成mobi 格式文件