自己烧制RSS

2018-01-28  本文已影响0人  yanndy

周末大雪,在家研究了下如何烧制RSS。首先RSS不是一道菜,如果不了解RSS的可以度娘一下。这里简单解释一下,个人理解RSS主要是简化信息,不需要直接访问相关的网站就可以收集到需要的信息。

一个例子,投资股票的人经常关注雪球上所买股票公司的信息。一种方式访问雪球,然后通过搜索相应的公司来获取信息;另外一种是能通过RSS阅读工具直接访问雪球的信息,不需要直接登录雪球网站。

下面介绍的就是一种使用foxmail RSS来通过订阅RSS 直接访问雪球文章的方法。

RSS的原理很简单,就是将网站的信息使用xml格式重新格式化一份,剔除其他无关的,只保留简单的信息,避免广告等信息的干扰。并且将自己关心的信息集中在一个界面中访问,每天看完工作邮件后,顺便看下自己订阅的关注的信息,非常方便。

RSS从1995年诞生到现在命运波折,很多RSS阅读器都相继关闭,究其原因RSS对于网站内容提供商没有好处(用户可以不用经常直接访问网站了,特别是广告没人看了,少了收入),对RSS阅读器开发者也没多少盈利点,只有对用户来说有用处。所以现在很多站点都不提供RSS服务。那么我们要想利用RSS订阅信息,只能靠自己想办法,饭店越来越少,只能自己烧菜吃了

现在用的比较多的有feed43,能够通过简单定制生成自己rss信息源。烧制过程比较简单,试用后感觉灵活性不足,于是自己研究了一下,简单写了一个工具,理解了原理后续自己可以随意扩展,方便很多。定制化强的东西,自己的用的才趁手

基本原理是,通过爬虫程序爬到相应的信息,然后自己组装RSS信息源。借助python强大的开发生态,整个代码不足百行

爬虫使用的是scrapy,组装rss信息源使用的是PyRSS2Gen。比较简单,直接上代码:

# _*_ coding:utf-8 _*_
import sys
import scrapy
from scrapy.http import Request
import json
import PyRSS2Gen,datetime,re

class GetXueQiuNewsSpider(scrapy.Spider):
    name = "getXueQiuNews"
    allowed_domains = ["[xueqiu.com](http://xueqiu.com/)"]
    def __init__(self, corpName=None, rssFileName=None, *args, **kwargs):
        super(GetXueQiuNewsSpider, self).__init__(*args, **kwargs)
        self.corpName = corpName
        self.rssFileName = rssFileName
        self.start_urls = [
        "[https://xueqiu.com/statuses/search.json/?sort=relevance&source=all&q=](https://xueqiu.com/statuses/search.json/?sort=relevance&source=all&q=)"+self.corpName.decode('gbk')+"&count=10&page=1"
    ]
    
    def parse(self, response):  
        contents = json.loads(response.body_as_unicode())  
        title_pre =contents['list'][0]['title']
        a1 = [re.compile(r](http://re.compile(r/)'\<.*?\>')
        title = a1.sub('',title_pre)
        items = []
        for content in contents['list']:
            title_pre = content['title']
            a1 = [re.compile(r](http://re.compile(r/)'<.*?\>')
            title = a1.sub('',title_pre)
            target = content['target']
            link = "[https://xueqiu.com](https://xueqiu.com/)"+target
            description = content['text']
            pubDate = content['timeBefore']
            item = PyRSS2Gen.RSSItem(title,link,description,pubDate)
            items.append(item)
        rss = PyRSS2Gen.RSS2(  
            title =  u"雪球-" + self.corpName.decode('gbk'),  
            link = self.start_urls[0],
            description = u"雪球和"+self.corpName.decode('gbk')+u"相关的内容",  
            lastBuildDate = datetime.datetime.now(),
            items = items)
        if self.rssFileName is None:
            self.rssFileName = "default.xml"
        rssFileName = "[d://mine//infospy//rss//](file:///d://mine//infospy//rss//)"+self.rssFileName
        rss.write_xml(open(rssFileName, "w"))

上面的代码根据实际情况,修改rssFileName存放的路径。
1、使用 scrapy crawl getXueQiuNews -a corpName="工商银行" -a rssFileName="xueqiu-icbc.xml" ,可以生成一个雪球工商银行的rss源,同样可以换个关键词制定其他rss信息源。
2、到生成的xml rss文件的目录中执行 python -m SimpleHTTPServer 8000,在本地起一个http服务,便于rss阅读器订阅和访问
3、以foxmail的rss阅读工具为例,订阅这个rss源。



4、可以将 scrapy crawl getXueQiuNews -a corpName="工商银行" -a rssFileName="xueqiu-icbc.xml" 做成一个定时任务,如1小时执行一次,那么这个信息源就会每小时更新一次,在rss阅读器中就能定时的更新了。
5、如果自己有公网服务器,可以部署到公网上就可以随时随地访问了。

这个方式不依赖任何的外部服务,全部自助,并且可以比较方便的扩展,可以将自己关心的信息都烧制成rss,借助爬虫自动的获取信息,让自己关心的信息尽在掌握。

最后想说的, Life is short, you need Python ,一点没错!使用python看似复杂的问题分分钟钟搞定!

参考资料:

1、scrapy知识:https://scrapy.org/

上一篇下一篇

猜你喜欢

热点阅读