12. ruby - ウェブスクレイピング - FTP

 
12.1 概要
12.2 アクセスしてみる

12.1 概要

 さて、このサイトには FTP のリンクもはってあるのです。  その FTP のリンクが生きているかどうかをチェックするのに open-uri は使えませんわな。
#!/usr/bin/env ruby
require('uri')
require('open-uri')

uri = 'FTPサイト'
uri = URI.parse(uri)

begin
  res = open(uri)
  puts "#{res}"
rescue => error
  puts("例外発生 [#{error.class}]")
  error.backtrace_locations.each do | line |
    puts("#{line}")
  end
  puts("#{self.class.name}")
  puts("#{error.message}")
end

 てなソースを書いて実行すると

> ./ソースファイル名.rb
例外発生 [Net::FTPPermError]
/usr/local/lib/ruby/2.4/net/ftp.rb:472:in `getresp'

・・・略・・・

/usr/local/lib/ruby/2.4/open-uri.rb:31:in `open'
./open_uri.rb:11:in `<main>'
Object
500 'RETR' not understood
 ということになるのです。  FTP の場合、別のものを使わないといけませんわな。  下記を参考にさせていただくこととします。
Ruby における FTP 通信のサンプルコード

12.2 アクセスしてみる

 参考サイトに習ってソースを書いてみました。
#!/usr/bin/env ruby
require('pry')
require('uri')
require('net/ftp')

uri = 'FTPサイト'
uri = URI.parse(uri)

ftp = Net::FTP.new

begin
  ftp.connect(uri.host, uri.port)
  ftp.login('anonymous','PASSWD')
  ftp.quit
rescue => error
  puts("例外発生 [#{error.class}]")
  error.backtrace_locations.each do | line |
    puts("#{line}")
  end
  puts("#{self.class.name}")
  puts("#{error.message}")
end



 参考サイトでは、ファイルの送受信までやっているようですが、わたしが今回やっているのは、サイトが生きているかどうかだけなので・・・。  実際はディレクトリ移動までやるべきかとは思いますが、今回は anonymous ユーザでログインできればよしということで・・・。  有効な FTP サイトで anonymous ユーザが有効な場合は

> ./ソースファイル名.rb
 すんなり終わります。  FTP が無効もしくは anonymous ユーザが無効な場合は

> ./ソースファイル名.rb
例外発生 [Errno::ETIMEDOUT]
/usr/local/lib/ruby/2.4/socket.rb:64:in `connect'
/usr/local/lib/ruby/2.4/socket.rb:64:in `connect_internal'
/usr/local/lib/ruby/2.4/socket.rb:137:in `connect'
/usr/local/lib/ruby/2.4/socket.rb:627:in `block in tcp'
/usr/local/lib/ruby/2.4/socket.rb:227:in `each'
/usr/local/lib/ruby/2.4/socket.rb:227:in `foreach'
/usr/local/lib/ruby/2.4/socket.rb:617:in `tcp'
/usr/local/lib/ruby/2.4/net/ftp.rb:339:in `block in open_socket'
/usr/local/lib/ruby/2.4/timeout.rb:76:in `timeout'
/usr/local/lib/ruby/2.4/net/ftp.rb:334:in `open_socket'
/usr/local/lib/ruby/2.4/net/ftp.rb:375:in `block in connect'
/usr/local/lib/ruby/2.4/monitor.rb:214:in `mon_synchronize'
/usr/local/lib/ruby/2.4/net/ftp.rb:373:in `connect'
./ftp.rb:13:in `<main>'
Object
Operation timed out - connect(2) for IPアドレス:21
 ホスト名自体が無効な場合は

> ./ソースファイル名.rb
例外発生 [SocketError]
/usr/local/lib/ruby/2.4/socket.rb:227:in `getaddrinfo'
/usr/local/lib/ruby/2.4/socket.rb:227:in `foreach'
/usr/local/lib/ruby/2.4/socket.rb:617:in `tcp'
/usr/local/lib/ruby/2.4/net/ftp.rb:339:in `block in open_socket'
/usr/local/lib/ruby/2.4/timeout.rb:76:in `timeout'
/usr/local/lib/ruby/2.4/net/ftp.rb:334:in `open_socket'
/usr/local/lib/ruby/2.4/net/ftp.rb:375:in `block in connect'
/usr/local/lib/ruby/2.4/monitor.rb:214:in `mon_synchronize'
/usr/local/lib/ruby/2.4/net/ftp.rb:373:in `connect'
./ftp.rb:14:in `<main>'
Object
getaddrinfo: hostname nor servname provided, or not known
 となります。  うむ、いけそうだ。