通过Ruby on Rails使用wget

Pau*_* S. 5 webserver ruby-on-rails wget

我想建立一个简单的网站,可以下载网页,www.example.com/index.html并在客户端请求时将其快照存储在服务器上.我正在考虑使用该命令wget下载网页.Ruby on Rails能够处理这个任务吗?

Mat*_*sel 12

是.

您可以通过back ticks,exec和system在Ruby中执行shell命令.请注意,每个返回略有不同的东西:

  1. 背蜱

    wget http://www.yahoo.com
    
    Run Code Online (Sandbox Code Playgroud)
  2. exec:

    exec('wget http://www.yahoo.com')
    
    Run Code Online (Sandbox Code Playgroud)
  3. system:

    system('wget http://www.yahoo.com')
    
    Run Code Online (Sandbox Code Playgroud)

这篇博文似乎与你想要做的事情一脉相承.

此外,有几个非常棒的Ruby库用于执行此操作:

  1. 机械化机械化下载 - 检查这个railscast
  2. httparty - 围绕一个更难以使用的http库的简单包装.获得响应正文后,您需要将其保存到数据库或文件中.
  3. typhoeus - 如果您需要这样的能力,可以并行制作http请求的简单机制

它们将提供更好的更清晰的Ruby接口,用于处理从各种请求返回的数据.


测试所有这些选项的最佳方法是使用Rails控制台.转到Rails应用程序的根目录并键入:

rails c
Run Code Online (Sandbox Code Playgroud)

进入控制台后,您可以模拟实际的服务器调用.

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}")
Run Code Online (Sandbox Code Playgroud)

请务必也包含此帖子中的选项