火影在第700话迎来完结,想来想去还是决定写点什么,毕竟是追了十年的漫画。
初中的时候周围所有人都在看火影。那时大家基本上都是先看的动画,随后学校旁边的店里开始卖漫画了,于是就有人买漫画带到班上来。当时动画放到中忍考试那段,我只看过为数不多的几集。买到的漫画进度则已经到了小樱+千代婆婆vs蝎,好几本漫画在班里传来传去,一个同学看完一本之后就会到处打听下一本在谁手上,不过往往下一本已经被预定了。
之后生活环境有了一些变化,假期里只有我一人在家。那段日子里我如饥似渴地把火影的漫画追到最新,动画也补了不少,尤其是鸣人、宁次、丁次、牙和音忍五人众的战斗,至今我都觉得那是火影里最煽情的战斗。
之后我就开始追连载漫画和动画。本来每周还会看动画,但是后来原创剧情越来越多,就觉得没意思了,索性完全放弃动画。现在想起来,也不知道动画当时看到哪里了,但是我非常确定是在某一段原创剧情中放弃掉的。。。
再往后就是主角们一路升级,阿斯玛,自来也也在战斗中阵亡,最后终于几个国家决定联合起来。五影会谈前鸣人被揍但是不还手的那段剧情让我一度认为火影有希望在立意方面超越以前的热血漫画,写出比靠拳头说话用力量打倒敌人更有内涵的剧情,至少要做到不一样。不过从第四次忍界大战开始,剧情里基本就全是战斗,我的期望也落空了。
火影一个有意思的地方是可供猜测的地方很多。大一大二的时候我很喜欢看火影的分析文章,每一话我都要找好几篇分析来看才能满足。还有一些针对特定主题的分析,其中被写得最多的,就是面具男的身份和第六具棺材里放的是谁的问题。基本上宇智波家族的人都被猜了个遍,甚至还有些不是宇智波家的人都被挖掘出来。每篇分析都会从漫画中的各种细节找出蛛丝马迹,再结合自己的推理,最后得出一个漂亮的结论。看了好多分析之后,其实那时我已经确信面具男一定不是带土了,结果呢,岸本说他是带土,那就只能是咯。
回顾过去,我真正中二的冲动全部来自火影。小强们在战斗,我们却只能日复一日过着平凡的生活,这种落差感每次都导致我在看完几集火影之后情绪低落。严格来讲,当时的自己远远谈不上中二,但是对忍者世界的向往,却是实实在在的。
火影完结了,无论它最终是否有达到人们的预期,它都已经横跨了我、以及许多人完整的青春。十年之后,当我们忘记火影的剧情,忘记曾让我们热血喷张的战斗,忘记少年时代中二的幻想,我们唯一能说的就是:当年,我追过《火影忍者》。
现在用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_description
,item_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了
很早之前订了 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.