Pythonからseleniumでブラウザを操作するときに、ハマった。。。

f:id:else-something:20160419190111p:plain

Pythonからseleniumでブラウザを操作する

Ubuntu14.04からだとFireFoxがいうこと聞かなかったりなんだかんだ。。。

情報端末を作りたくて、PythonでWEBスクレイピングしてます。
で、GUIをブラウザにして、全画面表示にすればよいよねー、と思ってSimpleHTTPServer立ち上げて情報表示させるものの、情報がアップデートされた際に再表示させるのどうしよう。。。。と困っていました。

なんか他に良い方法があるのかもしれないけど、とりあえずseleniumでブラウザをコントロールして希望の動作をさせることができそうなので、その方向で。

ただ、いくつかハマりポイントがあったので、メモ。

Pythonseleniumのインストール

aptでさっくりと入れてしまいます。

apt-get install python-selenium

SeleniumからFireFoxが起動しない、、ような。。。。

WEBでの情報を元にPythonコンソールから試してみたところ、手元のUbuntuPythonとaptで手に入れたseleniumだと、Firefoxは起動するものの、コンソールにコントロールが戻らず、しばらくするとなんかエラーで落ちてしまう。

$ from selenium.webdriver import Firefox
$ browser = Firefox()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 77, in __init__
    self.binary, timeout),
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/extension_connection.py", line 49, in __init__
    self.binary.launch_browser(self.profile)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 68, in launch_browser
    self._wait_until_connectable()
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/firefox_binary.py", line 103, in _wait_until_connectable
    raise WebDriverException("Can't load the profile. Profile "
selenium.common.exceptions.WebDriverException: Message: Can't load the profile. Profile Dir: %s If you specified a log_file in the FirefoxBinary constructor, check it for details.

プロファイルが読み込めないとか言ってるんだけど、プロファイルを指定しても状況変わらずで、WEBで情報も見つけられなかったので、さくっと諦めて、Chromiumを使うことにしました。
(Chromiumは別途aptで入れてました。)

Chromeドライバーをapt-getで入れる。ただし、一点要注意。

みてみたらaptにあったので、こちらもサクッと入れる。

sudo apt-get install chromium-chromedriver

注意:chromeドライバーのパスを指定しないといけない。

コンパイルすれば場所が明確なんだけど、aptで入れたからよくわからなくなってしまい。。。
調べたところ、以下の場所にあるみたい。

/usr/lib/chromium-browser/chromedriver

なので、書き方としてはこう。

browser = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver')

seleniumでgetで画面遷移させる時、プロトコルも必要なのね。

最初URLだけを渡してたら、エラーを吐いてて謎でした。。。
アドレス欄に入れる文字と同じで良いと思ってたよ。。。。

正しくはこうみたい

browser.get('http://www.yahoo.co.jp')

全画面表示で起動するには、--kioskオプションで。

こちらも、調べてたら最大化(maximize_window())の情報は多くあるものの、希望する全画面表示ではなく。
webdriverにオプションで"--kiosk"という形で指定してあげると良いみたい。

options = webdriver.ChromeOptions()
options.add_argument("--kiosk")

全部まとめるとこんな感じ

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from selenium import webdriver

options = webdriver.ChromeOptions()
options.add_argument("--kiosk")

browser = webdriver.Chrome('/usr/lib/chromium-browser/chromedriver',chrome_options=options)

browser.get('http://www.yahoo.co.jp')

上記情報の環境