#Rubyでスクレイピングを行う際に発生したエラー
この手の記事はたくさん書かれていますが,google先生で探すのに時間がかかったので自分用にまとめます.
Rubyでスクレイピングを行う際には,openurlとNokogiriを使う方法が一般的かと思います.
しかし,その二つだけだと,SSLやredirect系のエラーが発生します.
kconvを利用しているのはwindowsだからです,,
require 'open-uri'
require 'nokogiri'
require 'kconv'
url = 'http://qiita.com/search?q=ruby'
charset = nil
html = open(url) do |f|
charset = f.charset
f.read
end
doc = Nokogiri::HTML.parse(html, nil, charset)
#p doc
doc.xpath('//h1[@class="searchResult_itemTitle"]').each do |node|
print(Kconv.tosjis(node.css('a').inner_text)<<"\n")
end
上記で実行すると以下のエラーが発生します.
これは,http->httpsのリダイレクトをしようとしてエラーになっています.
まぁ,qiitaだとurlをhttpsに変更するだけでいいのですが
これは,open_uri_redirectionsを追加すれば大丈夫になります.
open-uri.rb:225:in `open_loop': redirection forbidden: http://qiita.com/search?q=ruby -> https://qiita.com/search?q=ruby (RuntimeError)
次
practice.rb
require 'open-uri'
require 'open_uri_redirections'
require 'nokogiri'
require 'kconv'
url = 'http://qiita.com/search?q=ruby'
charset = nil
html = open(url,:allow_redirections => :safe) do |f|
charset = f.charset
f.read
end
doc = Nokogiri::HTML.parse(html, nil, charset)
#p doc
doc.xpath('//h1[@class="searchResult_itemTitle"]').each do |node|
print(Kconv.tosjis(node.css('a').inner_text)<<"\n")
end
上記で実行すると以下のエラーが発生します.
http.rb:933:in `connect_nonblock': SSL_connect returned=1 errno=0 state=error: certificate verify failed (OpenSSL::SSL::SSLError)
これは,SSLの証明書エラーになっています.
ライブラリのcertifiedを入れると対応可能です.
そして,最終的なものがこちらです.
require 'open-uri'
require 'open_uri_redirections'
#require 'openssl'
require 'certified'
require 'nokogiri'
require 'kconv'
url = 'http://qiita.com/search?q=ruby'
charset = nil
html = open(url,:allow_redirections => :safe) do |f|
charset = f.charset
f.read
end
doc = Nokogiri::HTML.parse(html, nil, charset)
#p doc
doc.xpath('//h1[@class="searchResult_itemTitle"]').each do |node|
print(Kconv.tosjis(node.css('a').inner_text)<<"\n")
end
実行結果です.(qiitaからruby記事の検索を行い.タイトルを取得しています.利用価値ゼロ)
Ruby
Ruby
Ruby
Ruby
Ruby
ruby
【Ruby】Rubyにおける正しいshebangの書き方
【Ruby】Ruby入門:繰り返し処理
【Ruby】Ruby入門:クラスについて
RubyでRubyを描く
以上です.
スクレイピングで何か遊びたい.