4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Rubyスクレイピングで超絶楽をする(店舗情報編)

Posted at

以前、アサインされた案件で静的サイトを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スクレイピングが出来ます。
スクレイピングする際の注意点として、スクレイピング先のサーバーに負荷をかけてしまうので、なるべく最小限の回数にしましょう。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?