ライブカメラの画像のスクレイピングに関して調べたこと
ライブカメラの画像を保存したい
ネコちゃんの見守りカメラに「Qwatch」という見守りカメラを使おうとしました。
このカメラ、画像や動画の保存機能がなかったため、ライブカメラの画像をスクレイピングして保存しようとして色々やってみました。
ただ、結局あんまり良い方法までたどり着けず、別のカメラを買うことにしました。
その際、色々調べたのでメモ代わりに情報残しておきます。あんまり期待するような内容ではないです。
ライブカメラの仕様を確認
ライブカメラの仕様としては、専用アプリの他、ブラウザで以下のようにライブカメラのIPと特定のポートを以下のように叩けばライブカメラの表示ができるものでした。
http://<ip address>:<port number>
以下は具体例(IPが192.168.10.10、ポートが1234の場合)
http://192.168.10.10:1234
ただ、このままでは余計なメニュー画面が多かったので、ソースをみてみました。以下のような表記があるので
<div id="middle">
<div id="container" >
<div id="content_setup" style="position: relative; display: block ;z-index:1">
<iframe id="content_iframe" name="activex" frameborder="0" border="0" cellspacing="0" src="camera.asp" ></iframe>
</div><!-- #content-->
</div><!-- #container-->
以下のアドレスを叩くと、邪魔なメニューが少し消えました。
http://192.168.10.10:1234/camera.asp
さらにソースを探ると、以下のようなCGIのプログラムまで辿れました。CGIとか懐かしいですね。今どきのWebアプリだと流石に絶滅危惧種でしょうか?
http://192.168.10.10:1234/snapshot.cgi
これを叩くと、以下のようなライブカメラだけが出てくるようになりました。
あとは、この画像を一定期間ごとに保存していくだけですね。
今回は、一定期間ごとにスクリーンショットする方法とPythonのスクリプトを使う方法の両方を試しました。両方ともうまくいきませんでしたが一応残しておきます。
一定期間ごとにスクリーンショットを撮る方法
Windowsなら色々あるだろうということで探したのですが、良いアプリがあんまり無かったです。
Bandicamというアプリが範囲も指定できて使いやすく一番良さそうだったのですが、無料版だと10分連続しか使えないという制約があり私の用途には適しませんでした。
Windowsなら、今流行のRPA関係のソフトで探したほうが良かったのかもしれません。
以下参考サイトです。
スクレイピング
Pythonでスクレイピングも試してみました。今回はWindowsのWSL2環境で試してみました。Linuxでも基本は同じだと思います。ちなみにこちらも最後までいけていません。
基本セットアップ
Windows、WSL2環境のセットアップは以下記事参照ください。
Pythonの仮想環境は以下記事参照ください。
以降は、基本WSL2上で操作します。
Google Chromeインストール
Google Chromeをインストールします。
$ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
$ sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ sudo apt update
$ sudo apt install -y google-chrome-stable
以下でインストール場所やバージョンを確認しておきます。
$ which google-chrome
$ google-chrome --version
Google Chromeの起動を確認します。WSL2上で実行すると、普通にGoogle Chromeのウィンドウが起動します。
$ google-chrome
Google Chromeドライバインストール
続いてGoogle Chromeのドライバをセットアップします。ドライバがGoogle Chromeのバージョンより低い必要があるのが注意ポイントです。なるべくバージョン近くて少しだけ低いバージョンをダウンロードしてインストールしましょう。以下からリンク探してダウンロードして移動しましょう。
私の環境では、以下の通り実行しました。
$ wget https://chromedriver.storage.googleapis.com/95.0.4638.17/chromedriver_linux64.zip
$ sudo apt install unzip -y
$ unzip chromedriver_linux64.zip
$ sudo mv chromedriver /usr/bin/chromedriver
Pythonスクリプト
seleniumをインストールします。
$ pip3 install selenium
とりあえずテスト的に以下サンプルスクリプトを実行しました。
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=options)
driver.get('http://<ip address>:<port number>/snapshot.cgi')
print(driver.title)
driver.save_screenshot('results.png')
driver.quit()
ただ、ここでエラー。Googleのサイトならうまくいったのになぜ?と思ったのですが、ユーザー名とパスワードを入力する必要があるからですね。
頑張ればそこもスクリプトで突破できそうでしたが、時間切れ…
まとめ
ライブカメラをスクレイピングしようとしたけど、意外にめんどくさくてうまくいかなかったという話でした。
世の中でRPAとかが流行る理由が少しだけ分かったような気がしました。ただ、やはりもっと本質的な解決がしたいですね。ということで、私はカメラ自体の買い替えすることにしました。
また買ったらリンクいたします。とりあえず今回はここまでで。
追記:ATOM Cam2を購入しました。これ良いです!レビュー記事は以下参照ください。
スクレイピング関係参考サイト
Discussion
ブログ記事の方を見るにBASIC認証のようなので、
http://username:password@hostname/
形式で認証通せます。それでcurlとかで落とすだけで十分だと思います。また、Windowsで一定時間起動ということであればタスクスケジューラを使うのが定番です。
こーのいけさん
コメントありがとうございます!そんな単純な方法でいけるのですね。
Windowsだと、タスクスケジューラというのがあるんですね。今度、機会があれば使ってみたいと思います!
本当に参考になりました!