用calibre抓取乌云知识库并生成电子书

原文链接:http://blog.csdn.net/yelyyely/article/details/43741739

最近在研究网络安全相关知识,看到乌云知识库有很多高质量文章,由于在网上一篇篇翻看过去太麻烦,就研究了一下用Calibre自己编写recipe自动下载并生成电子书的方法。

花了点时间用此方法将乌云知识库上截止2015年2月11日为止的400多篇文章整理成了一本epub格式的电子书,不愿折腾的可以直接点击——乌云知识库博客汇总——下载。

工具简介和准备

Calibre

Calibre是一个“一站式”的电子书解决方案,它可以全面满足你的电子书需求。Calibre是免费的,源代码开放,拥有跨平台的设计,可在Linux, OS X和Windows操作系统中运行。
  它是一个完整的电子图书馆,包括图书馆管理,格式转换,新闻,将材料转换为电子书,以及电子书阅读器同步功能、整合进电子图书阅读器。

此处我们用到的是Calibre的command line tools中的ebook-convert功能,请前往此处下载安装。

Mac下该工具已包含在安装包中,用户在使用前请执行export PATH="$PATH:/Applications/calibre.app/Contents/MacOS/"将cli tools路径加入系统路径,或将此句加入.bashrc

其他系统暂未测试,欢迎留言补充说明。

Chrome

使用开发者工具来分析页面结构,用来在recipe中指定下载的内容。

制作过程

分析页面结构

先到乌云知识库页面查看。

乌云知识库界面
乌云知识库界面

从页面底部的信息可以看到该知识库由wordpress生成,总共47页。
点击发现每一个目录页的格式形如http://drops.wooyun.org/page/2

text
text

任选一个标题,点击右键——审查元素。

标题
标题

标题结构如下:

<h2 class="entry-title">
    <a href="http://drops.wooyun.org/binary/4788" rel="bookmark" title="Permanent Link to “暗云”BootKit木马详细技术分析">“暗云”BootKit木马详细技术分析</a>
</h2>

可以找到规律,标题的共同特征是包含在<h2 class="entry-title">中,链接地址在其中的href中,标题内容为<a>中包含的内容。

任意点开一篇具体的文章,用同样的方法可以发现,每篇文章的正文部分是在如下的标签中。

<div id="post-4788" class="post">

编写recipe

calibre的recipe本质上是一个python文件,通过继承一个类,在其中指定一些电子书元数据和从网页提取内容的方法来达到自动下载和整合成电子书的目的。内容筛选主要通过Beautiful Soup实现。该任务中使用的recipe如下,其它参考链接包括:

#!/usr/bin/python
# encoding: utf-8
from calibre.web.feeds.recipes import BasicNewsRecipe

class wooyun(BasicNewsRecipe):
    title = u'乌云知识库'
    __author__ = u'无关风月'
    description = u'''乌云知识库,最专业的安全知识分享平台。本电子书由无关风月整理网站 <http://drops.wooyun.org/> 内容而来。'''
    timefmt = '[%Y-%m-%d]'
    no_stylesheets = True
    INDEX = 'http://drops.wooyun.org/'
    # auto_cleanup = True                   # 如果没有手动分析文章结构,可以考虑开启该选项自动清理正文内容
    language = 'zh-CN'
    keep_only_tags = [{'class': ['post']}]  # 仅保留文章的post中的内容,其中为自己分析得到的正文范围
    max_articles_per_feed = 10000           # 默认最多文章数是100,可改为更大的数字以免下载不全

    def parse_index(self):
        # soup = self.index_to_soup(self.INDEX)
        # pages_info = soup.findALL(**{'class': 'pages'}).text.split()
        # print 'pages_info:', pages_info
        start_page = 1      # int(pages_info[1])
        end_page = 47       # int(pages_info[3])
        articles = [] 
        for p in range(start_page, end_page+1):     # 处理每一个目录页
            soup_page = self.index_to_soup(self.INDEX + '/page/' + str(p))
            soup_titles = soup_page.findAll(**{'class': 'entry-title'})     # 从目录页中提取正文标题和链接
            for soup_title in soup_titles:
                href = soup_title.a
                articles.append({'title': href['title'][18:], 'url': href['href']}) 
            print 'page %d done' % p
        articles.reverse()                 # 文章倒序,让其按照时间从前到后排列
        res = [(u'乌云知识库', articles)]    # 返回tuple,分别是电子书名字和文章列表
        # self.abort_recipe_processing('test')  # 用来中断电子书生成,调试用
        return res

生成电子书

将上述文件保存成wooyun.recipe,在终端中执行命令:

ebook-convert wooyun.recipe wooyun.epub

然后你就可以去喝杯水,等待calibre自动将博客处理成电子书了。此处的epub也可以改成其它格式,如mobi

有待改进

  1. 使用calibre内置的soup无法解析得到text节点,故此代码中start_page和end_page为硬编码,需要根据实际情况进行更改;
  2. 同理得到文章标题用的是href['title'][18:], 比较粗糙,有待改善;
  3. parse_index解析目录页总共40多页是单线程同步进行的,速度较慢,可以考虑改成多线程加快速度。

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 本想 避开喧嚣,逃离纷扰 然,在不知名的深山迷路 夜,漆黑 雨,飘零 灯光,照不透迷途 交叉路口 颠簸缓行 却,山...
    zhou姑娘阅读 245评论 0 2
  • 今天抽油抽到了罗文莎叶精油。 自从学会了用简书写作,重新调整了一下,每天都会给自己留一些遐想的时间来书写自己与心灵...
    上官亦如阅读 434评论 0 3
  • 这一年的降水量比较多,我市从五月份就有几场大雨水,很多地方进水,到处去走不了。 六月份的降水量还是很多,市区到处都...
    文学李明海阅读 195评论 0 4