2012-10-08 43 views
5

我想構建一個簡單的網站,它可以下載網頁www.example.com/index.html並在客戶端請求時將其快照存儲在服務器上。我正在考慮使用命令wget來下載網頁。 Ruby on Rails能夠處理這個任務嗎?通過Ruby on Rails使用wget

+0

的選項快照,你的意思是一張圖片,或底層的HTML? –

+1

嗯,我的意思是底層html和任何與該頁面相關的圖片/樣式表(即使用wget的-p選項)。 –

回答

10

是的。您可以執行shell commands in Ruby via back ticks, exec and system。需要注意的是每一個返回的東西稍有不同:

  1. 反勾

    wget http://www.yahoo.com 
    
  2. exec

    exec('wget http://www.yahoo.com') 
    
  3. system

    system('wget http://www.yahoo.com') 
    

This blog post似乎與你想要做的一樣。

此外,也有這樣幾個了不起的Ruby庫:

  1. mechanizemechanize download - 看看這個railscast
  2. httparty - 一個more-difficult-to-use http library周圍簡單的包裝。一旦獲得響應主體,您將需要將其保存到數據庫或文件中。
  3. typhoeus - 簡單的機構,能製作的http請求並行,如果你需要這樣的能力

他們將提供一個更好的清潔Ruby接口用於處理與來自各種請求回數據。


測試所有這些選項的最佳方法是使用Rails控制檯。轉到您的Rails應用程序和類型的根目錄:

rails c 

一旦在控制檯中,你可以模擬實際的服務器調用。

在您的控制檯中運行wget會將文件放到Rails根目錄中,這不是您想要的。 tmp是此類事物的標準目錄。可以動態地生成基於URL像這樣的路徑:

# tmp directory 
path = Rails.root.join('tmp') 
# create sub-directory as md5 hash based on URL 
sub_dir = Digest::MD5.hexdigest(url) 
# append sub_dir on the path 
destination_path = path.join(sub_dir) 
system("wget -P #{destination_path} #{url}") 

一定要還包括從this post

+0

謝謝!讓我花一些時間來回答你的答案。 順便說一句,一旦我使用'exec' /'system'執行'wget',如何指定服務器上放置文件的位置?你提到的 –

+0

[博客文章](http://blogforever.eu/blog/2011/05/21/creating-a-snapshot-of-a-blog-post-using-wget/)絕對不可思議。這應該幾乎取代了靜態頁面分析器ruby gems的一半。 –