- 1. 概要
- 2. モジュール
1. 概要
サイトのホームページから始まって、サイト内のコンテンツを最上位から収集するモジュールです。
リンクチェック時のものを加工しています。
2. モジュール
まだ手直しがあるかもしれませんが、こんな感じで・・・。
=begin
指定の URI を取得して、ドキュメント内のリンク先を抽出する
=end
require('pry')
require('open-uri')
require('nokogiri')
require('CheckChild')
require('ExceptLog')
class CheckParent < BaseClass
def initialize(original)
@check = CheckChild.new(original)
end
def execute(uri, tree, checked, contents)
begin
#puts("[#{self.class.name}.#{__method__}] uri=[#{uri}]")
tree.each do | key, value |
if (key == uri)
if (value != 'UNKNOWN')
return;
end
end
end
originalURI = uri
tree[originalURI] = 'CHECKING'
uri = URI.encode(uri)
uri = URI.parse(uri)
html = open(uri).read
html.sub!(/^<!DOCTYPE html(.*)$/, '<!DOCTYPE html>')
doc = Nokogiri::HTML(html) # Nokogiri でドキュメントを抽出
link = Hash.new
# ini ファイルで定義してある、タグ、クラス内の <a href="URI"> の URI の部分を取得
$parameter[:linkclass].each do | linkclass |
doc.css($parameter[:linktag]).css('.'+linkclass).each do | innerclass |
innerclass.css('a').each do | tag |
link[tag[:href]] = nil # <a href="URI"> の URI の部分を取得
end
end
end
link.delete(nil) # nil が湧いて出ることがあるので削除
# 下記のモジュールで doc を書き換えてしまうので上記の処理でデータを抽出した後でないと
# 下記のモジュールをコールしてはいけない
# Nokogiri で取得したドキュメントは clone できない
contents.get(originalURI, doc)
link = Hash[link.sort]
#binding.pry
tree[originalURI] = @check.execute(originalURI, doc, link, checked, contents)
#puts("[#{tree}]")
#binding.pry
# if (originalURI == "https://freebsd.sing.ne.jp/01/08.04/")
# exit 1
# end
return tree
rescue OpenURI::HTTPError => error
#puts(" 例外発生[#{error.class}]") # 呼び出し側でログを出力するのでここでは出力しない
#puts(" #{uri} 収集時にエラー")
return 'unknown'
rescue SocketError => error
puts(" 例外発生[#{error.class}]")
puts(" #{uri} 収集時にエラー")
rescue Errno::ECONNRESET => error
puts(" 例外発生[#{error.class}]")
puts(" #{uri} 収集時にエラー")
rescue Errno::ECONNREFUSED => error
puts(" 例外発生[#{error.class}]")
puts(" #{uri} 収集時にエラー")
rescue => error
exeptlog = ExceptLog.new
exeptlog.execute(self, error)
exit 1
end
end
end
後で流用するためにツリー構造のオブジェクトを上位に返すようにしました(2018年11月09日)。
|
|