最近在研究網絡安全相關知識,看到烏雲知識庫有很多高質量文章,由於在網上一篇篇翻看過去太麻煩,就研究了一下用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
。
任選一個標題,點擊右鍵——審查元素。
標題結構如下:
<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如下,其它參考鏈接包括:
- 抓取網頁內容生成Kindle電子書
- 官方提供的recipe文件,可以用來參考recipe寫法
- Beautiful Soup中文文檔
- calibre API
#!/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
。