最近在研究網絡安全相關知識,看到烏雲知識庫有很多高品質文章,由于在網上一篇篇翻看過去太麻煩,就研究了一下用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
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 = # 預設最多文章數是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 = # int(pages_info[1])
end_page = # int(pages_info[3])
articles = []
for p in range(start_page, end_page+): # 處理每一個目錄頁
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'][:], 'url': href['href']})
print 'page %d done' % p
articles.reverse() # 文章倒序,讓其按照時間從前到後排列
res = [(u'烏雲知識庫', articles)] # 傳回tuple,分别是電子書名字和文章清單
# self.abort_recipe_processing('test') # 用來中斷電子書生成,調試用
return res
生成電子書
将上述檔案儲存成
wooyun.recipe
,在終端中執行指令:
然後你就可以去喝杯水,等待calibre自動将部落格處理成電子書了。此處的
epub
也可以改成其它格式,如
mobi
。
參考連結
- 抓取網頁内容生成Kindle電子書
- 官方提供的recipe檔案,可以用來參考recipe寫法
- Beautiful Soup中文文檔
- calibre API
- 烏雲知識庫部落格彙總(epub格式)
- Chrome 開發者工具教程