周末大雪,在家研究了下如何烧制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/