6

www.example.com/index.htmlクライアントが要求したときにWebページをダウンロードして、そのスナップショットをサーバーに保存できる単純なWebサイトを構築したいと思います。wgetコマンドを使用してWebページをダウンロードすることを考えています。Ruby on Railsはこのタスクを処理できますか?

4

1 に答える 1

15

はい。

バックティック、 exec 、および system を介して、Ruby でシェル コマンドを実行できます。それぞれがわずかに異なるものを返すことに注意してください。

  1. バックティック

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

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

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

このブログ投稿は、あなたがやろうとしていることと同じようです。

さらに、これを行うための優れた Ruby ライブラリがいくつかあります。

  1. mechanizeダウンロードでmechanize - このrailscastをチェックしてください
  2. httparty -使いにくい http ライブラリのシンプルなラッパー。応答本文を取得したら、それをデータベースまたはファイルに保存する必要があります。
  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}")

この投稿のオプションも必ず含めてください

于 2012-10-08T21:06:35.640 に答える