抓取网页生成电子书(乌云知识库博客汇总——下载格式的电子书)
优采云 发布时间: 2021-09-13 20:02抓取网页生成电子书(乌云知识库博客汇总——下载格式的电子书)
最近在学习网络安全相关知识。看到五云知识库有很多优质的文章。由于网上看文章太麻烦,研究了Calibre写的菜谱,自动下载生成电子书的方法。
用这种方法把截至2015年2月11日五云知识库上的400多篇文章文章整理成epub格式的电子书花了一些时间。不想折腾的可以直接点击——五云知识库总结博客-下载。
工具介绍和准备Calibre
Calibre 是“一站式”电子书解决方案,完全可以满足您的电子书需求。 Calibre 是免费的,源代码是开放的,具有跨平台设计,可以在 Linux、OS X 和 Windows 操作系统上运行。
是一个完整的电子图书馆,包括图书馆管理、格式转换、新闻、资料转电子书,以及电子书阅读器同步和集成到电子书阅读器的功能。
这里我们使用的是 Calibre 命令行工具中的 ebook-convert 功能,请到这里下载安装。
Mac 下的工具收录在安装包中。使用该工具前,请执行export PATH="$PATH:/Applications/calibre.app/Contents/MacOS/"将cli工具路径添加到系统路径中,或者在.bashrc中添加这一句。
其他系统尚未测试,请留言补充说明。
铬
使用开发者工具分析页面结构并在配方中指定下载的内容。
*敏*感*词*分析页面结构
先到五云知识库页面查看。
从页面底部的信息可以看到知识库是wordpress生成的,共47页。
点击查看每个目录页的格式。
选择标题,右键单击查看元素。
标题结构如下:
可以找到规则。标题的共同特征是收录在,链接地址在href中,标题内容就是收录的内容。
任意点打开一个特定的文章,用同样的方法发现每个文章的body都在下面的标签中。
写菜谱
calibre 的配方本质上是一个 python 文件。通过继承一个类,指定一些电子书元数据和从网页中提取内容的方法,达到自动下载并集成到电子书的目的。内容筛选主要是通过Beautiful Soup来实现的。本次任务使用的配方如下,其他参考链接包括:
#!/usr/bin/python
# encoding: utf-8
from calibre.web.feeds.recipes import BasicNewsRecipe
class wooyun(BasicNewsRecipe):
title = u'乌云知识库'
__author__ = u'无关风月'
description = u'''乌云知识库,最专业的安全知识分享平台。本电子书由无关风月整理网站 内容而来。'''
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。
参考链接