Rubyでスクレーピング(mechanizeとhpricot)
以前にPerlでクロールするプログラムを作ったので、勉強がてら今回はRubyで作成してみました。ただ今回はかなり、てこずりました。文字コード?のところではまってしまい作るのにまるまる1日かかりました。まずは出来上がったコード。
【事前準備】
$ gem install hpricot $ gem install mechanize
【ソースコード】
#!/usr/bin/ruby -Ks
require 'hpricot'
require 'mechanize'
require 'kconv'
require 'jcode'
$KCODE = 's'
# 初期設定
@user_agent = 'Mac Safari'
@wait_time = 5
@url = 'taget_url'
def http_connect(url, keyword)
puts url if $DEBUG
@page = nil;@price = nil;@content = ""
begin
@agent = WWW::Mechanize.new
@agent.user_agent_alias = @user_agent
@page = @agent.get(url)
rescue
puts "#{keyword}#{@drim}CONNECTION ERROR"
return
end
link = @page.links.with.href(%r{http://target_url/\w+?/}).last
puts link.href if $DEBUG
if(link == nil || link.href.empty?)
puts "#{keyword}#{@drim}LINKERROR"
return
end
@page = @agent.click(link)
doc = @page.root
@name = (doc/"span.item_name").inner_html.tosjis
(doc/"span.item").each {|item|
item_str = item.inner_html.tosjis
item_str.scan(/(.*?)<\/div>(.*?)<\/div>/){|title, content|
@content += ":#{title}:#{content}" # if $DEBUG
}
item_str.scan(/([\d+] 円)/){|price|
@price = price
}
puts "#{keyword}#{@drim}#{@price}#{@drim}#{@name}#{@drim}#{@content}#{@drim}#{link.href}"
}
end
def generate_url
puts ARGV[0] if $DEBUG
File.open(ARGV[0]){|f|
f.each{|line|
keyword = line.chomp!
puts keyword if $DEBUG
target="#{@targeturl}?keyword=#{keyword}"
http_connect(target, keyword)
sleep @wait_time
}
}
end
puts @header
generate_url
ECショップの検索結果から商品情報を取得することを想定しているのですが、どうもカタカナの「ッ」が全て文字化けしてしまう。kconvではなくnkf、iconvを使っても結果はおなじ。解決方法としては以下1行を挿入するだけで文字化けはおきなくなりました。
require 'jcode'
原因はまだ調べているところですが、以下サイトをきちんと理解できればわかると思います。はぁー、大分はまってしまった。
【参考サイト】
トラックバック(0)
このブログ記事に対するトラックバックURL(トラックバックは承認後に公開されます)


コメントする