はじめに
Ruby(Rails)でWebスクレイピングをしたとき
URLが404 Not Foundになり指定したURLのリソースが見つからず、以下のエラーを出力して止まってしまって困りました。
OpenURI::HTTPError
今回はこのエラーハンドリングの話をします。
ちなみに、Webスクレイピングで用いたライブラリやGemは、OpenURI
とNokogiri
です。
用語の説明
OpenURI
- httpやftpを通じてネットワーク上のリソースを取得することができます。こちらはRuby標準のライブラリです
- こちらだけでもスクレイピングは行えます
Nokogiri
- こちらも、Webスクレイピングをサポートしてくれるやつです。こちらは、HTMLの情報を全て取得したい場合に楽に扱えます
- 特定のDOMを取得する際の 僕はよく使う
search
など、スクレイピングをする上でひつようなメソッドがたくさんあるので、よく用いています
現象
ざっくり、以下のようなコード書いていたら
require 'open-uri'
require 'nokogiri'
url = 'https://www.test.jp/'
# open-uriでurlにアクセスしてhtmlを取得し、Nokogiriでパースする
doc = Nokogiri::HTML(open(url), nil, 'utf-8')
特定のページで404が発生し、エラーが発生し、それ以上スクレイピングできなくなりました。
対策
困るので、エラーハンドリングしつつ、スクレイピングを続けられるようにしましょう。
require 'open-uri'
require 'nokogiri'
url = 'https://www.test.jp/'
begin
# open-uriでurlにアクセスしてhtmlを取得し、Nokogiriでパースする
doc = Nokogiri::HTML(open(url), nil, 'utf-8')
rescue OpenURI::HTTPError => e
# 例外処理
end
これでハンドリングできました。
さいごに
当たり前ですが、このスクリプトを間髪を入れずに連続して実行すると対象となるサーバへ連続的にアクセスが行われてしまうので絶対にしないようにしてください。
本日は、以上です。
アウトプット100本ノック実施中