Ruby - ウェブスクレイピング - フォームの情報を渡す(POST)
- 1. 概要
- 2. 書いてみる
1. 概要
今度は、フォームの情報を渡してみます。
GET であれば、URI の後ろに ? を書いて & でつないでいけばなんとかなるのですが。
POST で渡すには?
下記に実例があるのでなんとかなりそうな気がします。
「Ruby 2.4.0 リファレンスマニュアル - ライブラリ一覧 - net/httpライブラリ」
「Ruby で GET リクエストや POST リクエストした時のメモ」
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')
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クラス」をご参照ください。
|
|