【제2회】Ruby+Selenium을 사용해 스크래핑 해 본다
@cosme의 제품 리뷰를 스크래핑 해보십시오.
제1회의 전치가 길어져 버렸습니다만, 이번부터 코딩해 가고 싶습니다.
가정 사양
1. 제품 ID가 들어 있는 URL을 받는다
2. 상기에서 지정한 상품의 각 리뷰 페이지에 설치되어 있는 「계속을 읽는다」링크를 밟아, 전체 텍스트 리뷰 페이지로 천이
3. 리뷰 전문을 취득한다
4.동 페이지에 있는 「다음」링크를 밟아, 다음의 리뷰 전문 페이지로 날아간다
5.3&4를 임의로 지정한 리뷰 취득 건수분 반복
6. 완료되면 크롬을 닫습니다.
이런 느낌의 사양을 할 수 있으면 좋겠습니다. Selenium을 사용하는 것으로, 「4.동 페이지에 있는 「다음」링크를 밟아, 다음의 리뷰 전문 페이지로 날아간다」라고 하는 사양을 할 수 있는 것이 정말로 큰군요. 이것이라면 각 리뷰 ID를 지정할 필요도 없기 때문에 100건이나 1000건이라도 손쉽게 취득할 수 있게 됩니다.
Let's ruby
이번에 사용하는 라이브러리는 이런 느낌입니다.
#自動ブラウジング
require 'selenium-webdriver'
#HTMLをパースする
require 'nokogiri'
#指定したURLを開く&レビュー本文を取得
require 'open-uri'
#既存のxlsxフォーマットの書き込み
require 'rubyXL'
nokogiri
및 open-uri
스크래핑에 거의 필수 라이브러리.이번은 xlsx 파일에의 「기입」만(읽어들이지는 않는다)이므로
rubyXL
를 사용합니다.Selenium 시작 및 전체 텍스트 리뷰 페이지로 전환
#Seleniumを立てる(今回はchromeを使います)
driver = Selenium::WebDriver.for :chrome
#商品ページのURLを変数input_urlで受け取る
input_url = "https://www.cosme.net/product/product_id/10163439/top"
#input_urlで受け取ったページに移動する
driver.navigate.to("#{input_url}")
#「続きを読む」リンクを踏み、全文レビューページに遷移する
driver.find_element(:partial_link_text,'続きを読む').click
#カウンター(後のwhile文で使います)
count = 0
#取得レビュー件数を変数limitで受け取る
limit = 50
#商品名を変数nameで受け取る(任意の商品名を設定する。出力するxlsxのファイル名になります。)
name = "ほげほげ"
#変数reviewsの空配列を置いておく(取得した各レビューは、変数reviewsの配列の要素として代入されます。)
reviews = []
·
driver = Selenium::WebDriver.for :chrome
이번에는 크롬으로하고 싶습니다. firefox, IE, Safari 등에도 대응하고 있는 것 같습니다.·
limit = 50
검색 리뷰 수는 여기에 지정됩니다. 이번은 while 구문을 사용한 반복 처리를 실시합니다만, 그 반복의 횟수=limit의 값이 됩니다.·
reviews = []
얻은 각 리뷰는 배열의 요소로 reviews에 추가할 수 있습니다.while 문에 의한 반복 처리
while count < limit.to_i
#現在のページのURLを変数current_urlで取得
current_url = driver.current_url
#UTF-8に変換(@cosmeの文字コードはShift_JISなので)
doc = Nokogiri::HTML.parse(open(current_url, "r:Shift_JIS:UTF-8").read)
#レビューを指定&本文のみを変数nに代入
n = doc.css("p.read").text
#変数reviewsに配列要素としてnを代入する
reviews << n
#カウンターを追加
count+=1
#Dos対策(次のレビューページに遷移するまで1秒以上空ける)
sleep 1
#ページ内の「次へ」を選択&ページ遷移
driver.find_element(:partial_link_text,'次へ').click
end
·
while count < limit.to_i
이번에는 while 문을 사용해 보았습니다. 구문내에 카운터를 설치해 일주 마다 count+=1
가 되도록(듯이) 하고 있습니다. limit로 지정한 취득 리뷰 건수를 웃돌 때까지 반복 처리를 실행한다, 하는 구조입니다.·
doc = Nokogiri::HTML.parse(open(current_url, "r:Shift_JIS:UTF-8").read)
얼마나 잘 보면 @cosme 은 Shift-JIS였던 것이 판명. UTF-8로 변환합니다.<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">
·
sleep 1
다음 HTTP 요청까지 1초 이상 사용할 수 있습니다.얻은 리뷰를 EXCEL에 씁니다.
#フォーマットのxlsxを選択
workbook = RubyXL::Parser.parse("@cosme_format.xlsx")
#シートを指定&シート名を変更
worksheet_a = workbook[0]
worksheet_a.sheet_name ="@cosmeレビュー収集"
#指定したセルに各レビューを書き出す
p = 1
reviews.each do |re|
worksheet_a.add_cell(p,2,"#{re}")
p+=1
end
#書き込みが完了したらブラウザを終了する
driver.quit
#保存する(序盤で任意で設定したnameの値がここに代入されます。)
workbook.write("@cosmeレビュー収集結果_#{name}.xlsx")
·
workbook = RubyXL::Parser.parse("@cosme_format.xlsx")
엑셀을 조작할 수 있는 ruby의 라이브러리는 여러가지 있습니다만, 이번은 읽기는 하지 않고 기입만이므로 rubyXL
를 사용해 보았습니다.출력 예
모자이크 걸었습니다만 이런 느낌입니다.
요약
· sleep 1
로 다음의 리퀘스트까지 1초 열려 있지만, 너무 방대한 양을 계속해 리퀘스트하는 것은 그다지 좋지 않으므로, 사용에는 충분히 주의한다. 장시간 연속해서 돌리지 않는 것.
· 특수 이모티콘? 등이 리뷰 본문에 포함되어 있는 경우, 에러가 일어나 처리가 멈추어 버리므로 예외 처리를 이용하여 멈추지 않게 한다.
Reference
이 문제에 관하여(【제2회】Ruby+Selenium을 사용해 스크래핑 해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/sasaken33/items/9f07b8ff677bf49fa2ba
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【제2회】Ruby+Selenium을 사용해 스크래핑 해 본다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/sasaken33/items/9f07b8ff677bf49fa2ba텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)