###前提・実現したいこと→ファイルを取得して保存したい。
あるウェブサイトからファイルを取得したいと考えています。
ファイルは一時間ごとに更新されるため、ファイル名も年月日時間で変化します。
Rubyでファイルをダウンロードし、指定したディレクトリに保存させたいです。
mechanize.rb
をcronに登録し、時間になると実行して、ダウンロードさせたいと思っています。
###試したこと
ruby
#download.rb # URLにアクセスするためのライブラリの読み込み require 'open-uri' # スクレイピング先のURL url = 'http://example.com/DataList.php?MstCode=01234567' # user_agentの設定 user_agent = 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.63 Safari/537.36' charset = nil html = open(url, "User-Agent" => user_agent) do |f| charset = f.charset # 文字種別を取得 f.read end # 取得したhtmlを全て表示する puts html
を実行しました。
<html> <head> <META http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>文字化けしている</title> </head> <frameset rows="180,*" cols="*" frameBorder="0"> <frame name="Titke" src="DataListTitle.php?MstCode=01234567&Time=yyyymmddhhの形式" scrolling="no"> <frame name="Hyou" src="DataListHyou.php?MstCode=01234567&Time=yyyymmddhhの形式" scrolling="yes"> </frameset> <noframes></noframes> </html>
と表示されました。
保存したいファイルは、
DataListHyou.php?MstCode=01234567&Time=yyyymmddhhの形式
です。
保存したい場所は、
/home/(ユーザ名)/Desktop/ファイル
です。
また、文字化けにも対応したいです。
プログラムをどのように修正すればいいでしょうか。
何卒よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
Ubuntu15.10
Ruby2.2.4です。
#追記
ファイル名はそのままで保存したいです。
保存したい場所は
home/(ユーザ名)/Desktop/ファイル
です
Mechanize::File - Seesaa Wiki(ウィキ)を参考にしたのですが、うまくいきませんでした。
require "mechanize" agent = Mechanize.new agent.user_agent_alias = "Windows Chrome" url = "http://soramame.taiki.go.jp/DataList.php?MstCode=34204520" page = agent.get(url) page.root.xpath("//frame").each do |frame| if frame["name"] == "Hyou" frame_url = frame["src"] frame_page = agent.get(frame_url) "frame_page.body を 目的のファイルに書き込み" path = "/home/ユーザ名/Desktop/file " filename = path save_as(filename) end end puts page.body.force_encoding(page.encoding).encode("utf-8")
$ ruby mechanize.rb
と実行したところ
mechanize.rb.rb:15:in `block in <main>': undefined method `save_as' for main:Object (NoMethodError) from /home/(ユーザ名)/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:187:in `block in each' from /home/(ユーザ名)/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `upto' from /home/(ユーザ名)/.rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/nokogiri-1.6.8.1/lib/nokogiri/xml/node_set.rb:186:in `each' from mechanize.rb:8:in `<main>'
と表示されました。
また、
ruby
require "mechanize" agent = Mechanize.new agent.user_agent_alias = "Windows Chrome" url = "http://example.com/DataList.php?MstCode=01234567" page = agent.get(url) page.root.xpath("//frame").each do |frame| if frame["name"] == "Hyou" frame_url = frame["src"] frame_page = agent.get(frame_url) "frame_page.body を 目的のファイルに書き込み" end p frame_page puts frame_page end
では、
$ ruby mechanize.rb
nil #<Mechanize::Page {url #<URI::HTTP http://example.com/DataList.php?MstCode=01234567>} {meta_refresh} {title "ホームページ"} {iframes} {frames} {links} {forms #<Mechanize::Form {name "Form1"} {method "GET"} {action ""} {fields [hidden:0x2ab59e31d368 type: hidden name: Err value: ]} {radiobuttons} {checkboxes} {file_uploads} {buttons}>}> #<Mechanize::Page:0x00556b3c27c700>
となります。
やりたいこと、させたい動作はイメージできますが、やり方等知識が圧倒的に不足しています。
知恵をお貸しいただけないでしょうか。
よろしくお願いしたします。
まだ回答がついていません
会員登録して回答してみよう