DreamerDreamのブログ

夢想家の夢です。〜揚げたてのモヤっとしたものをラフレシアと共に〜

プログラムで画面が表示されないブラウザを操作する(ヘッドレスブラウザ)

プログラムでブラウザを操作して自動で情報の収集やテストなどをする方法に

Selenium WebDriver

を使う方法があります。

 

<参考>

Selenium WebDriver入門 - Qiita

 

僕はこれまでPC上のJavaSeleniumを使っていろいろ自動化ソフトを作っていたのですが、PCのブラウザを操るためにJavaを使ってSeleniumを起動させるという手法だとまずはブラウザが立ち上がらないと操作できないので、必用な時には必ずPCを起動させないといけません。(あたりまえですね)

そして、「ブラウザを操作するんだからブラウザが立ち上がらないPC(サーバーPCなど)ではブラウザ操作ができない」と思い込んでいました。

つまり、スクレイピングやページの監視など、ブラウザ操作を24時間運用する場合にはPC起動させっぱなしにしないとけいないのだと思っていました。実際PCを立ち上げっぱなしにしていた時期もありました。

 

最近VPSを契約しまして↓

dreamerdream.hateblo.jp

 

せっかく24時間起動しっぱなしのVPSを契約したのだから画面の無いサーバーOSでもブラウザ操作をする方法が無いものなのか?」ということを調べていましたら

あるんですねーー!!!

 

通称

ヘッドレスブラウザ

というブラウザです。

 

ヘッドレスブラウザとは「ブラウザ表示をしないブラウザ」のことです。

(※ちなみに、LynxというCUIベースのブラウザもあります)

 

?!

Seleniumを使った事の無い方なら

画面を表示しないならどうやってブラウザ操作するのさ?

と思われる方もあることでしょう。

 

Seleniumはブラウザで表示されるソースの要素で操作するので画面が見えなくても

例)

<div class="hogehoge">

<input type="text" name="ke" value="chinge">

</div>

というようなHTMLのソースコードさえ見えればOKなのです。

name属性やidなどを指定することでテキストの入力やボタンの操作が可能になります。

 

 

Seleniumで使えるヘッドレスブラウザとしてGoogleChromeの「ヘッドレスブラウザモード」が使えるんですって!

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

 

f:id:DreamerDream:20190423110821j:plain

 

screenshot1.jpg

 

f:id:DreamerDream:20190423110837j:plain

 

screenshot2.jpg

 

f:id:DreamerDream:20190423110859j:plain

成功です。日本語でバッチリ検索できていますね。

ということでラズパイからヘッドレスブラウザを操作できました!

 

次回はVPSCentOS上で試してみます。

kampa.me