rubyで、webページでリンクされているファイルをすべてダウンロードするスクリプトを書きたいです。
以下のコードは、あるサイトで紹介されていた、同様の目的のコードの冒頭部分です。
require 'open-uri' # Nokogiriライブラリの読み込み require 'nokogiri' index = 0 # ファイルの保存先 download_key = './release_2020_04_/' # ------------------------------------------------ # 一覧画面から、詳細画面へのURLを取得する処理 # ------------------------------------------------ # 一覧画面のHTMLを読み込んでNokogiriでparseする index_url = 'https://www.release.tdnet.info/inbs/I_main_00.html' charset = nil index_html = open(index_url) do |f| charset = f.charset f.read p f end index_doc = Nokogiri::HTML.parse(index_html, nil, charset)
(ダウンロード先のフォルダ名と目的のサイトのアドレスは書き換えてあります。
また、最後から3行目の p f は私がデバッグのためにくわえたものです。)
実行すると、以下のようなメッセージが出ます。
from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:319:in `open_http' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_open' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:212:in `block in open_loop' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:210:in `catch' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:210:in `open_loop' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:151:in `open_uri' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:717:in `open' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:35:in `open' from ./tekiji_2.rb:16:in `<main>'
(実行の際に、最後に | more を書き加えているのですが、表示が途中で止まらないので、前半部分はわかりません。)
おそらくうまくいっていないと思われるのですが、詳細がわかりません。
まず、オンライン状態で実行してもオフライン状態で実行しても同じメッセージが出るので、
0. 成功した
- インターネットアクセスがない
- 指定されたアドレスがない
- アドレスはあるが読み込めなかった。
- 読み込んだ内容をパースできなかった
に分けて、何が起こったのかメッセージが出るようにしたいです。
追記
asmさんに教えていただいた方法でエラーメッセージを見たところ、
最初のほうで、
ruby : C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:882:in `rescue in block in connect': Failed to open TCP connection to ga me8.jp:443 (getaddrinfo: そのようなホストは不明です。 ) (SocketError) 発生場所 行:1 文字:1 + ruby .\tekiji.rb 2>&1 | more + ~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (C:/Ruby23-x64/l...) (SocketError):String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError from C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:879:in `block in connect' from C:/Ruby23-x64/lib/ruby/2.3.0/timeout.rb:91:in `block in timeout' from C:/Ruby23-x64/lib/ruby/2.3.0/timeout.rb:101:in `timeout' from C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:878:in `connect' from C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:863:in `do_start' from C:/Ruby23-x64/lib/ruby/2.3.0/net/http.rb:852:in `start' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:319:in `open_http' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:737:in `buffer_open' from C:/Ruby23-x64/lib/ruby/2.3.0/open-uri.rb:212:in `block in open_loop'
というメッセージが出ていました。
指定したアドレスが見つけられないということらしいので、改めて、ブラウザでそのアドレスを入力したところ、リンクをたどっていけば表示できるアドレスが、それをそのまま別タブにアドレスバーにペーストすると、
アクセスしようとしているサイトを見つけられません。
www.release.tdnet.info という名前のサーバーに接続できません。 ```というエラーメッセージが出ました。 このサイトの特殊な事情によるエラーかもしれません。 別の日付の内容を表示させてもバーに表示れているURLが変わらないので、そのあたりも関係あるのでしょうか。 追記2: ターゲットのアドレスを別サイトのものに書き換えて実験してみたところ、 ```ここに言語を入力 #<Tempfile:C:/Users/*****/AppData/Local/Temp/open-uri20200430-12716-jelry2>
というメッセージが出るようになりました。
*****は伏字ですが、そこに、AppDataというフォルダはできていません。