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

Mae向きなブログ

Mae向きな日記のブログ版。ようやくこちらに移行してきました。

WWW::Mechanizeを使ってみました

Ruby Arduino

id:koki-hさんの「Rubyist九州7月定例会での発表内容」は,2つの意味で興味深いものでした。
ひとつは,Rubyを題材にしているということ。もうひとつは,フィジカルコンピューティングを扱っていることです。恥ずかしながら掲載されているスライドでフィジカルコンピューティングという言葉を初めて知ったのですが,現在,制御という学科名がつく学校で働いていることから非常に興味を持ちました。
まず,手始めに「Arduinoで何でも制御」の連載を始めから読んでみたいのですが,第1回を読んだあと,第2回を探すのが大変です。ということで,自分でまとめサイトを作ってみました。id:koki-hさんのモノマネです(^^)。

fetch_link.rb

エレキジャックのサイトを「Arduinoで何でも制御 連載」で検索し,検索結果のURLから記事を昇順にソートしています。連載(9)が順番を乱していますが,そのままにしています。

# -*- coding: utf-8 -*-
require 'rubygems'
require 'mechanize'
require 'cgi'

Url = "http://search.cqpub.co.jp/cgi-bin/searchej.cgi?q="
Search_word = "Arduinoで何でも制御 連載"

AStruct = Struct.new(:title, :url)
$arduino_links = Hash.new

def fetch_link(page)
  page.search('a.doc_title').each do |elem|
    if /\A連載[(|(].*?[)|)]Arduino/ =~ elem.inner_text 
      if /(20\d\d)\/(\d\d)\/(\d*)/ =~ elem['href']
        date = sprintf("%04d%02d%02d", $1.to_i, $2.to_i, $3.to_i)
        while $arduino_links[date] # dateが重なったときの処理(手抜きです!)
          date = date.to_i + 1  
          date.to_s
        end
        $arduino_links[date] = AStruct.new(elem.inner_text, elem['href'])
      end
    end
  end
end

# Main.
agent = WWW::Mechanize.new
page = agent.get(Url + CGI.escape(Search_word) + "&o=")

fetch_link(page)

# 複数ページの処理
pages = page.links_with(:href => /searchej.cgi.*?pagenum=\d+?/)
pages.delete_if { |elem| elem.text == "NEXT"}
pages = pages[0...(pages.size/2)] 

pages.each do |ele|
  page = ele.click
  fetch_link(page)
end

$arduino_links.sort_by { |key, value| key.to_i}.each do |key ,value|
  puts "- <a href=\"#{value.url}\">" + value.title + "</a>\n"
end

fetch_link.rbを実行したものが,以下です。