야후옥 등의 EC 사이트에서 스크래핑 (ruby + Nokogiri)

※2019년 9월 시점의 xpath이므로 야후옥측의 변경의 보다 취득할 수 없게 될지도 모릅니다.

랜서즈 등 자주 보는 야후옥, amazon 등의 EC 사이트에서 간단한 데이터 수집 작업.
프로그래밍을 사용하면 상당히 쉽게 할 수 있습니다.
이른바 스크래핑이라는 기술이군요.

이번에는 언어는 ruby, 스크래핑 라이브러리로 Nokogiri를 사용하고,
야후 옥의 상품 페이지 제목, 이미지 URL, 가격 등의 데이터를 가져와 CSV로 출력합니다.

전제 조건



루비가 설치되었습니다.

준비



우선 Nokogiri gem을 설치.
$ gem install nokogiri
Building native extensions. This could take a while...
Successfully installed nokogiri-1.10.4
Parsing documentation for nokogiri-1.10.4
Done installing documentation for nokogiri after 1 seconds
1 gem installed

다음으로 csv gem 설치
$ gem install csv
Successfully installed csv-3.1.1
Parsing documentation for csv-3.1.1
Done installing documentation for csv after 0 seconds
1 gem installed


준비 완료!

루비 스크립트 만들기


require 'nokogiri'
require 'open-uri'
require 'csv'

 #取得したいURLを配列に格納する
urls = %w(
  https://page.auctions.yahoo.co.jp/jp/auction/r349735904
  https://page.auctions.yahoo.co.jp/jp/auction/v661258739
  https://page.auctions.yahoo.co.jp/jp/auction/s688301927
  https://page.auctions.yahoo.co.jp/jp/auction/j555196435
  https://page.auctions.yahoo.co.jp/jp/auction/v643884399
)

#取得したい値のxpathを格納する
xpaths = [
 '//h1[@class="ProductTitle__text"]',                      #商品名
 '//dd[@class="Price__value"]/text()',                     #現在価格
 '//dt[contains(text(),"入札件数")]/following-sibling::dd[1]/text()', #入札件数
 '//dt[contains(text(),"残り時間") and @class="Count__title"]/following-sibling::dd[1]/text()', #残り日数
 '//ul[@class="ProductImage__images"]/li[1]/div/img/@src', #画像1枚目
 '//ul[@class="ProductImage__images"]/li[2]/div/img/@src', #画像2枚目
 '//ul[@class="ProductImage__images"]/li[3]/div/img/@src', #画像3枚目
 '//ul[@class="ProductImage__images"]/li[4]/div/img/@src', #画像4枚目
 '//ul[@class="ProductImage__images"]/li[5]/div/img/@src', #画像5枚目
]

values = []
hash = {}
#csvで出力する際のヘッダーを格納
hash[0] = %w(商品名 現在価格 入札件数 残り日数 画像1 画像2 画像3 画像4 画像5)

i = 1
charset = nil
urls.each do |url|
  html = open(url) do |f|
    charset = f.charset
    f.read
  end

  doc = Nokogiri::HTML.parse(html, nil, charset)
  xpaths.each do |xp|
    node = doc.xpath(xp)
    value = node.inner_text.delete("\n").delete("円")
    values.push(value)
  end
  hash[i] = values
  i += 1
  values = []
end

 CSV.open("yahuoku.csv", "w") do |csv|
   hash.count.times do |i|
   csv.add_row(hash[i])
  end
 end

출력 결과




※출력된 CSV 파일을 Google 스프레드시트에서 열고 있습니다.

반성



기능은 합니다만, 계산 속도나 가독성이라는 점에서는 개량의 여지가 꽤 있기 때문에 양해 바랍니다.
개선점 등 지적해 주시면 매우 도움이 됩니다.

참고 페이지



크롤러 작성에 필수! XPATH의 기법 요약 - Qiita
루비 + 노코기리로 스크래핑 - Qiita

보충



최근(2020/6월) 이 코드를 실행해 보면, 현재 가격의 취득이 이상해지고 있었습니다.
아마 야후옥측의 사양 변경이라고 생각됩니다.
그 중 수정합니다.

좋은 웹페이지 즐겨찾기