RSS介绍和简单实现

现在用RSS的人已经很少了,估计网民中不超过5%,这些人中大部分从事IT行业,小部分则是上个时代遗留下来的网民。

RSS 是一种xml规范, 最新版本是2.01。一个网站提供RSS, 本质上就是把网站希望推送给读者的内容按照 RSS 规范写入一个xml, 并且在一个页面(比如/blog/rss)提供这个 xml 的访问。然后 feedburner 或者别的 rss 工具会读取这个页面,检查更新,提供推送。

RSS标准格式如下,下面只列出需要关注的标签

<title>Lift Off News</title>
<link>http://liftoff.msfc.nasa.gov/</link>
<description>Liftoff to Space Exploration.</description>
<item>
    <title>Star City</title>
    <link>http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp</link>
    <description>
        How do Americans get ready to work with Russians aboard the
        International Space Station? They take a crash course in culture, language
        and protocol at Russia's Star City.
    </description>
</item>
<item>
    another item
</item>

rss 有总的 title, link, description, 有一堆 item, 每一个 item 自己也有 title, link, description 属性,description 就是正文, 例如一篇博客文章的内容。有这些内容就够了。

那么如何给自己的网站加上 rss 呢?很简单,只要照着这个格式生成一个页面就好了。这里还是以 Django 和我自己的博客为例。我的博客的 rss 地址是 https://laike9m.com/blog/rss/

虽说是自己实现,但是 Django 已经把大部分事情都做好了。
首先我们要用 Django 提供的 Feed 类派生出一个子类

from .models import BlogPost
from django.contrib.syndication.views import Feed

exclude_posts = ("about", "projects", "talks")

class BlogPostFeed(Feed):
     title = "laike9m's blog"
     link = "/blog/rss"
     description = "Update on laike9m blog's articles."

     def items(self):
          return BlogPost.objects.exclude(title__in=exclude_posts).filter(category="programming")[:5]

     def item_title(self, item):
          return item.title

     def item_link(self, item):
          return item.get_absolute_url()

     def item_description(self, item):
          html = item.display_html()
          import re
          html = re.sub(r"/media/", r"https://laike9m.com/media/", html)
          return html

     def item_pubdate(self, item):
          return item.pub_date

这个子类可能有两种写法,这里只看这一种。需要提供的方法有 items, item_title, item_link, item_descriptionitem_pubdate 并非必须。可以看到这几个方法对应了之前列出的 rss 元素,所以这个类干的事情,就是告诉 Django 要如何填充 rss 中必须的元素,比如说构造 <title></title> 的时候,就通过 get_title 这个方法,获取到 item.title,而每个 item 是在 items 中定义的,可以看到,item 实际上就是 BlogPost 这个 Model 的实例,也就是一篇文章。
这里我作了一些筛选,没有把所有文章都放到 rss 里面,这句话

BlogPost.objects.exclude(title__in=exclude_posts).filter(category="programming")[:5]

做的事情是把标题属于 exclude_posts 的文章排除,这些文章是我不想放进 rss 的,有 "about", "projects", "talks" 这三篇(因为它们并不是真正的文章,只是以和文章同样的形式保存用来构成博客的一些页面的),然后又通过 filter 选出那些属于编程类的文章。其实派生类的 items 方法不一定要返回 Model Objects,但是这么做的确有一些好处,这里的筛选功能就是因为使用了 Model Objects 而变得非常简单。

然后只要在 urls.py 里面加上下面这句话就行了

url('^rss/$', BlogPostFeed())

通常 url() 的第二个参数是 views 里的某个函数,但是这里我们只要把刚才写的 Feed 类的派生的填进来就好了。

这就是为博客提供 rss 所要做的全部工作。Django 大大简化了步骤,不过使用其它框架,亦或是自己从 html 级开始写出 rss 页面,原理是一样的。简单来讲就是:写一个页面,填上 rss 必须的元素,仅此而已。

如果使用 feedburner 来提供 rss 服务,去注册一个账号,然后把自己的 rss 页面地址填进去,就OK了

feed

新坑开启,动画人物人名翻译助手计划

很早之前订了 StackExchage 的 Anime&Manga 周报,但是很多时候发现罗马音的人名根本就不认识,然后就只能去 google,一般会出现英文的 Wiki,点进去之后看见假名,但是又不认识,再去搜这个假名,运气好的话就有中文的网页了,这时候才知道人物的中文名,若是运气不好只搜出日文网页的话就得花更多时间,一般就不会再找下去了。经历了很多次这个过程之后终于觉得有些厌烦了。

只考虑动画的话,其实几十年内的主要角色也没有多少,一部中短篇作品里会被提到的名字估计平均也就十人左右。既然数据并不多,为什么不能都收集起来然后实现翻译的功能呢?做成类似输入法那样的界面,但是输入之后能出现对应的人名在其它语言中的写法,提供中文/假名/罗马音之间的互译,大概会很有用(并不

这篇文章希望能记录从开始到完成的过程,如果最终能完成的话...

第一步是收集数据。我发现 http://anidb.net/ 的资料比较全,而且又有 API,所以决定用它作为罗马音->日文的数据来源。但是看了下 API 的介绍发现限制很多,要 key 也就算了,最坑的是要把你做的客户端的链接给他,问题是东西都没有做出来哪有链接给它?再加上对请求次数啥的限制也比较严格,就不打算用 API 了,决定还是直接抓页面。

但是万万没想到 anidb 对爬虫的限制力度非常大,我模仿浏览器提供了所有 header 都被拒绝了,然后它还会把你的 ip 封禁掉。今天试了下用代理,又提供了 cookie,结果还是被封了,搞得我一点办法都没有。只能说它们的技术太厉害了。

如果还想从 anidb 抓数据,似乎只剩用 Selenium 及其类似物这条路了。因为以前没用过,所以得先学习一下。

14.10.14
今天试了试 selenium,访问是没有问题,毕竟是“真”浏览器访问。但是局限在于不能开多个 tab,只能开多个窗口。把每个 webdriver 放到一个单独的线程里似乎就可以让它们互不影响了。总之 selenium 这条路是可行的。

14.11.5
今天把页面上的两种名字的提取做了,发现 xpath 比 css-selector 好用不少。不过 selenium 的 xpath-selector 好像不支持把 text() 写进 query,只能之后通过 webelement 的 text 属性来获取某个元素的 text.

草莓狂热和百合灵同学

三神作自然是要补的,目前进度2/3,百合灵是大概半年前就下到硬盘里了但是一直没时间玩后来就忘了,最近才想起来。

这篇日志一定要短。。绝对不能再写长了。。

先说草莓狂热。这部作品的名字也被翻译成惊爆草莓,但是我觉得 strawberry panic 翻译成草莓狂热比较好,“草莓狂热”可能是我最喜欢的动画了。

整部动画最喜欢的人物非千华留莫属了。这个并不显山露水的露莉姆学生会长甚至都没有专门的描写,当主角的一次似乎只有找伞那一集,大多时候都担任旁观者+旁白的角色。但是随着剧情发展观众们逐渐发现千华留才是学园大 BOSS,与世无争是因为她只喜欢享受生活,可这并不意味着她对周围权力/情感的纷纷扰扰都不关注,相反,到后来千华留安慰众苦逼已经成为一种常态——弹幕里观众们忍不住高呼:千大真·后宫王!平时带领一帮小弟搞社团活动,该上阵演戏的时候惊艳全场,在学校溜达的时候又能“碰巧”地遇到一些伤心人顺便玩玩膝枕什么的,简直人生赢家。米娅多这边,除了六条深雪我比较欣赏之外,其它人基本无感。当然很多女生把席子马当做偶像也是可以理解的,但是最后一集“抢婚”简直让我一口老血喷出来,这货绝对 COS 《毕业生》没跑了吧?其实席子马还是很有个人魅力的,作为整部剧实际上的主角,她的心理描写,比如对 nagisa 矛盾的情感,被表现得十分充分。斯毕卡的人则基本都是一副苦大深仇的样子,夜夜酱整天被光莉补刀(该推倒时就推倒啊><),会长整部剧都在劝天音,天音摔失忆了(演韩剧?),剑成要演了20多集的黑脸最后发现竟然是个傲娇。不过斯毕卡的人到最后结局意外地都不错,连夜夜酱都有学妹了。

草莓狂热算是把男性视角和女性视角把握地比较好的百合作品了,除了某些地方实在太狗血,总体素质是十分优秀的。这个剧的最大特点就是苦逼众多,把名字换成《苦逼室友》其实更为贴近主题。凉水玉清、六条深雪、南都夜夜,三个大苦逼,没有最惨只有更惨,简直催人泪下。导演硬是让外形很讨人喜欢的光莉变成了观众恨不得想杀了她得角色,只能说目的已达到。

再说屋顶上的百合灵同学。这个游戏大概算是很小众的了,因为我在网上甚至都没找到一篇像样的攻略,虽然其实并不需要攻略吧毕竟是单线的。有人说画风奇怪,我倒是觉得比一般的 GAL 画风更好(虽说其实没有玩过几部..),应该说是平实又不失美感的画风。音乐倒是没啥感觉,似乎并没有很出彩。游戏系统也毫无亮点。但!是!这!都!不!重!要!百合灵的叙事方式简直是潮到爆,你能想象 GALGAME 采用第三人称+POV 的方式来推进剧情吗?这是请马丁来写的剧本吗?虽然听起来很奇怪,但是 POV 应用到游戏里一样能发挥这种叙事方式的神奇魅力。第三人称是怎么回事?其实游戏是有女主的,但是并不是女主在攻略其它人,而是女主在想尽各种办法撮合其他人,没错,这是一款帮别人谈恋爱看别人谈恋爱的 GAL!只能说太炫酷了。

虽然全剧情还没有达成(没时间),但是故事流程都走完了。也许和我很喜欢百合灵的画风有关,基本上里面的 CP 我都很喜欢,但主要原因还是游戏的情感描写比较细腻。最喜欢CP是牧圣苗x相原美纪,不过网上关于 CP 的讨论/吐槽已经够多了,我也懒得多说。

我想说的是,虽然戏份不多,但是三山音七这个角色我实在太喜欢了。她有一切成为我喜欢的角色的要素:平时一直困得要命到处找地方睡觉,却能洞察周围人的心理,在处理一木美羽和双野纱沙的问题时不能够再合理,天台上用强大的语言能力和对朋友的真挚情感说服了一木和双野最终达到三人都 happy 的完美结局,太帅了!三山音七只是一个例子,百合灵中的人物特点都很鲜明,和 BACCANO 类似,没有一个让人讨厌的角色,每个角色都有让人喜欢的地方,而每个角色都会有一部分人特别喜欢。

最后点评一下三个能力比较强的角色。三山音七之前说过了,主角远见结奈和风纪委员有游爱来也算是旗鼓相当。远见结奈的厨艺就不多说了,更难得的对要做的事情有清晰规划,不论是撮合其他人还是合宿时候的各种事情。有游爱来在校长面前的嘴炮相当需要勇气,她严格遵循自己的规则而不是他人定下的规则,合宿时帮忙也体现了超强的办事能力。好吧,其实我想说的是百合灵里面的角色真的都很有魅力。


top