야후옥 등의 EC 사이트에서 스크래핑 (ruby + Nokogiri)
랜서즈 등 자주 보는 야후옥, 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월) 이 코드를 실행해 보면, 현재 가격의 취득이 이상해지고 있었습니다.
아마 야후옥측의 사양 변경이라고 생각됩니다.
그 중 수정합니다.
Reference
이 문제에 관하여(야후옥 등의 EC 사이트에서 스크래핑 (ruby + Nokogiri)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/at_sushi/items/886f8d722193343f2873텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)