趣味の映画鑑賞のために、活動圏内の映画館の上映中の映画のタイトルやスケジュールなどをExcelかAccessで管理したいと思う今日この頃です。
本当はPythonなんかで、本格的にシステムを組みたいところですが、なんやかんやで重い腰が上がらないところです。
そんなこんなで、サクッとExcelのVBAなんかで、映画館のサイトをスクレイピングして、希望のリストを作って見よっかなって思い立ちました。
千里の道も一歩から。まずは、Excelでスクレイピングをするための一歩を踏み出すための靴を履く前の靴下をタンスから出した程度のところです。
ExcelとSeleniumBasicでスクレイピング?
で、今回ですが、映画館サイトに行って上映中の映画のタイトルを取得して、Excelで一覧表を作ろうってとこまでを、サクッとやっちゃおうって思っています。
そのために、SeleniumBasicを使えばいいってことで、やってみたら、想像以上に簡単だったので、備忘録も兼ねて、一連の流れをまとめてみました。
一応、ここにあるソースを貼り付ければ、シネプレックス小倉とユナイテッド・シネマなかま16の上映中の映画のタイトル一覧表のExcelシートが出来るはずです。
SeleniumBasicのインストール
まずは、SeleniumBasicをダウンロードするため下のページにアクセスしましょう。
このページの中程より下の部分に「Release page」って書いている部分がありますので、ここをクリックするとGitHubに飛ぶので、ここからダウンロードします。
現行のバージョンは、2.0.9.0なので、「SeleniumBasic-2.0.9.0.exe」をクリックして、ダウンロードします。
ダウンロードしたら「SeleniumBasic-2.0.9.0.exe」をダブルクリックしてインストールしましょう。
特に気になる分岐などはないので、クリックでインストールをすすめて大丈夫です。
インストールが完了したら、VBEで「参照設定」で「Seleniumu Type Library」をチェックします。
ちなみに、VBEの「参照設定」は、ExcelからVBE(Visual Basic Editor)を起動して、メニューのツールから選択します。
もし、Excelのリボンに開発タブや「Visual Basic」が表示されていなければ、こちらをご参照して見て下さい。
まずは、簡単に動かしてみよう!
VBEで、新しく標準モジュールを追加して、以下のソースをコピペしてみて、実行してみて下さい。
Sub test()
Dim Driver As New Selenium.WebDriver
Driver.Start "chrome"
Driver.Get "https://www.unitedcinemas.jp/kokura/"
Stop
End Sub
chromedriver.exeの入れ替え
すると、こんなエラーが出ると思います。
実行時エラー ’33’:
SessionNotCreatedError
session not created exception
from unknown error: Runtime.executionContextCreated has invalid ‘context’: {“auxData”:{“frameId”:”D8BC8DDB07C36BFB8A1D6BC57B1B7D26″,”isDefault”:true,”type”:”default”},”id”:1,”name”:””,”origin”:”://”}
(Session info: chrome=78.0.3904.97)
(Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Windows NT 10.0 x86_64)
Chrome用の「chromedriver.exe」が古いことによるエラーなので、ここからChromeのバージョンにあった「chromedriver.exe」をダウンロードします。
ちなみに、Chromeのバージョンの確認は、Chromeの右上の「Google Chromeの設定」から「ヘルプ」、「Google Chromeについて」を見ましょう。
今のバージョンは「78.0.3904.97」と表示されていますので、「ChromeDriver 78.0.3904.70」をクリックします。
ダウンロードしたファイルを解凍して「chromedriver.exe」を「C:Users(ユーザー名)AppDataLocalSeleniumBasic」に移動します。
これで、エラーの対応は完了ですので、もう一度実行してみましょう。
すると、コードの「Stop」の部分で停止した状態でChromeが立ち上がり、ホームページが表示されていると思います。
ここまでで、設定と簡単なテストは完了です。
プログラムの完成
ここで、本格的?にサクッとプログラムです。
多分下のソースを貼り付けるとシネプレックス小倉とユナイテッド・シネマなかま16の上映中の映画のタイトル一覧表のExcelシートが出来るはずです。
もし動かなければ、ホームページの構成が変わっているかもしれませんので、ご一報下さい。
ソース
Sub GetTitle()
Dim Driver As New Selenium.WebDriver
Dim i As Long, j As Long
Dim txt As String
Dim theaters() As Variant, theater As Variant
Dim top_url As String, full_url As String
top_url = "https://www.unitedcinemas.jp/"
theaters = Array("kokura", "nakama")
j = 1
Driver.Start "chrome"
For Each theater In theaters
full_url = top_url & theater & "/"
Driver.Get full_url
Driver.FindElementByCss("#gnavi_film").Click
Driver.FindElementByCss("#" & theater & "NowShowing").Click
Set elm1 = Driver.FindElementByCss("#showingList > div > ul:nth-child(2)")
i = 1
Worksheets(1).Cells(i, j).Value = theater
For Each elm2 In elm1.FindElementsByTag("h3")
Set elm3 = elm2.FindElementByCss("strong > a")
txt = elm3.Text
i = i + 1
Worksheets(1).Cells(i, j).Value = txt
Next
j = j + 1
Next
End Sub
簡単なソースの解説
一応、ざっとソースの説明をしておきます。
「theaters」という配列を作って、その中に「kokura」、「nakama」というメンバーを入れています。
試していませんが、メンバーに「odaiba」を加えればユナイテッド・シネマアクアシティお台場のデータが取得出来ると思います。この部分は、ユナイテッド・シネマ系列の劇場のトップページのURLから抜き出して下さい。
最初のループでは、劇場毎に「上映中」をクリックして、現在上映中の情報を取得して、Excelシートの1列目の1行目に劇場名をセットします。
次のループで、h3設定されている部分から映画のタイトル部分を抜き出して、Excelシートの1列目の1行目に劇場名を入れて、2行目から順に映画のタイトルをセットします。
このループが終われば、次の劇場に移り、2列目に進み繰り返します。
対象のエレメントやセレクターは、Google Chromeのデベロッパーツールで検索して、コピーすれば、そこそこ簡単です。
完成形
で、動かすと、こんなシートが出来ちゃいました。
思ったより、簡単でしょう。
最後に
こんなシートで、なにか出来るかと言われても何も出来ません。
今後は、上映スケジュールを抜き出したり、今後の上映予定のタイトルを抜き出す必要があります。
また、他の劇場用のものも作成しないと意味がなかったりします。
将来的には、PythonでWebアプリとか作って…って野望もあります。
まだまだ、ほんの序の口ですが、まずは一歩を踏み出そうと思ったってなところですかね。