用calibre抓取凤凰网的书评

来源:互联网 发布:易语言微信登录源码 编辑:程序博客网 时间:2024/05/14 03:23

       有书评的网站中凤凰网的书评还是不错的,貌视比豆瓣网的要认真一些。想用calibre把它抓成一本电子书,编了一个recipe脚本。

       网址为从http://book.ifeng.com/psl/dzsp/doclist.shtml,开始到http://book.ifeng.com/psl/dzsp/doclist_xx.shtml,xx从37到0。共39页。通过猎豹浏览器,360浏览器或者chrome浏览器的开发者工具,可以分析页面的结构、CSS等情况,对抓取内容非常有用。经过分析,每页约有40篇书评,每篇书评的标题与链接在页面中的<div class='left'>中的<ul class="list">中的每个<a>里。通过index_to_soup把每页生成beautifulsoup对象,然后用find找到ul,再用findAll找到<a>的列表。形成feeds返回。


       在书评页面中,滤除掉不需要的内容,这里使用了keep_only_tags参数,书评的标题在<div id='artical_topic'>中,书评内容在<div id='artical_real'>,除了这两个部分外,书评页的其它内容都不需要抓取。




用一个for 循环分别遍历_38-0.shtml的每个页面,再用一个for循环收集每页的书评标题与链接。程序如下:

# coding=gbk
#import os
from calibre.web.feeds.recipes import BasicNewsRecipe


class Suiyuanshidan(BasicNewsRecipe):
title = u"凤凰书评"
description = u"本书是凤凰网的书评汇集"
recursions = 1
max_articles_per_feed = 2500
oldest_article = 3280
remove_javascript = True

url_prefix = "http://book.ifeng.com/psl/dzsp/doclist"
no_stylesheets = False
keep_only_tags =[dict(name='div', attrs={'id':'artical_topic'}),
dict(name='div', attrs={'id':'artical_real'}),
]   #要保留的标签



def get_title(self,link):
return link.contents[0].strip()

def parse_index(self):



articles = []
for i in range(38,-1,-1):
if i == 38:
  suffix = ".shtml"
else:
  suffix = '_' + str(i) + '.shtml'
u = self.url_prefix + suffix
print u
soup = self.index_to_soup(u)
for link in soup.find('ul',attrs = {'class': "list"}).findAll('a'):
title = self.get_title(link)
title = title.encode("utf-8") #处理中文,转换代码
url = link['href']
a = {'title':title,'url':url}
articles.append(a)
#print articles
ans = [(u'凤凰书评',articles)]
return ans


一共抓取了2000多本书,所以修改了max_articles_per_feed = 2500(默认为100篇)及oldest_article = 3280(最早的书评是2008年的了,有近10年,大约3000多天,默认才7天,当然要设置),因为有的书评页面不止一页,为把这些页都能抓取下来,设置了递归参数recursions = 1。python的效率确实不要,抓取这么多书要有耐性,我等了近两个小时,生成的epub有30多M。不过效果还是不错的。从生成的书看,设置的参数均起了效,尤其是多页的书评,每页都有抓取下来了。书评页有图书的封面(有的书评页醒来就没有封面除外),评论,作者,星级等。读起来还是感觉比较爽地。


1 0
原创粉丝点击