Fullfeed ,一個制作全文 Feed 的 Framework (1)
feed, rss, ruby, web at June 7th, 2009 by 小影
話說最近剛買了本電子書,其中一個目標是能在書上慢慢讀 RSS 。一路整理想讀的 feed 時,理所當然地,就遇上了想讀的 feed 不顯示全文的問題。
要是在 PC 上可以使用 greasemonkey script rssget ,但要讓不能執行 greasemonkey 的 client 上就必需要由伺服器方面解決了,於是就開始在 server side 作 fulltext feed 的計畫。
要寫這樣一個 script 也很簡單,基本上只有兩步:1) 把 RSS Feed 的 item 逐個找出來;2) 把每個 item 指向的頁面內容抽出來,放回原本的 Item 中。用 Hpricot 處理非常簡單:
抽取全文通常是用 XPath 或 CSS selector ,這也可以用 Hpricot 解決:
單是這樣本已可滿足需求,但是否可以更簡潔和易維護呢?於是我就造了 fullfeed 這個全文 Feed 的 framework,希望更快幫我做出全文 feed 。首先請安裝這個 rubygem:
gem sources -a http://gems.github.com gem install siuying-fullfeed
接著寫兩個檔案:
yahoo_news_hong_kong_extractor.rb
ynews_hk.rb
首先由 ynews_hk.rb 說起。
第 6 行:Feed.new 定義了一個全文 Feed,只有 URL 是必需的 parameter。其他的 option 包括 :limit (找多幾多篇全文)、 :wait (每一次 request 要等多久)、:agent (下載網頁的方式) 和:store (暫存全文的方法)。
第 7 行: feed.fetch 就是下載 feed。首先 Feed 會下載 RSS ,接著找出每個 item 的 link ,下載它們,分析它們的內容找出正文,放回 RSS 內,最後列印出來。
Feed 是怎樣知道怎樣找出原文的呢?答案就在 extractor 中。
YahooNewsHongKongExtractor 延申了 XpathExtractor。XpathExtractor 吃兩個 parameters :Extractor 可分析網頁的 URL Pattern,以及一個 指定內容的 XPath expression 。
上面 extractor 有一句 “register” 就是把自己注冊到 ExtractorFactory 中。在分析網頁時我們 Feed 會逐個 extractors 找懂得分析這網頁的 extractor 。
你也可以自行定義新的 Extractor ,只需要編寫 accept(url) 以及 extract(doc) 兩個方法就行了。我也做了一個返回全個 body 下的 text 的 TextExtractor 。
下回再講怎樣用 Filter 更改修正全文 Feed 的內文,以及怎樣把 Feed 保存在資料庫中,不用重新下載已保存的全文 。
2 Responses to “Fullfeed ,一個制作全文 Feed 的 Framework (1)”
By 軒爸 on Jun 8, 2009 | Reply
平時有在手機看Feed, 亦冇greasemonkey用, 所以在Fullfeed方面也花過點腦筋, 就是用Y!Pipes做MSB Fullfeed (server都慳番嘛). 不過用Y!Pipes就冇XPath用, 花了不少功夫才能完成MSB…… 就冇乜心機再攪落去.
http://jessemok.mysinablog.com/index.php?op=ViewArticle&articleId=1464796
心目中的完整方案是”Web2.0″些, 由網友提供URL和XPath Expression, 自製Fullfeed並公開齊齊用. 你這方案, 反倒可以是我那完整方案的基礎. 有趣.
By 小影 on Jun 9, 2009 | Reply
有想過這個啊,只是擔心有版權問題 (也許是過慮了,整左先算)