2

認証付きの HTTPS 接続を使用する必要があるソースから XML ページをスクレイピングする機能を追加しています。Ryan Bates の Railscast #190 ソリューションを使用しようとしていますが、401 認証エラーが発生します。

私のテストRubyスクリプトは次のとおりです。

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = "https://biblesearch.americanbible.org/passages.xml?q[]=john+3:1-5&version=KJV"
doc = Nokogiri::XML(open(url, :http_basic_authentication => ['username' ,'password']))
puts doc.xpath("//text_preview")

スクリプトを実行した後のコンソールの出力は次のとおりです。

/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `block in connect'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:54:in `timeout'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:99:in `timeout'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `connect'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:755:in `do_start'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:744:in `start'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:677:in `open'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:33:in `open'
from scrape.rb:6:in `<main>'

私の調査では、1.9.3 で次のオプションを使用できることが示唆されている 1 つの投稿を見ました。

doc = Nokogiri::XML(open(url, :http_basic_authentication => ['username' ,'password'], :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE))

しかし、これもうまくいきませんでした。この課題に対処するための洞察をいただければ幸いです。

4

3 に答える 3

4

/v1/KJV/passages.xml?q[]=john+3%3A1-5指定された URL は、HTTP ステータス コードでリダイレクトされます302 Found。OpenURI はリダイレクトを認識しますが、セキュリティ上の理由から (おそらく) 認証ヘッダーを自動的に削除します。(*)

直接アクセス"http://biblesearch.americanbible.org/v1/KJV/passages.xml?q[]=john+3%3A1-5"すると、期待どおりの結果が得られます。:-)

(*) 次の場所にありますopen-uri.rb

if redirect
  ### snip ###
  if options.include? :http_basic_authentication
    # send authentication only for the URI directly specified.
    options = options.dup
    options.delete :http_basic_authentication
  end
于 2012-12-07T15:17:56.380 に答える
1

HTTPS を使用する必要があると言っていますが、HTTP プロトコルを使用しています。

url = "http://biblesearch...."

OpenURI は、HTTP と HTTPS の両方を認識します。HTTPS を使用して接続する場合は、URL のプロトコルを に変更してからHTTPS、接続を行います。

url = "https://biblesearch...."
于 2012-12-07T14:41:51.297 に答える