通过Google Reader API获取历史RSS条目

有时候你看到了一个好的Blog,于是你订阅了它,但你会发现,如果直接访问订阅的RSS源,它只会返回最新的10-20条内容,这是由Blog服务器决定的。如果偶们非常希望能够看到它以前所有的文章,怎么办呢?

订阅至Google Reader是个好办法,Google Reader发现你希望看到更多条目的时候,自动会获取更多的历史条目。这是怎么做到的呢?原来Google童鞋已经爬了多年的网络了,它所爬到的信息都存在它的数据库里,所以其实当Google Reader提供给你这些历史条目的时候,它实际上是从它所爬到的数据库中提取出来的。但有时候使用Google Reader也不够方便啦,因为它是增量式提供给你信息的,如果这时候希望获得所有的条目,用Google Reader一小段一小段地去取实在太过麻烦。今天发现了一个方法,很有效,很方便,推荐给各位童鞋。

假设现在希望获得所有的Visual C++ Blog的文章,它所提供的RSS链接是

http://blogs.msdn.com/vcblog/rss.xml

那么,召唤Google童鞋~

http://www.google.com/reader/atom/feed/http://blogs.msdn.com/vcblog/rss.xml?n=100

看清楚咯,http://www.google.com/reader/atom/feed/ + 你的RSS + ?n= + 你所需要的条目数量

通过这个API,Google Reader就会把它数据库里关于这个feed的条目根据你所需要的数量以Atom的格式返回给你。如果你想要所有的条目,很简单,设n=999999就行了...简单估计一下,一个Blog开20年每天100篇发布的话也不会超过这个数字的,所以放心吧~

当然这里还有个小问题,如果我的feed的url中含有一个问号“?”怎么办?比如这个feed

http://www.gmazars.info/conf/rss/rss_builder.php?feed=gmazars.xml

如果直接访问http://www.google.com/reader/atom/feed/http://www.gmazars.info/conf/rss/rss_builder.php?feed=gmazars.xml?n=100这个url,Google会告诉你,内部服务器错误。解决方法也很简单,用HTML Encoding把“?”符号Encoding掉就好了,去查了一下编码表,“?”对应%3F,所以说,用这个url访问就OK啦

http://www.google.com/reader/atom/feed/http://www.gmazars.info/conf/rss/rss_builder.php%3Ffeed=gmazars.xml?n=100

拿到了这个xml之后你就可以用你喜欢的方式来显示它了,比如用一个xsl样式,或者自己写一个小程序就行啦~

Comments (19)

  1. 10:38, 2009-11-21koh  / Reply

    这个东西舜哥去年就搞了。。。

  2. 13:46, 2009-11-21chris  / Reply

    @koh
    我只是转帖...

  3. 14:07, 2009-11-21koh  / Reply

    我知道你是转的,我只是想到了舜哥以前这么干过。。。

  4. 16:26, 2009-11-21万戈  / Reply

    这个想法不错啊,可以尝试下

  5. 11:58, 2010-01-19zy  / Reply

    转贴你倒是注明原始出处啊,知不知道羞耻二字?!还技术人员呢?丢人!

  6. 12:22, 2010-01-19Chris  / Reply

    @zy
    我说是转帖。。其实我也不是copy的。。知道有这个办法,转个想法而已。。难道这个世界上的C++教程都要写从哪儿转的吗。。

  7. 22:08, 2010-01-19Justice  / Reply

    @Chris
    你 reply 了他也看不见的,人家留的 Email 是 z@2.net ...
    你自己不好...谁让你在回复里面说是转帖 =,=

  8. 10:24, 2010-01-20似水无痕  / Reply

    标题加个[转]就好了,不过内容确实不错

  9. 10:35, 2010-01-20zhangner  / Reply

    有个小问题,比如Javaeye这样的博客rss订阅的时候得到的不是文章中所写的rss.xml格式,而直接是RSS结束(比如:http://ren.javaeye.com/rss),那么加上?n=100之后就没有作用了。。有什么解决的办法吗?谢谢

  10. 10:54, 2010-01-20zhangner  / Reply

    还是说简洁一点,用文章中的做法对JavaEye这种博客,得到的结果加不加?n=100都是一样,我不知道是不是因为订阅的RSS没有.xml的原因。有没有什么解决方法啊?。谢谢

  11. 11:16, 2010-01-20Chris  / Reply

    @zhangner
    我看了一下,发现用google订阅这个blog的话也只能看到2条内容,不知道为什么google没有对这个feed做记录。我说的这个办法的原理其实是利用了google的爬虫对feed历史信息的记录,如果google的爬虫没有这个记录那就没有办法了。你试试这个blog,也是javaeye上的,我随便找的http://zsp.javaeye.com/rss,就是可以的。

  12. 11:19, 2010-01-20Chris  / Reply

    @似水无痕
    哈哈,貌似我的回复给大家很多误解。。我其实不是转的,不信你可以google之,对了,google出来的第一条hi baidu上的。。那个是copy我的。。我的是yc的。。

  13. 11:27, 2010-01-20zhangner  / Reply

    @Chris
    试了一下,这个blog确实可以。如果Google确实是按你文章中说的这样处理的话,确实是可以理解的,之前没有对我说的那个blog进行过RSS处理,也就不会有记录了。。。
    有没有其他的什么办法可以解决啊?。

  14. 11:43, 2010-01-20似水无痕  / Reply

    @Chris
    那么你就把前面那个说明转帖的回复删除呗,或者修改一下说法

    要提醒你的是Google不会主动记录RSS,只会从第一次有人添加RSS才回记录,就算所有人都取消订阅了。如果订阅一个RSS找不到之前的内容的话说明你是第一个订阅的

  15. 11:54, 2010-01-20似水无痕  / Reply

    先不管GoogleReader记录的条数,直接查看RSS,发现上面说的那个RSS只有两条信息,我又看了同一站点的几个博客,RSS条目数量不等,大致可以认为该博客可以自定义RSS输出条目的数量

  16. 12:33, 2010-01-26kuber  / Reply

    我做了一点补充。google reader api 除了返回ATOM外还能返回JSON格式。
    “oogle提供的几种读取feed的API”:http://www.cnblogs.com/kuber/archive/2010/01/25/read_feed_with_google_apis.html

  17. 01:09, 2010-02-04泡面  / Reply

    这是个好方法,回头试试。刚刚开始用GR。

  18. 08:37, 2010-02-04johnny  / Reply

    失败 请问对rss 结尾的地址该如何处理呢

  19. 13:40, 2010-02-04chris  / Reply

    请把失败的例子贴出来,我瞧瞧

Leave a Reply

Allowed Tags - You may use these tags in your comment.

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">