RSS全文抽取服務 / Full-Text RSS Service
Full-Text RSS是我根據FiveFilters.org提供的full-text-rss改良的開放原始碼RSS全文抽取服務。Full-Text RSS可以分析RSS中每個頁面的網址,抽取該網址中的網頁文章內容,並加上換頁偵測、中文字編碼調整,讓RSS閱讀器可以直接閱讀到全文的RSS。
Based on FiveFilters.org’s full-text-rss code, I developed Full-Text RSS service to extract full text in RSS feed especially for Chinese article. Following are Full-Text RSS’s introduction, features and usage.
由來 / Introduction
由於我個人是重度的RSS讀者,然而大部分的RSS訂閱來源都只有提供文章一小部分的內容,例如Linux伊甸園開源社區 (RSS網址為:http://www.linuxeden.com/rss.php) ,這意思是說我要看文章的內容,還得從RSS瀏覽器中打開瀏覽器、上網、然後用他們網站中不適合手機小尺寸螢幕的排版來閱讀。雖然之前我也找許多RSS全文服務,包括まるごとRSS、FeedEx.net、FiveFilters.org,但是因為效率跟中文編碼的問題,總讓我使用起來十分受限。
這讓我興起了想要自己來架設RSS全文抽取服務的念頭。一開始我是在GitHub上搜尋,找到很多以full-text-rss為名字的專案。然後循著README.md,才找到於FiveFilters.org的開放原始碼軟體full-text-rss。
於是我就很開心地下載下來,改放到GitHub託管,然後隨著自己的習慣不斷地改造這個Full-Text RSS全文抽取服務。
特色與改造 / Features
RSS全文抽取服務最主要的目的在於抽取RSS的文章內容。以Linux伊甸園開源社區為例,原本的RSS網址 www.linuxeden.com/rss.php 只能顯示部分內容,如下圖:
但是經過RSS全文抽取之後,可以把原本的網址取代成RSS全文抽取服務的網址: http://example-full-text-rss.org/full-text-rss/makefulltextfeed.php?url=www.linuxeden.com%2Frss.php&max=10&links=preserve&exc=&submit=Create+Feed (只是範例網址,實際上不能連線喔),顯示內容如下:
你可以看到「物联网福音 不耗电Wi-Fi技术问世」一文已經從原本的部分文字抽取成文章全文了。
而我從FiveFilters.org下載full-text-rss之後,還進行了以下特色的改造:
- 為中文編碼進行調整,儘可能避免亂碼。但是當伺服器記憶體不足時還是會變成亂碼。
- 如果網頁內有換頁,則會自動下載下一頁的內容,合併成一篇文章。軟體玩家的文章就常常有換頁,例如日本旅遊必備上網好夥伴—Wi-Up日本4G吃到飽分享器(2014日本東京10日)實測。
- 針對自己常看的網站設計全文抽取專用的版型,以免抽取內容錯誤。像是engadget中文版、Mr.6等等。
用到現在也將近快1年了,陸陸續續修改了很多次,到現在總算是覺得比較穩定一點,所以就來寫這篇Blog介紹。
系統需求 / Server Requirement
Full-Text RSS是以PHP運作。安裝時條件如下:
- PHP版本:5以上
- 不需要搭配資料庫
但是由於Full-Text RSS在抓取網站的全文時需要大量記憶體與等待相當長的時間,如果超過PHP可以執行的時間,就會顯示錯誤訊息:
[unable to retrieve full-text content]
因此我們必須調整PHP的設定檔php.ini的部分參數,讓Full-Text RSS能有比較寬裕的執行環境:
- max_execution_time=300
- max_input_time=600
- memory_limit=128M
- 必須啟用cURL,才能抓取資料
如果還有其他參數需要調整,請在下面留言跟我說。
由於Full-Text RSS會消耗大量伺服器的資源,我本來想試著架設在免費的PaaS上來運作,可惜免費空間都跑不動。因此我推薦是安裝在自己的電腦上,當然,你的電腦也得是可以公開連線的伺服器才行。
安裝 / Installation
請從以下網址下載Full-Text RSS:
- Full-Text RSS專案網址:https://github.com/pulipulichen/full-text-rss
- Full-Text RSS ZIP壓縮檔案下載:https://github.com/pulipulichen/full-text-rss/archive/master.zip
下載後,請解壓縮到你的PHP運作環境目錄。以XAMPP伺服器來說,執行目錄就是在htdocs資料夾底下。例如c:\xampp\htdocs\full-text-rss\
然後運作網頁伺服器,直接開啟Full-Text RSS網址,例如http://your-ip/full-text-rss/,這樣就可以連線了。
使用方法 / Usage
Step 1. 輸入RSS訂閱資訊網址 / Enter RSS Feed URL
首先在Enter URL輸入RSS訂閱資訊的網址,例如:http://www.linuxeden.com/rss.php。然後按下「Create Feed」按鈕。
接著等待一段時間,讓Full-Text RSS去讀取。如果讀取到最後發生錯誤,建議修改輸入頁面的「Max items / 最多抽取文件篇數」,降低為5篇以下,可以降低Full-Text RSS的讀取負擔。
Step 2. 取得全文抽取網址 / Get Full-Text RSS Feed
順利開啟之後,到網址列複製Full-Text RSS提供的網址。舉例來說:
- 原本網址:http://www.linuxeden.com/rss.php
- Full-Text RSS轉換網址:http://example-full-text-rss.org/full-text-rss/makefulltextfeed.php?url=www.linuxeden.com%2Frss.php&max=10&links=preserve&exc=&submit=Create+Feed
剛剛的參數都寫在網址上,應該很容易看懂吧。
Step 3. 加入您的RSS閱讀器 / Add Feed To Your RSS Reader
然後把剛剛拿到的Full-Text RSS網址加入到你的RSS閱讀器,像是Feedly (可惜沒有Google Reader了),這樣就可以了。
結語:不太對的回饋 / Conclusion: Missing Feedback
Full-Text RSS網站服務又是一個受惠於開放原始碼的例子。我從FiveFilters.org取得了full-text-rss,然後改造之後再到GitHub去發佈,現在寫一篇Blog介紹這怎麼使用。取之開放原始碼,回饋於開放原始碼,嗯?好像哪裡怪怪的?
是的,其實Git版本控制在團隊合作之間一般是使用Fork建立自己的分支專案,然後用Pull Requests來請求原作者看一下我改過的程式碼,以回饋給原作者。這部分doggy有比較詳細的介紹:了解 GitHub 的 fork 與 pull request 版控流程。
可惜當初我還不知道Fork這個很重要的功能,所以到現在也就獨立發展了。以後會乖乖Fork專案,好好回饋給作者的啦。
你好,請問轉換試發生以下ERROR 是什麼原因?
回覆刪除Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /var/www/html/full-text-rss/libraries/Zend/Cache/Backend.php on line 66
Warning: include(simple_html_dom.php): failed to open stream: No such file or directory in /var/www/html/full-text-rss/libraries/content-extractor/ContentExtractor.php on line 15
Warning: include(): Failed opening 'simple_html_dom.php' for inclusion (include_path='/var/www/html/full-text-rss/libraries:.:/usr/share/php') in /var/www/html/full-text-rss/libraries/content-extractor/ContentExtractor.php on line 15
Warning: Use of undefined constant ATOM - assumed 'ATOM' (this will throw an Error in a future version of PHP) in /var/www/html/full-text-rss/libraries/feedwriter/FeedWriter.php on line 189
To 深靈,
刪除php 7.2 each() function is deprecated
https://github.com/sabre-io/Baikal/issues/711
在PHP 7.2之後就移除了each()函式
所以請用早期的PHP版本,推薦使用PHP5
因爲是VPS,本身安裝是最新LAMP套裝……意思是PHP7.2 不能用你的版本?
回覆刪除作者已經移除這則留言。
刪除To 深靈,
刪除https://stackoverflow.com/a/46493098
可以試著自己宣告each()函數
<?php
if (!function_exists("each")) {
function each(&$arr) {
$key = key($arr);
$result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
next($arr);
return $result;
}
}
我也不確定這樣是否能用就是了
補上了缺少的檔案:simple_html_dom.php
回覆刪除https://github.com/pulipulichen/full-text-rss/blob/master/libraries/content-extractor/simple_html_dom.php
這樣應該可以運作吧?
最近網友有遇到錯誤訊息如下:
回覆刪除````
This page contains the following errors:
error on line 2 at column 1: Extra content at the end of the document
Below is a rendering of the page up to the first error.
````
他降級為PHP 5.0之後,這個問題就解決了
提供大家參考