【第1回】Ruby + Seleniumを使ってスクレイピングしてみる


@cosmeの商品レビューをスクレイピングしてみる

ゴール

@cosmeの各商品のレビューを自動収集し.xlsxに書き出す。
(余力があれば各レビューの品詞解析&ポジネガ判別もできればよいかも)

条件

Ruby 2.4.6
Ruby on Rails 5.2.6
Windows環境

なぜSeleniumを使うのか

これは@cosmeのページ構成が大きな理由です。他のECサイト(Amazon)と@cosmeのHTMLを比較してみます。

Amazon

Amazonでは1ページに最大10レビューが表示される仕組みになっています。
各レビューは全文が<span class>に入っているので、スクレイピングの際はこのクラスを指定すれば、レビュー本文だけをを丸ごと抜き出すことができます。(LOHACOも同様の仕組みです。)

@cosme

@cosmeの商品レビューは、同一URLに全文が表示されません。
各レビューの最後にある「続きを読む」リンクを踏むと、そのレビュー全文ページに遷移します。(言うまでもなく、URLも変わります。)
なので、@cosmeの商品レビューのスクレイピングをする時には、
①スクレイピングする商品レビューページの「続きを読む」のリンク先に遷移
②レビュー全文をスクレイピングする
のフローを経る必要があります。

まとめますと、もし100件のレビューを取得するとしたら、
・Amazon
 1ページ(1URL)10レビュー × 10ページ分
@cosme
 1ページ(1URL)1レビュー × 100ページ分   のスクレイピングが必要になるわけです。大変ですねこれは・・・。

加えて、AmazonであればレビューページのURLに規則性があるので、
例:1ページ目 amazon.co.jp/商品名/商品IDとか/review/page=1
  2ページ目 amazon.co.jp/商品名/商品IDとか/review/page=2
とまあこんな感じに規則性があるので、もし8ページ分取りたければ1ページごとに最後のページ数に+1してやるだけで済みます。(page=8になったら終了する)

しかし@cosmeの全文レビューページURLには規則性が何もありません。レビューごとに固有のreview_idなるものが割り当てられているので、これを直接指定しないことにはどうにもこうにもならないってことらしいです。
例:全文レビューページのURL 
  cosme.net/product/product_id/商品ID/review/レビューID(アットランダムな整数9桁)

はいこれは困りますね・・・100件分のレビューIDなんて知らんし打ち込むのめんどくさいしなんかいい方法ないかなーと困っていたところ思いついたのが「Selenium」ってわけです。(前置き長くてすみません笑笑)

Seleniumでできること 

ひとことで言えば「自動でブラウジング」ができます。今回のケースだと、ブラウザ起動して、ECサイトに飛んで、商品名入力して、検索一覧から商品選択して、レビューページ飛んで、「続きを読む」クリックして、、、、、、、とかいうのをぜーんぶ自動でやってくれます。賢いですね。(×100回)
他にも、テキストボックスに自動入力したり、スクショとったり、けっこう色々できちゃいます。
https://www.seleniumqref.com/index.html 
(↑↑有志による??リファレンスがあったのでこちらに載せさせて頂きます。)

想定仕様

・任意の商品URL&取得レビュー件数を指定
・xlsxのフォーマットをあらかじめ用意し、取得したレビューを上書きする

長くなったので、第二回に続けます。
https://qiita.com/sasaken33/items/9f07b8ff677bf49fa2ba