前面“
calibre抓取cochrance handbook的recipe”一文,用多卷的方式,实现了Cochrane Handbook for Systematic Reviews of Interventions电子书的抓取。其实,如果使用recursions参数,可以很方便地进行抓取,可以让工作更简化。
同样使用如下recipe:
from calibre.web.feeds.recipes import BasicNewsRecipe
class Cochrane(BasicNewsRecipe):
title = 'Cochrane'
description = 'Cochrane Handbook for Systematic Reviews of Interventions'
recursions = 0
url_prefix = 'http://handbook.cochrane.org/'
no_stylesheets = True
def get_title(self, link):
return link.contents[0].strip()
def parse_index(self):
front_soup = self.index_to_soup('http://handbook.cochrane.org/front_page.htm')
articles = []
link_coc = front_soup.findAll('p',{'style': "text-align: center;"},'a')
for front_ln in link_coc:
f_ln = front_ln.find('a')
if not f_ln:
continue
front_til = self.get_title(f_ln)
ln = self.url_prefix + f_ln['href']
a = { 'title': front_til, 'url': ln }
articles.append(a)
ans=[('Cochrane Handbook for Systematic Reviews of Interventions',articles)]
return ans
当recursions = 0时,抓取后生成的epub文件,结构如下图:
feed_0文件夹为
其中index.html打开为
一个标题分别对应feed_0-feed_4五个文件夹,每个文件夹内为本章的页面,如果打开,则发现点击不了,或者是外部链接。显然,每章的内容没有递归下载下来。
打开article_0,文件夹内有:
现在,同样是这个recipe,只把recursions = 1时,抓取后生成的epub文件,结构如下图:
打开feed_0,文件夹内有:
打开article_0,文件夹内有:
注意,这里多了子文件夹links
打开links文件夹,内有
正是每一部分中about章节的内容。也即递归下载了每一部分的章节内容。每一个article文件夹下都多了一个link子文件夹,都是递归下载的章节内容。
可见,只要我们恰当地设置好递归参数,就可以方便地下载我们所需要的层级的内容,而不用费很大的力气去编写程序了。当然,目录结构等细节上有所不同。
学习recipe的API接口中的参数设置,因为没有阅读源代码(即使读了BasicNewsRecipe类的源码,因为调用的许多类并不清楚,也很难完全弄明白),这种尝试设置,是一种有益地学习方式。