【検証】 Pythonで旅行サイトをスクレイピング! 人気宿を分析した結果は?
今回の出演者
新卒ITエンジニア
金融系ITエンジニア
データサイエンティスト
ITサプリについて
この記事は動画『ITサプリ』で配信している内容をもとにテキスト配信しています。ITサプリは未経験からIT業界へ転職したい方に向けて情報配信をしているYouTubeチャンネルです。IT業界ではたらく上で役立つ知識を発信していますので動画でもお楽しみください。
しろ
今回は『Pythonでできることを実践してみた』というテーマで、データサイエンティストのしゅうさんをゲストにお招きしました。事前に分析いただいたクチコミを例に、PythonのWebスクレイピングについて説明・解説していただきたいと思います。
1.スクレイピングってどんな技術?
しろ
まず、スクレイピングとはどのような技術なのでしょうか?
しゅう
簡単に言うと「Webページから情報を抜き出す」という技術ですね。今回の場合では、宿・ホテルなどの予約サイトにある「クチコミ宿ランキング」というところから宿を選んで、データを取得・分析しました。取得したデータは30個ぐらいですね。
けい
「データを取ってくる」というところが、スクレイピング技術なのでしょうか?
しゅう
そうですね。「データを収集して、データセットを構築する」といったところに付随する技術が『スクレイピング』になります。
けい
なるほど。
2.スクレイピングしてみよう!
しゅう
今回やったことの概要を説明しますね。
まず、関東の「泊まって良かった宿」のクチコミランキングでは「旅館」「ホテル」「ペンション・民宿・ロッジ」という、3つのカテゴリに分かれていました。それぞれを1位から10位までの順位を出すために、クチコミを新しいものから順に200件ずつ取得。そこからいろいろな属性やタイトル、本文などを30宿分全部取得しまして、データセットを作ってクチコミの分析をした、という流れですね。
けい
実際動いているところが見たいですね。どういう風に選べますか?
しゅう
ドロップダウンで「どこの地域のどういう宿か」を選んで、ランキングも4種類あるのでその中から選んで、何件まで取得するかというところまで、全部指定できますよ。
けい
じゃあ、しろは地域どこがいいですか?
しろ
関東で、旅館かな。
しゅう
選択して取得を始めると、こんな感じになります。少し時間が掛かりますけど、この辺りからは速いですね。
けい
これで今、何分の何件と表示されているのが、全部取得したデータの量ですよね。こうやって取得する時というのは、テキストに起こして取得するような感じですか? それとも画像でパッと見て、そこから判別しているのでしょうか?
しゅう
テキストから取得していますね。イメージとしては「ページに飛びながらコピーして貼り付ける」という作業を自動化している感じに近いです。
3.スクレイピングにかかる時間
しろ
今回、それぞれに10件分ぐらい取ってくださるということですが、時間はどのぐらい掛かるのでしょうか?
しゅう
10宿分取るのは、大体8~10分ぐらいですね。
けい
1宿1分ぐらいでデータを全部取ってきてくれる感じですね。こうして見ても、やはり「人力でやるより断然速いな」というのが分かります。
4.コードを作った期間
しろ
コードを作るのに、どのぐらいの期間が掛かりましたか?
しゅう
ざっと作ったので、大体1日くらい、いや、5~6時間くらいですかね。
けい
結構ガッツリ書いていただいた感じですか?
しゅう
Webページの構造がしっかり整っていて書きやすくはあったのですが、単純な構造ではなかったですね。Webページの構造を把握して、それをコードに落としていく作業は5~6時間くらい掛かりました。そこからWebスクレイピングを行う時に、データが取れたり取れなかったり、というような状況がたくさん起こりましたね。
どういう状況かというと「そこに属性情報がない」とか「性別が匿名化されていて入っていない」といったものですね。そういったエラーは、1つずつに例外処理をして潰していきます。デバック作業でさらに半日くらい掛かったので、トータル8~9時間ぐらいだったと思います。
けい
大変な作業ですね。
5.スクレイピング結果を見てみよう!
しゅう
データが取れたものは、最終的にこういった表になります。
けい
前にゲストに来ていただいた際に『高級Excel』とおっしゃっていましたが、本当にこんな感じでババっと表示されるのですね。
しゅう
今だと「Googleスプレッドシート」を利用しても簡単にスクレイピングできますが、こういった複雑に入り組んだ構造をしているWebページの場合はデータが取れません。なので、その点でもPythonは強いと思います。
けい
ここまではPythonを使えばできますか? 難しいと思いますが……
しゅう
ここまではそんなに難しくない……
いえ、難しくないと言うと語弊がありますね。慣れが必要にはなりますが、慣れればきちんとできると思います。また「Pythonの腕試し」という感じで、スクレイピングに挑戦してみても面白いかもしれないですね。
けい
これは実用性もありますし、用途が分かると楽しそうですよね。
6.データサイエンティストとして重視している点
けい
データサイエンティストとして、どういった点を重視して分析されていますか?
しゅう
まずは、仮説を立てるところからかな、と思います。例えば、今回だと「宿ごとにクチコミの推している人が違うのでは?」という仮説から入って、人が違うから「クチコミを書いている性別の割合が違うのでは?」とか。年代別にした場合、若い人が多く訪れる宿であれば若い人のクチコミが多いでしょうし、そうでなければ年代はバラけるはずなので「性別・年代の割合が違うのでは?」とかですね。
あとは、クチコミで言っている内容が「宿ごと・ランキングごとに違うだろう」ということは想像できるので「クチコミが言っている内容も違うかもしれない」といったところも想像しながら、データを作っていますね。
7.分析してみよう!
しゅう
では、そろそろ結果を出しましょうか。宿のタイプごとに集計を変えていまして、こちらが旅館のグラフですね。旅館でクチコミをしている「性別割合の違い」みたいなものを出しています。
しゅう
ランキングなので、上から順に1位~10位です。
けい
半々のところもありますが、このグラフで目立つのは、女性客が明らかに多い宿があるということですね。
しゅう
そうですね。どうして圧倒的に女性が多いのかは、きっとクチコミを読まないと分からないと思います。
もしかしたら、クチコミの数が他と比べて少ないのかもしれないですね。
しろ
なるほど。
しゅう
次がホテルですね。ホテルは結構女性が多いようですね。
けい
そうですね。まあ、ビジネスホテルが入っている訳がない、とは思いますけども(笑)
結構高級ホテルも並んでいますね。
しろ
やはり、きれいなイメージがホテルにはあるから、女性の方が使いやすいのかもしれませんね。
しゅう
なんとなく、4~5位の辺りに高級ホテルがあった、ということだけ覚えておいてください。後程のデータで「ここ高級ホテルだったな」と思うようなところが出てくるので。
けい
後の伏線として、腑に落ちる部分があるということですね。
しろ
覚えておきます!
しゅう
最後がペンション・民宿・ロッジで、ここの結果は結構バラけた感じがありますね。
けい
確かに、グラフにすると目立つところがわかりやすいですね。男性のクチコミが2割切っているところもありますし。
しゅう
『ペンション・民宿・ロッジ』という中分類が3つ合わさっているカテゴリなので「ある程度バラけるだろうな」とは想像していました。ここの3つは旅館やホテルと比べても「スタッフが少ない」とか「そもそも接客がない」とか、少し違うところがあるはずですからね。この辺りも覚えておくと、後半のデータに出てきます。
では次、年代ごと見てみましょうか。まずは旅館から。
しゅう
「若い人が行きやすい宿と、そうではない宿があるのでは?」というお話をしましたよね。このグラフでは青が10代、赤が20代、緑が30代となっていて、緑までが30代なので、日本の平均年齢よりはある程度低いと思うので、分類としては「若者」ということで(笑)
けい
若いけど、結構お金を若いけど使ってくれる年代ってことですね。
しゅう
あとは、紫以降がミドルからシニア世代、と読み取ってもらえれば良いと思います。
けい
割烹旅館はもう、10代と20代のクチコミがないですね。
しゅう
高いからでしょうね……
では次に、ホテルの年代別グラフです。こちらもそれぞれに全然違う結果になっています。一部が少し特徴的でして、20代が多いところがありますね。
けい
10位の、浅草のホテルとか多いですね。
しゅう
この辺りのホテルは「若者が行きやすいのかな?」という感じですね。
8.口コミを解析してみよう!
しゅう
最後に、クチコミでどんなことを言っていたのか、というのを見ていきましょうか。
けい
ここが一番気になりますよね。どうやってこのピックアップをして、グラフになっているのか、というのも想像しづらいですし。
しゅう
『BERT』という、Googleの検索エンジンでも使われているような、自然言語処理のためのディープラーニングのモデルがありまして。日本語用の解析モデルもあって、これを使うとAIに日本語の文章の意味を理解させることができます。クチコミの分類は、AIが理解した意味に従って分類してみました。
しゅう
取得結果としては、クチコミを4つに分類できました。まずは「居心地の良さ・雰囲気」について言及しているものが1つ。次が「お料理・お食事関連が美味しかった」と言っているものが1つ。それから「もう1回来たい・他の人に薦めたい」とポジティブな感情のクチコミ群が1つ。最後に「スタッフや接客」について言及しているクチコミ群ですね。
下の3つのグラフが分類を表したものでして、1つ目が旅館、2つ目がホテル、3つ目がペンション・民宿・ロッジとなっています。緑色の部分が接客に関するクチコミで、ペンション・民宿・ロッジだと明らかに少ないのが分かりますね。
けい
確かに分かりやすいですね。旅館とホテルを比べて見ると「ホテルの接客はちゃんとしているな」というのが、より分かりやすいです。
しゅう
「接客してもらって高級感に浸りたい」っていう場合は、こういうホテルに行くと良い、とかも分かりますね。旅館の方だと結構「お料理」や「雰囲気」を重視されている方が多いようで、青と赤がほとんどを占める場合が多いですね。
接客の部分で3割ぐらいの人が「この接客が良い!」と言及されている旅館もありますが、ここはきっと、接客に相当熱を入れているのでしょう。その代わり、お食事のクチコミ率が低めなので、お食事よりも接客の方が印象に残った方が多いのかもしれませんね。
けい
分かりやすいですね。
しゅう
こういったデータから、自分が重視するところに合わせて旅館を選ぶ、ということができますね。
しろ
ちなみに、クチコミの中に料理のことと接客のこと、どちらも書かれていた場合は、両方ともスクレイピングすることは可能ですか?
しゅう
できますよ。クチコミの内容が、どちらかというと料理に対して強く言及していた場合は赤色に、同様に接客に対して強く言及していた場合は緑に入るかと思います。多分、紫色が多いところは「もう1回行きたい!」ということを強調して書かれていた方が多かったのでしょう。旅館がその傾向が強めで「ぜひもう1度!」という人が結構多いですね。逆に、ホテルは意外とそうでもない……
しろ
接客が良いってクチコミ、すごく多いのに。
けい
もしかしたら、ホテルの場合は「1回行ってみたい」というような人が多いのかもしれないですね。
しゅう
そうですね。特に、このマークした辺りはその傾向が強いかもしれません。
けい
先程おっしゃっていた「高級ホテル」は、やはり接客がすごく良いと。
しゅう
ペンション・民宿・ロッジの場合は、結構「リピートしたい」という方が多いですね。緑がゼロになっているところは、きっと「お料理が美味しかった」「雰囲気がすごく良かった」「もう1回行きたい!」といったクチコミを書いた方が多いのだと思います。
しゅう
こんな感じでクチコミを集めてきて、自分で分析をして自分で合った宿を見つけることができます。あと、これを応用すると、ご自身が「今まで行った宿のクチコミと、近いクチコミがたくさん投稿されている宿」とか「逆のこと・全然違うことのクチコミが多い宿」などについても分析が可能になります。
『クチコミの類似度』というものを算出することができるので、それを使って自分の行きたい宿を探すだとか、他の人にお勧めしたい宿を機械的に選定する、ことができますね。
9.スクレイピングの活用
しろ
スクレイピング技術が本当にすごいことは分かったのですが、普段の生活の中で、この技術が活用されることはあるのでしょうか?
しゅう
正直、普段の生活では無いと思いますが「Webページから情報を集めたい」といった場合には、必ず使う技術ではあります。
しろ
私は普段から使いたい(笑)
けい
目的があれば良いですよね。勉強のやる気にもつながりそうです。
10.勉強期間は?
けい
ちなみに、このレベルのコードはどれぐらい勉強すると書けるようになりますか?
しゅう
『スクレイピングの部分だけ』で答えても、Pythonの初級者には結構厳しいと思います。具体的な指針としては、クラスの概念をきちんと理解していて、オブジェクト指向のプログラムをある程度書けるぐらいの人。あと、HTMLやCSSが書けなくても読める、もしくは構造が分かるくらいの知識があれば可能だと思います。
学習期間でいうなら、半年から1年は必要だと思いますね。スクレイピングでは、作業中に「陥りがちなエラー」というのがあって、それが結構起きやすいので。
けい
一例をお聞きしても良いですか?
しゅう
例えばですね……
今回使用したコードは、例外処理がかなりの多さでした。この『try-except文』がいわゆる『try-catch文』で、要するに例外処理の部分ですね。『continue』と書いてある部分は全て例外処理をしている部分で、これが結構多くなっています。
けい
例外処理というのは「こうじゃなかった場合はこうする」というイメージで合っていますか?
しゅう
そうですね。そこでエラー入ったらプログラムが止まってしまうので、止めないために「こうだったらクチコミを取らない」などの処理をして、エラーを1つずつ潰していかないといけない。
けい
「if文的なもの」と認識すれば良いですか?
しゅう
基本的にif文です。「過去のクチコミがない場合」というのがあって、その場合は「クチコミを取らない」という処理に変えたりしますので。
けい
そこで終わらせてしまうと、永遠にそこで止まってしまいますからね。
しゅう
他にも、そもそもの「ランキングが非表示」という場合もあって、そこも除外する必要が出てくる時があります。出会った例外に対して、1つずつ処理を加えていかなくてはならないので、そういった地道なプログラミング力が必要ですね。
けい
結構な試行錯誤をして、問題をどうやって解決するのかを自分で考えながら作業しないといけない、ということですね。
しゅう
はい、ですので初級者だと結構キツいかな、と思います。「どうしてエラーを吐いたのかな?」というところが分からなくて「プログラムが最後まで書ききれない」ということが起こりやすいので。そういう意味でもある程度の経験がないと大変なので、学習期間が半年から1年くらい、ということですね。
けい
根気よく勉強する必要がある、と。
しゅう
勉強するだけでは実際に出会うエラーを処理できない、というのもよくあることですので。そこはもう、経験で埋めるしかないと思いますね。
まとめ
「Webページから情報を抜き出す」技術であるスクレイピングは、使いこなすためにはさまざまな段階があるようです。オブジェクト指向のプログラムがある程度かける必要もあるそうで、HTMLやCSSに関する知識も必要とのことでした。
学習期間の目安としては、半年から1年くらいとのことです。初級者では「どうしてエラーを起こしたのか」といったことが分からず「プログラムを最後まで書ききれない」ということが起こりやすくなるようです。また例外処理という、作業中に起きやすいエラーもあるそうで、その対処のためにも実務経験が必要とのお話でした。
必要なことを1つずつ、根気よく学んでいくことが重要といえそうですね。
未経験からでもITエンジニアになることは可能です。セラクでは未経験からでも約1.5か月の研修を通じて活躍しているエンジニアが多数在籍します。
少しでもご興味を持っていただけたら、ぜひ、セラクにご応募ください。まずは面談でのお話をすることも可能です。お気軽にご相談ください。