13. ruby - ウェブスクレイピング - フォームの情報を渡す(POST)

 
13.1 概要
13.2 書いてみる

13.1 概要

 今度は、フォームの情報を渡してみます。  GET であれば、URI の後ろに ? を書いて & でつないでいけばなんとかなるのですが。  POST で渡すには?  下記に実例があるのでなんとかなりそうな気がします。
Ruby 2.4.0 リファレンスマニュアル - ライブラリ一覧 - net/httpライブラリ」
「Ruby で GET リクエストや POST リクエストした時のメモ

13.2 書いてみる

 いささか時間がかかりましたが、なんとかなりました。
#!/usr/bin/env ruby
=begin

ウェブアクセスしてコンテンツを受け取る

=end

require('net/http')
require('nokogiri')
require('open-uri')
require('openssl')
require('pry')
require('uri')

begin
  if ARGV.size() < 1
    puts('URI なし')
    exit
  end

  uri = ARGV[0];
  uri = URI.encode(uri)
  uri = URI.parse(uri)

  http = Net::HTTP::new(uri.host, uri.port)

  if (uri.port == 443)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end

  post = Net::HTTP::Post::new(uri.path)

  hash = Hash.new

  ARGV[1..-1].each do | param |
    array = param.split('=')
    hash[array[0]] = array[1]
  end

  post.set_form_data(hash, ';')

  response = http.start do | value |
    value.request(post)
  end
  
  html = response.body
  doc  = Nokogiri::HTML(html)
  
#  binding.pry
  if (doc.title[0, 3] == '405')
    puts("#{doc.title}");
  end

  puts("#{response.body}");

rescue => error
  puts("#{error}")
  puts("#{error.class}")

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

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



 これは以下の形式で実行します。

./ソースファイル名.rb URI [インプット名=値 インプット名=値 ...]
 覚えているうちにメモしておきますと。  27~30行目、アクセス先が SSL であった場合に証明書エラーが発生しないための工夫。  32行目、POST リクエストのクラスを定義。  34~39行目、2番目以降の引数を POST で渡す、インプット名と値のハッシュとして展開しています。  41行目、POST データを設定。  43~45行目、オープンして POST データを渡してその結果を受け取ります。  47行目、受け取ったコンテンツの内容を表示しています。  戻り値自体は Net::HTTPResponse のクラスになっています。  Net::HTTPResponse クラスについては「Ruby 2.4.0 リファレンスマニュアル - ライブラリ一覧 - net/httpライブラリ - Net::HTTPResponseクラス」をご参照ください。