以前、アサインされた案件で静的サイトをWordPressにしてリニューアルする事がありました。
その際、特定ページの店舗情報の量がエグくて、店舗情報はDB管理されてない状態。。
数百件をひとつひとつコピペはダサいので、スクレイピングして全件取得した時のコードです。
特定のリンク先をスクレイピングして、その情報をCSVに出力。といった感じです。
色んなサイトを参考にしたので、色々間違えてるとこもあるかもしれません。
#スクレイピングで使用したソースコード
取得するのは、
- 店舗名
- 電話番号
- 郵便番号
- 住所
- 建物名
- グーグルマップのリンク先
- 店舗サイトのリンク先
になります。
require 'open-uri'
require 'nokogiri'
require 'csv'
url = 'http://www.sample.jp/' #スクレイピング先のURL
charset = nil
html = open(url) do |f|
charset = f.charset # 文字種別を取得
f.read # htmlを読み込んで変数htmlに渡す
end
ps = []
# htmlをパース(解析)してオブジェクトを生成
doc = Nokogiri::HTML(html, 'nil', 'utf-8')
doc.xpath('//div[contains(@class,"storebox")]').each do |node| #クラス名.storeboxの数
data = []
storename = node.css('div.storename').inner_text
storead = node.css('div.storead').inner_text
link = node.css('div.storemap>a')[0][:href]
if !node.css('.storeurl a').empty? #.storeurl aが空じゃなかったらhrefを取得
storeurl = node.css('.storeurl a').attribute("href").value
end
data.push(storename.tosjis)
data.push(storead.tosjis)
data.push(link)
data.push(storeurl)
ps.push(data)
end
# CSV出力と同時にターミナルにも内容を出力
test = CSV.open("sample.csv", "w") do |csv|
ps.each do |row|
csv << row
end
end
puts test
こんな感じで、Ruby分からないって人でもちょっと調べれば簡単にWEBスクレイピングが出来ます。
スクレイピングする際の注意点として、スクレイピング先のサーバーに負荷をかけてしまうので、なるべく最小限の回数にしましょう。