使用calibre抓取中国青年报

2016-03-07:修复抓取2016-03-05新闻时遇到特殊链接错误的问题(果然是处理姿势不对!)

虽然Kindle有很多电子书,然而网上还有许多优秀资源并没有类似mobi的电子书版本。calibre是个强大的电子书管理软件,不仅可以归档电子书,还可以定时抓取网络上的内容(例如RSS),如果懂Python的话还可以自己动手写recipe使用高级方法来抓取网上更多内容例如本子。我根据这篇文章的方法整出来了个用于抓取中青报的recipe:

#!/usr/bin/env python2
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
import datetime

now=datetime.datetime.now()
day_before=7
one_week=datetime.timedelta(days=day_before)
one_day=datetime.timedelta(days=1)
year=now.year
month=now.month
day=now.day

class AdvancedUserRecipe1456020878(BasicNewsRecipe):
    title          = '中国青年报'
    center_navbar = False
    no_stylesheets = True
    keep_only_tags=[{'class':'text_c'}]
    remove_tags=[{'name':'input'}]
    __author__='CancerGary'

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

        scanning_date=now-one_week
        ans=[]
        
        for count in range(0,day_before):
            scanning_date=scanning_date+one_day
            year=scanning_date.year
            month=scanning_date.month
            day=scanning_date.day
            url_prefix = 'http://zqb.cyol.com/html/%04d-%02d/%02d/'%(year,month,day)
            first=self.index_to_soup(url_prefix+'nbs.D110000zgqnb_01.htm')
            pageLink=first.findAll('a',{'id':'pageLink'})
            
            for page in pageLink: #修复:特殊链接的处理
                soup = self.index_to_soup(url_prefix+page["href"])
                titleList=soup.find('div',{'id':'titleList'})
                articles=[]
                
                for each in titleList.findAll('a'):
                    til=self.get_title(each)
                    url=url_prefix+each['href']
                    a={'title':til,'url':url}
                    articles.append(a)
                
                ans.append(('%02d-%02d '%(month,day)+self.get_title(page),articles))
        
        return ans

这个recipe可以抓取7天内的中国青年报,在Kindle上以“报刊”的样式进行显示:

screenshot_2016_03_01T18_56_09+0800

screenshot_2016_03_01T18_57_43+0800

前面那篇文章里面有一个问题,BasicNewsRecipe的keep_only_tags是针对于Content Page Url里的HTML代码,不影响index_to_soup返回的bs3对象(目测其他类似的参数也不影响)。

具体的API文档可以查看这里,不得不佩服作者……

光明日报中青报人民日报用的是同一个报刊程序,所以只要将代码中相关的链接修改一下就可以通用了。如果希望修改抓取范围可以修改day_before的值。

题外话:感觉中青报文章还是不错的,每周三的冰点周刊可以细读,光明日报看的比较少(虽然是下载了),人民日报据说太官方腔槽点太多大家懂得就没看过……作为中学生还是要多关注时事的,功利点说其实是高考语文的大方向使然……

补充光明日报版本的recipe:

#!/usr/bin/env python2
# vim:fileencoding=utf-8
from __future__ import unicode_literals, division, absolute_import, print_function
from calibre.web.feeds.news import BasicNewsRecipe
import datetime

now=datetime.datetime.now()
day_before=7
one_week=datetime.timedelta(days=day_before)
one_day=datetime.timedelta(days=1)
year=now.year
month=now.month
day=now.day

now=now-one_day
class AdvancedUserRecipe1456020878(BasicNewsRecipe):
    title          = '光明日报'
    center_navbar = False
    no_stylesheets = True
    keep_only_tags=[{'class':'text_c'}]
    remove_tags=[{'name':'input'}]
    authors='CancerGary'
    __author__='CancerGary'

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

        scanning_date=now-one_week
        ans=[]
        
        for count in range(0,day_before):
            scanning_date=scanning_date+one_day
            year=scanning_date.year
            month=scanning_date.month
            day=scanning_date.day
            url_prefix = 'http://epaper.gmw.cn/gmrb/html/%04d-%02d/%02d/'%(year,month,day)
            print(url_prefix+'nbs.D110000gmrb_01.htm')
            first=self.index_to_soup(url_prefix+'nbs.D110000gmrb_01.htm')
            pageLink=first.findAll('a',{'id':'pageLink'})
            
            for page in pageLink: #修复:特殊链接
                soup = self.index_to_soup(url_prefix+page["href"])
                print(url_prefix+page["href"])
                titleList=soup.find('div',{'id':'titleList'})
                if not titleList:continue
                articles=[]
                
                for each in titleList.findAll('a'):
                    til=self.get_title(each)
                    url=url_prefix+each['href']
                    a={'title':til,'url':url}
                    articles.append(a)
                
                ans.append(('%02d-%02d '%(month,day)+self.get_title(page),articles))
        
        return ans
        

 

《使用calibre抓取中国青年报》上有2条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注