rubyで該当URLが生きているかどうかをチェックした時のメモ

Webサービス集めましたというサービスで、投稿記事のURLが生きているかを調べるということをしました。

rubyを用いて、open-uriなどを読み込んで、結果をテキストで出力。10とか20くらいのサイト数なら手でやればいいのですが、200とかになるとさすがにダルイので作ってみました。

自分のメモがてらに書いておきます。ソースコードはさすがに恥ずかしいのでありませんm(_ _)m

スクレイピングとかrubyを使ったものは色々と先達の知恵があるのでそちらにおまかせです。

スクレイピングなのでnokogiri環境を構築

別PCなどではnokogoriとrubyとgemなどのバージョンが合わなかったりと色々苦労した覚えがあります。とはいえ、がんばって突っ込んでいくしかありません。

今回はnokogiriを駆使とかはなくて、単にtitleタグ(ページタイトル名称)を取ってくるくらいです。

バージョンメモ

Nokogiri 1.8.1

gem 2.7.0

ruby 2.2.2p95(古めなのはNokogiri対応のためだったはず、新しいので動けばいいですけどね)

他にも大事なのがあったっぽいけどその時追加で。

プログラムの概要

対象:自分の運営サイトであるWebサービス集めました

記事:242記事が対象

目的:生きているURLを調べる(リンク切れでなく、そもそもつながるか、内容があるかどうかなど)

ディレイ:1秒の遅延をループ毎にかます

結果出力:テキストファイルに1サイトで結果、エラーの有無などを記録する。その後、Excelで貼り付け解析

結果分析

ここではあまり使えませんが、運営サイト側で公開してみようと思います。

242記事中、23サイトで何らかのエラー。例えばホスト不明など。

タイトル取得できなかったもの3サイト。原因は不明。1つはノーコンテンツ。

この23サイト+1サイトを検証すれば、大体サービスがどれくらい生きているかの割合がわかりますよねって感じです。

つまづいたメモ

色々つまづくポイントがありますが、今回は以下などにはまりました。

  • URLをオープンする際にredirection forbiddenなどと出てきてつながらない。→Ruby On Railsで出た”redirection forbidden”について調べてみたを参考にして、require ‘open_uri_redirections’をヘッダに追加して、 open(url, :allow_redirections => :all)のような記述でクリア
  • テキストファイル1行ごとにURLがあり、それらを一個ずつ読んで処理していく作り。readlinesメソッドを使うと改行が入ってきているのか、2行目でエラーっていた(splitなんとかと言われる)。前は動いたような気がするので動きが変わってるんですかね。→ [Ruby]IO#readlinesで作られた配列の要素には改行が含まれる (2011-03-21)を参考にして、取得した各配列変数に対してchompをかまして改行を削除して対応。
  • 途中で例外処理もせずにやっていたため、存在しないホストなどで止まっていた。例外処理を追加して、その例外エラーをテキストに追加。この時、エンコーディングがUTF-8とアスキー8ビット?で混在するというエラーも発生。→強引に例外メッセージを.toutf8としてコンバート。とはいえ文字化けしてしまうのもあるため、不完全感はあり。ただどのURLがエラったかは分かるようになったのでオッケーとする。
  • SSLのhttpsサイトなどはrequire ‘openssl’などで対応していかないといけないはず。これは前解決していたので単なるメモ

おわりに

車輪の再発明かなーと思ったのは、実はGASなどですでにURLからタイトルタグを取るコードがありました(笑)早速やってみると、ほぼ同じ感じで取れました。ただアクセスの状況なのか、いくつかはエラーで取得できなかった(複数同時取得は辛そうです)りしたので、うーんって感じですね。まあ、rubyを使った練習にもなりましたし、これはこれでオッケーと。

逆に手軽にやるなら、GASを使えば楽そうですね。ちなみに、GASでのコードはこんな感じです。セル欄に式として=URLtoTitle(A1)いれれば、A1にURLを入れればタイトルが取得出来ます。便利ですね。

// URLからタイトルを取得する
function URLtoTitle(url) {
  var response = UrlFetchApp.fetch(url);

  var myRegexp = /<title>([\s\S]*?)<\/title>/i;
  var match = myRegexp.exec(response.getContentText());
  var title = match[1];

  title = title.replace(/(^\s+)|(\s+$)/g, "");
  return(title);
}

 

今回の結果自体の解析はもう少ししっかりやって、運営サービスブログで発表していきたいと思います。

筆者プロフィール

シゴトクリエイター 大橋 弘宜
シゴトクリエイター 大橋 弘宜
「シゴクリ」運営者。アイデアの力でお客様に貢献するゼロイチ大好きアイデアマン。ビジネスアイデア相談実績等は200超を超える。好きな言葉は三方良し。詳しい自己紹介仕事実績も合わせてご覧ください。お仕事メニューお問い合わせはお気軽にどうぞ。