技術ブログ

Developers's blog

じゃらんの口コミをpythonでスクレイピングしてみた

2020.01.09 岩﨑 彩佳
利用事例 機械学習
じゃらんの口コミをpythonでスクレイピングしてみた

今回は「じゃらんの口コミをスクレイピングしてみた」ということで紹介していきます。
※この記事はスクレイピング初心者向けに書いています。

目次

 1はじめに
 2スクレイピング
 3可視化
 4分析・まとめ
 5注意すること
 6終わりに

はじめに

 皆さんは今年の冬をどのように過ごす予定でしょうか?
 今回は「冬」「雪」といえば「スキー」「温泉」ということで、この二つのキーワードに関連するホテル・旅館の口コミを分析しました。LINEトラベルのサイトによると、温泉が楽しめるスキー場1位は「山形蔵王温泉スキー場」のようです。
 このエリアの口コミ評価今現在第一位のホテルについてスクレイピングさせていただきました。

 今回は特定のホテルの口コミをスクレイピングし、どんな人が口コミを投稿し、どんな評価をつけているのかをグラフを表示しながら分析しました。

スクレイピング

 今回取得する情報

 ・性別
 ・年齢
 ・評価
 ・いつ宿泊したか
 ・誰と旅行したか
 ・価格帯

 この記事は初心者向けに書いていますので、コードを初めから紹介したいと思います。
 ここではスクレイピングからデータフレームを作るところまでを紹介しています。
 
 まずはじめに必要なものをインポートします。

 
from bs4 import BeautifulSoup import urllib
import pandas as pd 
import requests

 

取得したいホテル口コミページのURLを取得します。

html = requests.get('https://www.jalan.net/yad309590/kuchikomi/')
soup = BeautifulSoup(html.content,'html.parser')

このホテルの口コミページは3ページあったので、それぞれのURLをリストに入れておきます。

 url_list = ['https://www.jalan.net/yad309590/kuchikomi/?screenId=UWW3701&idx=0&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
'https://www.jalan.net/yad309590/kuchikomi/2.HTML?screenId=UWW3701&idx=30&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01',
'https://www.jalan.net/yad309590/kuchikomi/3.HTML?screenId=UWW3701&idx=60&smlCd=060203&dateUndecided=1&yadNo=309590&distCd=01']

ここから本題に入っていきます。
まず、口コミ投稿者の性別と年代を取得し、綺麗な形にします。

valuer = []
    for row in url_list:
row = str(row) html = urllib.request.urlopen(row) soup = BeautifulSoup(html) valuer.append(soup.find_all("span", class_='jlnpc-kuchikomi__cassette__user__name')) continue valuer_list = valuer[0]+valuer[1]+valuer[2] new_valuer_list = [] for row in valuer_list: row = str(row) new_valuer_list.append(row.split('(')1.split(')')0)

このようになります。


スクリーンショット 2019-12-27 15.22.27.png

性別・年代をそれぞれデータフレームに入れます。


data = pd.DataFrame()
sex = []  
age = []  
for row in new_valuer_list:
  row = str(row)
  sex.append(row.split(' / ')[0])
  age.append(row.split(' / ')[1])
 new_age = []
 for row in age:
   row = str(row)
   new_age.append(row.replace("代","'s")) 
 data['sex'] = sex
 data['age'] = new_age

スクリーンショット 2019-12-27 15.33.04.png

次に、口コミ評価を取得します。


value = []
for row in url_list:
    row = str(row)
    html = urllib.request.urlopen(row)
    soup = BeautifulSoup(html)
    value.append(soup.find_all("span", class_='jlnpc-kuchikomi__cassette__rating__em'))
    continue
value = value[0]+value[1]+value[2]
new_value = []
for row in value:
    row = str(row)
    new_value.append(row.split('')[1].split('')[0])
data['value'] = new_value

最後に、いつ・誰と・どのくらいの価格帯で利用したのか取得します。


what = []
 for row in url_list:
 row = str(row)
 html = urllib.request.urlopen(row)
 soup = BeautifulSoup(html)
 what.append(soup.find_all("div", class_='jlnpc-kuchikomi__cassette__attribute1 styleguide-scope'))
 continue
 
 what = what0+what1+what2
 
 new_what = []
 for row in what:
 row = str(row)
 new_what.append(row.split('')1.split('')0)
 
 date = []
 trip = []
 for row in new_what:
 row = str(row)
 date.append(row.split('【')1.split('宿泊')0)
 trip.append(row.split('\xa0\xa0')1.split('】')0)
 
 data['date'] = date
 data['trip'] = trip

 price = []
 for row in what:
 row = str(row)
  price.append(row.split('【宿泊価格帯】')1.split('(大人1人あたり/税込)')0)

 data['price'] = price

データフレームが完成しました。


スクリーンショット 2019-12-27 15.52.35.png

可視化

ここでは先ほどスクレイピングした口コミ投稿者のデータについて可視化し、簡単に考察します。
まずはじめに、取得したデータについて簡単に見ていきましょう。


性別

スクリーンショット 2019-12-27 16.09.00.png

年代


スクリーンショット 2019-12-27 16.18.32.png

口コミ評価


スクリーンショット 2019-12-27 16.27.10.png

いつ利用したか


スクリーンショット 2019-12-27 16.30.44.png

誰と利用したか


スクリーンショット 2019-12-27 16.34.27.png

価格帯


スクリーンショット 2019-12-27 17.35.14.png

分析・まとめ

データからわかること
・口コミ投稿者は50代が一番多く、60代、40代と続く。
若い層(20代、30代)よりも多いのは、お金に余裕があるからなのか、あるいは温泉地ということが関係しているのか。
  ・今回「スキー」と「温泉」というキーワードで探したが、2019年8月の投稿が多い。夏でも人気のある観光地なのかもしれない。
・大人1人あたり1万円を超え、高いものは3万円を超えるものもあることがわかる。夫婦旅行が多いことにも関係していそう。


 

仮説:蔵王には、お金に比較的余裕があり、子育ても終わった50代の夫婦が旅行に来ることが多いのでしょうか。8月に口コミが多かったのも、冬に体力の必要なスキーを楽しむのではなく、ゆったりと自然を感じたいという人が多いのかもしれません。もしかすると、今回、「スキー」「温泉」で蔵王が出てきたのは、スキーで有名という理由だけではなく、体力のある若い世代に冬の時期に多く来て欲しいという地域の狙いがあるのかもしれません。


今回取得した口コミの数は74件と少なく、取得したデータの種類も少ないため、事実に対して理由を断定することはできません。しかし、だからこそ上記の仮説のように想像を膨らませ、いろいろなことに思いを巡らせることができるのかもしれませんね。


注意すること

口コミを分析する際にはいくつか気をつけなければいけないことがあります。
・口コミ分析は、宿泊者全員について分析できるというわけではなく、あくまで「口コミをした人」のみに対する分析となります。もしかしたら、男性よりも女性の方が口コミをするのが好きかもしれないし、年齢層が高めの人より若い人の方が口コミを投稿するということもあり得ます(その逆も然り)。
 口コミを分析している時点で情報を限定してしまっているということに気をつける必要があります。
・上と似ているのですが、口コミを投稿する人はどんな人かを考える必要があります。
 口コミを通して伝えたい!という人はどんな人でしょうか?宿泊にとても満足してお礼を伝えたい、良さを伝えたいという人や、何か不満があって意見を言いたい、改善策を伝えたいという人が想定されます(不満だった人は関わりたくないから口コミを投稿しないということも考えられます)。可もなく不可もなく感じている人は、口コミ投稿するのが好きという人を除き、わざわざ口コミを投稿するでしょうか?
・口コミは利用した人の感想ですから、主観が入り、その情報が正確かを確かめることは難しいでしょう。もしかしたら嘘をついている人や誇張して書いている人、あるいはサクラがいるという可能性も0ではありません。完全ではないということを意識する必要があります。
・今回は、口コミ評価が高評価に著しく偏っているため、どんな人が高評価・低評価をするのか明らかにすることはできませんでした。「口コミ評価が高評価に著しく偏っている」のは、このホテルに限ることなのか、もしくはエリア全体、口コミ全体でそういう傾向があるのかを明らかにすると、今後の口コミ分析の役に立つかもしれません。

終わりに

今回は特定のホテルの口コミをスクレイピングし、投稿者についての分析を行いました。
 次回は、今回のスクレイピングの手法を活かして、どこかの「エリア」のホテル・旅館についてスクレイピングし、そのホテル・旅館ごとの傾向や、どんな人がそのホテル・旅館に向いているかなどを考察していこうと思います。
 後々、機械学習を用いて、旅行しようと思っている人に最適なホテルをオススメできる機能を作りたいと考えています。


お問い合わせはこちらから