はじめに
大量のページのHTTPステータスコードを確認しなければいけないコトがありまして、
スプレッドシートやら、無料のWebサービスを利用したんですがイマイチちゃんとできなかったです。
スプレッドシートのスクリプト実装がよくわからなかった。
無料のサービスだと100件までしか確認できない、多すぎて途中でコケてしまうなどありました。
そのためRubyで実装したという経緯があります。
また自分が使用するかもしれないのでメモがてら記事書きます。
HTTPステータスがヨグワガンニャイ人は下記の記事を見てみてください。
httpステータスコード一覧 – 各コードの意味・影響・対処法を解説します
完成したソースコード
require 'csv'
require "net/http"
urls = []
CSV.foreach("urls.csv") do |row|
urls << row[0]
end
puts "#{urls.length}件のURLを確認します。しばらくお待ちください。"
CSV.open("http_status_result.csv", "w") do |file|
urls.each do |u|
uri = URI.parse(u)
response = Net::HTTP.get_response(uri)
file << [u, response.code]
sleep 2
end
end
puts "http_status_result.csvを作成しました。アプリを終了します。"
解説
1.csvを使用できるようにする
require 'csv'
を忘れずに記載します。
2.httpステータスコードを取得できるようにする
HTTPステータスコードを取得するためのrequire "net/http"
を記載します。
3.URLの書かれたCSVファイルを作成
URLのみが1レコードごとに書かれたcsvをご用意ください。
それを、rubyファイルと同階層に入れてください。
エクセルで見ると、こんな感じのやつです。
4.CSVからURLを呼び出して配列にする
urls = []
CSV.foreach("urls.csv") do |row|
urls << row[0]
end
上記の部分で、CSVデータを配列にしています。
CSV.foreach("urls.csv") do |row| ~ end
はeachに似ていて、
row
という変数に1レコード入れています。
それをurls << row[0]
で配列に入れています。
p row
で見てみるとこの時row
は、["https://www.yahoo.co.jp/"]
となっています。
配列に入れ直す際にrow[0]
として、1個目を取り出してから入れ直すことを忘れずに。(1敗)
5.CSVに書き込む準備
CSV.open("XXX.csv", "w") do |file|
~ここに処理~
end
上記の処理の部分に、CSVにどの情報を入れるかを書きます。
file << ele
とすると、csvに変数ele
の中身を書き込むコトができます。
6.URLのHTTPステータスコードを取得する
2.httpステータスコードを取得できるようにする
上記でrequire "net/http"
を記載しているので、
httpステータスコード取得するメソッドが使用できます。
uri = URI.parse("https://www.yahoo.co.jp/")
response = Net::HTTP.get_response(uri)
puts response.code
# => 200
uri = URI.parse("https://www.yahoo.co.jp/")
ここでURIを取得して変数に代入、
上記でHTTPステータスコードに読みにいける形状に整形してるような処理です。
それを、さらにresponse = Net::HTTP.get_response(uri)
してネットワーク状況を取得して、
response.code
でHTTPステータスコードが表示できます。
上記のURLが入る部分に、CSVから取り出したURLを入れてHTTPステータスコードを取得し、
response.code
で取得したHTTPステータスコードをCSVに書き込めば完了です。
あと少し!
7.URLとHTTPステータスコードをCSV書き込む
CSV.open("http_status_result.csv", "w") do |file|
urls.each do |u|
uri = URI.parse(u)
response = Net::HTTP.get_response(uri)
file << [u, response.code]
sleep 2
end
end
上記を細かく見ていきます。
まず、配列からURLを取り出して、処理をします。
その処理とは、
6.URLのHTTPステータスコードを取得する
で使用した、ステータスコードを取得した処理を入れます。
urls.each do |u|
uri = URI.parse(u)
response = Net::HTTP.get_response(uri)
end
そして、取得したHTTPステータスと、URLをセットにしてCSVの1レコードとして書き込みます。
file << [u, response.code]
の部分にてCSVに書き込んでいます。
u
はeachで取り出したURL、response.code
は取得したHTTPステータスコードです。
[u, response.code]
の中身を見ると
["https://www.yahoo.co.jp/", 200]
となっています。
これが、CSVで書き込まれると、下記のようなデータが作成されます。
rubyファイルと同階層に出来上がっているかと思います。
やっていることはスクレイピングのようなことなので、sleep 2
で負荷を軽減することを忘れずに!
こんな感じのエラーが出たら
Traceback (most recent call last):
7: from http_status.rb:12:in `<main>'
~~~~~~~~省略~~~~~~~~
/Users/okakaori/.rbenv/versions/2.5.1/lib/ruby/2.5.0/uri/rfc3986_parser.rb:21:in `split': URI must be ascii only "\uFEFFhttps://www.yahoo.co.jp/" (URI::InvalidURIError)
MACエクセルでcsvファイルを作ると、BOMという見えない文字が入ったcsvとなってしまうようで、
その見えない文字列の部分で、処理がコケてしまいます。
下記のサイトを参考にして、BOMを削除したCSVデータで再度実行してみてください。
おわりに
rubyでサクッと実装できたので、助かりましたが、
GASスプレッドシートのスクリプト覚えた方が良さそうだと思いました。
rubyだと、パソコンにrubyを実行できる環境がないといけないので、
みんなが使用できるスプレッドシートにそれを実装した方が、汎用性はたかそうだと思いました。
rubyで実装できても、他の実装方法の方が良いっていう勉強になるってなんか不思議な感覚ですね。