プログラミング素人のはてなブログ

技術屋の末端。プログラミングも電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、python3、ラズパイ始めました。

Seleniumでブラウザの制御

seleniumを使う目的は、beautifulsoupがページの情報を取得するだけであるので<a>のようなLinkが設定されていないとLink先の情報が取得できないのに対し、ボタンクリックやフォーム入力によって次のページに遷移するような形のページに対して利用できるという点になるのだと思います。

ここではWindows10での設定と簡易動作までを説明します。

まずはPhantomJSのインストールとパスの設定をします。
パスの設定とはpythonとPhantomJSを紐づけることです。

PhantomJS | PhantomJS
からPhantomJSをダウンロードします。特に"ダマシ"はないので画面に従ってDownloadできると思います。
記事執筆時点ではv2.1.1です。 (phantomjs-2.1.1-windows.zip)
f:id:s51517765:20180107134758j:plain

ダウンロードしたzipを解凍すると、
\Desktop\phantomjs-2.1.1-windows.zip\phantomjs-2.1.1-windows\bin
の中にPhantomjs.exeがあります。

ぐぐるWindowsでのインストール(主に、pythonからのpathを通す方法について)が出てきますが、うまくいきません。
gist.github.com
pathを通すというのは、要するにpythonからモジュールとしphantomJS(以下PJS)をインポートするにあたって、このPJS本体がどこにあるかを設定することなのですが、なにがどう違うのか?よくわかりません。

そこで、逆転の発想をしました。
python(私の環境ではanaconda)にPJSの場所を設定するのではなく、anacondaが知っている場所にPJSを入れたらいいのではないか?
結果、うまくいきました。

anacondaのrootはanaconda promptを起動したときDefoultで立ち上がる場所です。ここにPJSを入れようと思います。
f:id:s51517765:20180107135658j:plain
ここでは、

C:\ProgramData\Anaconda3

です。
これをwindowsエクスプローラで開き、実行ファイルをコピーします。
(windows10ではこのあたりのフォルダは隠しフォルダになっています。)

コピーできたら、anaconda promptで↓のように実行してphantomjsのversion情報が取得できればこれで設定はOKです。

$phantomjs -v

次に実際にPJSをつかってブラウザの操作をしてみます。
twitterのホームを開き、ログインボタンをクリックしてみます。
PJSはヘッドレスブラウザといって、コマンドで操作するために特化されたブラウザで、よって画面描画しないものです。
これでは、うまく動いたのかどうかが判断できないので、スクリーンショットをとることで動作確認します。
ログインボタンは、browser.find_elements_by_link_text("###")で指定します。

※<code></code>でかこむとグレーの四角でハイライトされる。「code記法」と呼ばれるもの。
本来は<>を半角で書くが、半角で書くとタグとみなされるので説明できない。

おもなCSSセレクタについては↓に例が載っている。
qiita.com
qiita.com

from selenium import webdriver
browser = webdriver.PhantomJS()

url = "https://twitter.com/"
browser.get(url)
browser.save_screenshot("twitter.png") #スクリーンショット
login = browser.find_elements_by_link_text('ログイン') #Linkのテキストを探す
login[0].click() #Linkを踏む
browser.save_screenshot("login.png") #スクリーンショット

↓で例題にもなっているのでfirefoxも試してみた。

firefox用のselenium driverは↓
github.com
これも同様に、実行ファイルを

C:\ProgramData\Anaconda3

にコピーすればよい。(firefox https://www.mozilla.org/ja/firefox/new/ がインストールされている前提)

firefoxを使う場合は上のコードでブラウザ指定を書き換える。

browser = webdriver.Firefox()

firefoxの場合は画面がでるブラウザなので、画面が立ち上がってくる。