【제2회】Ruby+Selenium을 사용해 스크래핑 해 본다

8723 단어 셀레늄루비Rails

@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'
nokogiriopen-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초 열려 있지만, 너무 방대한 양을 계속해 리퀘스트하는 것은 그다지 좋지 않으므로, 사용에는 충분히 주의한다. 장시간 연속해서 돌리지 않는 것.
· 특수 이모티콘? 등이 리뷰 본문에 포함되어 있는 경우, 에러가 일어나 처리가 멈추어 버리므로 예외 처리를 이용하여 멈추지 않게 한다.

좋은 웹페이지 즐겨찾기