プログラムでブラウザを操作して自動で情報の収集やテストなどをする方法に
Selenium WebDriver
を使う方法があります。
<参考>
僕はこれまでPC上のJavaでSeleniumを使っていろいろ自動化ソフトを作っていたのですが、PCのブラウザを操るためにJavaを使ってSeleniumを起動させるという手法だとまずはブラウザが立ち上がらないと操作できないので、必用な時には必ずPCを起動させないといけません。(あたりまえですね)
そして、「ブラウザを操作するんだからブラウザが立ち上がらないPC(サーバーPCなど)ではブラウザ操作ができない」と思い込んでいました。
つまり、スクレイピングやページの監視など、ブラウザ操作を24時間運用する場合にはPC起動させっぱなしにしないとけいないのだと思っていました。実際PCを立ち上げっぱなしにしていた時期もありました。
最近VPSを契約しまして↓
「せっかく24時間起動しっぱなしのVPSを契約したのだから画面の無いサーバーOSでもブラウザ操作をする方法が無いものなのか?」ということを調べていましたら
あるんですねーー!!!
通称
ヘッドレスブラウザ
というブラウザです。
ヘッドレスブラウザとは「ブラウザ表示をしないブラウザ」のことです。
(※ちなみに、LynxというCUIベースのブラウザもあります)
「?!」
Seleniumを使った事の無い方なら
「画面を表示しないならどうやってブラウザ操作するのさ?」
と思われる方もあることでしょう。
Seleniumはブラウザで表示されるソースの要素で操作するので画面が見えなくても
例)
<div class="hogehoge">
<input type="text" name="ke" value="chinge">
</div>
というようなHTMLのソースコードさえ見えればOKなのです。
name属性やidなどを指定することでテキストの入力やボタンの操作が可能になります。
Seleniumで使えるヘッドレスブラウザとしてGoogleのChromeの「ヘッドレスブラウザモード」が使えるんですって!
Chromeのブラウザがそのまま使えるなんてありがたい!
インストールするものは
- SeleniumWebDriver
- GoogleChromeBrowser
- ChromeDriver
の3点です。
<参考>
SeleniumからHeadless Chromeを使ってみた - Qiita
Raspberry pi3上でChromeのheadlessモードによる小型低電力&自動化環境への第一歩 - Qiita
Seleniumのインストールはpip3から
sudo pip3 install selenium
chromiumブラウザをインストール
sudo apt-get install chromium-browser
ブラウザのバージョン確認
chromium-browser -version
Chromium 72.0.3626.121 Built on Raspbian ,
ChromeDriverをインストール
sudo apt-get install chromium-chromedriver
Driveのバージョン確認
chromedriver --version
ChromeDriver 72.0.3626.121
参考サイトでオススメされているラッパライブラリseleneのインストール(今回は使わなかった)
sduo pip3 install selene
そのまま上の参考ページのサンプルを実行しようとしたら下記のエラーで怒られました
raceback (most recent call last):
File "selenium_test.py", line 10, in <module>
driver = webdriver.Chrome('/usr/bin/chromedriver',chrome_options=chrome_option)
File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/chrome/webdriver.py", line 67, in __init__
desired_capabilities=desired_capabilities)
File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 91, in __init__
self.start_session(desired_capabilities, browser_profile)
File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 173, in start_session
'desiredCapabilities': desired_capabilities,
File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 233, in execute
self.error_handler.check_response(response)
File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/chromium-browser is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
(Driver info: chromedriver=72.0.3626.121,platform=Linux 4.14.98-v7+ armv7l)
なぜー?といろいろ調べたけど結局よくわかんなかった。
で、いろいろやってみた結論、
「root権限で実行させたらエラーが出る!」
というものでした。
セキュリティーの関係のようですね。ブラウザからroot権限でマルウェア感染しても嫌なのでここは一般ユーザーとして実行しましょう!
下記コードを
-- selenium_test.py --
import time
#SeleniumWebDriverのインポート
from selenium import webdriver#ChromeOptionでヘッドレスモードを指定
chrome_option = webdriver.ChromeOptions()
chrome_option.add_argument('--headless')
chrome_option.add_argument('--disable-gpu')#WebDriverをオプションを設定して起動
driver = webdriver.Chrome(chrome_options=chrome_option)
#googleのサイトを開く
driver.get('https://www.google.com/')
time.sleep(3)#ブラウザのスクリーンショットを撮る
driver.save_screenshot('/home/pi/screenshot0.jpg')
#検索ボックスのname="q"を属性として指定して文字入力
search_box = driver.find_element_by_name("q")
search_box.send_keys('ラズベリーパイ')#きちんと文字入力できたか確認用スクショを撮る
driver.save_screenshot('/home/pi/screenshot1.jpg')
#検索文字を送信
search_box.submit()
time.sleep(2)#検索結果のスクショを撮る
driver.save_screenshot('/home/pi/screenshot2.jpg')
#終了する
driver.quit()
これを一般ユーザーで実行させると
python3 selenium_test.py
/home/pi にブラウザの画像が保存されました。
screenshot0.jpg
screenshot1.jpg
screenshot2.jpg
成功です。日本語でバッチリ検索できていますね。
ということでラズパイからヘッドレスブラウザを操作できました!