1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyでスクレイピング行う.(windows)

Posted at

#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を描く

以上です.
スクレイピングで何か遊びたい.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?