11. ruby - ウェブスクレイピング - certified

 
11.1 概要
11.2 開いてみる
11.3 VERIFY_NONE してみる

11.1 概要

 よく理解していないのですが・・・。  https のサイトを通常のオープンで開こうとするとエラーになるのだ。  本項は以下のサイトを参考にさせていただきました。
Windows 上の Ruby で SSL 接続時に certificate verify failed が出る場合の対処」
「Ruby の https 通信で ... とりあえず動かしたいとき。
 これらを読むと証明書の場所を自前で定義してそこに証明書を配置するか、証明書のチェックを行わないようにするしかなさそうです。  いささか古い記事を読むと「net/https」を使うようなことを書いていますが、Ruby のマニュアルを読むと「net/https」は 1.9.2 で「net/http」にマージされているようです。
Ruby 2.5.0 リファレンスマニュアル > ライブラリ一覧 > net/https ライブラリ 」
「Ruby 2.5.0 リファレンスマニュアル > ライブラリ一覧 > net/http ライブラリ 
 でまぁ「net/http」も使い方がよ~わからんのです。  で「open-uri」のまま使える
open-uri の HTTPS リクエストで certificate verify failed 
 が、わたしには一番使いやすそうです。

11.2 開いてみる

 実際、どういう現象かと言うと
#!/usr/bin/env ruby

=begin

URI をオープンしてみる

=end

require('open-uri')

begin
  uri = URI.encode('https://freebsd.sing.ne.jp/')
  uri = URI.parse(uri)

  html = open(uri).read
rescue => error
  puts("例外発生[#{error.class}]")

  error.backtrace_locations.each do | line |
    puts("#{line}")
  end

  puts("[#{self.class.name}][#{error.message}]")
end



 てなソースを実行すると

> ./ソースファイル名.rb
例外発生[OpenSSL::SSL::SSLError]
/usr/local/lib/ruby/2.4/net/protocol.rb:44:in `connect_nonblock'
/usr/local/lib/ruby/2.4/net/protocol.rb:44:in `ssl_socket_connect'
/usr/local/lib/ruby/2.4/net/http.rb:948:in `connect'
/usr/local/lib/ruby/2.4/net/http.rb:887:in `do_start'
/usr/local/lib/ruby/2.4/net/http.rb:876:in `start'
/usr/local/lib/ruby/2.4/open-uri.rb:323:in `open_http'
/usr/local/lib/ruby/2.4/open-uri.rb:741:in `buffer_open'
/usr/local/lib/ruby/2.4/open-uri.rb:212:in `block in open_loop'
/usr/local/lib/ruby/2.4/open-uri.rb:210:in `catch'
/usr/local/lib/ruby/2.4/open-uri.rb:210:in `open_loop'
/usr/local/lib/ruby/2.4/open-uri.rb:151:in `open_uri'
/usr/local/lib/ruby/2.4/open-uri.rb:721:in `open'
/usr/local/lib/ruby/2.4/open-uri.rb:31:in `open'
../open/open_uri.rb:15:in `<main>'
[Object][SSL_connect returned=1 errno=0 state=error: certificate verify failed]
 ということになるのです。

11.3 VERIFY_NONE してみる

 参考サイトに習って
#!/usr/bin/env ruby

=begin

URI をオープンしてみる

=end

require('pry')
require('open-uri')
require('openssl')

begin
  OpenSSL::SSL.module_eval{ remove_const(:VERIFY_PEER) }
  OpenSSL::SSL.const_set( :VERIFY_PEER, OpenSSL::SSL::VERIFY_NONE )

  uri = URI.encode('https://freebsd.sing.ne.jp/')
  uri = URI.parse(uri)

  html = open(uri).read
rescue => error
  puts("例外発生[#{error.class}]")

  error.backtrace_locations.each do | line |
    puts("#{line}")
  end

  puts("[#{self.class.name}][#{error.message}]")
end



 というソースを書いてみました。  これはエラーが発生しませんでしたので、これでいこうと思います。