読者です 読者をやめる 読者になる 読者になる

オモンパカリスト

深層学習、計算論的神経科学に興味あります

はてブAPIあるのにスクレイピングしてしまった

なんでだ

なんで公式API用意されてることぐらい
当たり前なのに、、
Hatena Developer Center

しかも見やすいからAPIドキュメント書くのに参考にしよう

こんな便利アイテムがあるのに関わらず
常識の範囲でスクレイピングを叩くことにする、、
作り始めたものはしゃーない、、他に応用できるようにしよう、、

require 'nokogiri'
require 'open-uri'

class Site
  def initialize(url: "", opt: {})
    @url = url
    @opt = opt
  end
  attr_reader :url, :opt

  def page_source
    @page_source ||= open(url, opt)
  end

  def output(formatter_klass)
    formatter_klass.new(self).format(parse)
  end
end

class HatenaBookmark < Site
  def parse
    doc = Nokogiri::HTML(page_source)
    nodesets = doc.xpath('//h3/a')
  end
end

class Formatter
  def initialize(site)
    @url = site.url
    @opt = site.opt
  end
  attr_reader :url, :opt
end

class SubjectLinkFormat < Formatter

  def format(nodesets)

    nodetimes = (0..19)
    subjects = nodetimes.map{|i| nodesets[i].text}
    links =  nodetimes.map{|i| nodesets[i].[]('href')}

    list = {}
    list = subjects.zip(links).map do |subject, link|
      {subject: subject, link: link}
    end

    list
  end
end


url = 'http://b.hatena.ne.jp/i101330/bookmark'
opt = {}
opt['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko)'

site = HatenaBookmark.new(url:url, opt:opt)
puts site.output(SubjectLinkFormat)

とりあえずこんなカンジ

f:id:i101330:20160326121557p:plain

GitHubにプッシュしていこうと思う(nokogiriブランチ)
kazukousen/RubyCrawler

リポジトリ名ミスった、、