www.example.com/index.html
クライアントが要求したときにWebページをダウンロードして、そのスナップショットをサーバーに保存できる単純なWebサイトを構築したいと思います。wget
コマンドを使用してWebページをダウンロードすることを考えています。Ruby on Railsはこのタスクを処理できますか?
質問する
10394 次
1 に答える
15
はい。
バックティック、 exec 、および system を介して、Ruby でシェル コマンドを実行できます。それぞれがわずかに異なるものを返すことに注意してください。
バックティック
`wget http://www.yahoo.com`
exec
:exec('wget http://www.yahoo.com')
system
:system('wget http://www.yahoo.com')
このブログ投稿は、あなたがやろうとしていることと同じようです。
さらに、これを行うための優れた Ruby ライブラリがいくつかあります。
- mechanizeダウンロードでmechanize - このrailscastをチェックしてください
- httparty -使いにくい http ライブラリのシンプルなラッパー。応答本文を取得したら、それをデータベースまたはファイルに保存する必要があります。
- 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 に答える