PythonでChromeを操作する

shintaro_toyoguchi
6 min readSep 26, 2016

Pythonに元々入っている「webbrowser」モジュールの使い勝手微妙だったので、seleniumを使って操作してみる

そもそも何がしたいのか

大証…ではなく日本取引所グループ(2016年現在でまだ慣れてない)のサイトに、オプションの日次ベースの引値やIVといったデータが公開されているので、これを自動的に取得したい。で、鬱陶しいのでブラウザは取得後に落としたい。一連の作業は出来ればタスクスケジューラーに登録したい。

動作環境

Windows 8.1 / Python 3.4

webbrowserモジュールを使ってみる

Pythonには元々ブラウザを操作するためのモジュールが入っているので、それを使ってみる。

# -*- coding: utf-8 -*-
import webbrowser
# URLの指定
url = “http://www.jpx.co.jp/markets/derivatives/option-price/data/ose20160923tp.zip"
# Chromeのexeファイルまでのフルパスを指定
browser = webbrowser.get(‘”C:\\Program Files (x86)\\Google\Chrome\Application\chrome.exe” %s’)
browser.open(url)

実行するとChromeが起動し、ファイルのダウンロードまで実行される。

…がChromeの落とし方が分からない。公式のドキュメントにも落とし方が書かれてない…

Chromeをkillするbatファイルを用意して、Pythonで実行してみる

この辺りから迷走が始まる(結論から見たい人は飛ばしましょう)。

まず、Chromeをkillするbatファイルを用意する。

taskkill /F /IM chrome.exe /T

batファイルを実行するには、先に「os」をimportして、あとはファイル名を指定するだけ。

import osos.system(“xxxxxx.bat”)

これを先程のPythonコードの最後で実行してみる。

# -*- coding: utf-8 -*-
import webbrowser
import os
import time
# URLの指定
url = “http://www.xxx.co.jp/"
# ブラウザ起動
browser = webbrowser.get(‘”C:\Program Files (x86)\Google\Chrome\Application\chrome.exe” %s’)
browser.open(url)
# ダウンロードの間、待つ
time.sleep(1)
# batファイル実行
os.system(“Chrome_kill.bat”)

一応落とせた。

…がその後別のPythonファイルでChromeを立ち上げようとすると起動しない…どうやらkillの仕方が良くないのか…

早々に諦めて、seleniumに移行

損切りは早く、ということで他を調べていると、seleniumというモジュールを発見。

本来は高度なブラウザ操作を可能にしている(クリックしたり、スクリーンショットを撮ったり)ようだが、今欲しいのは「きちんとChromeを落とせること」という最低限過ぎる要件である。これは満たしているようだ。

早速インストール。

>python -m pip install selenium

リファレンス(下記リンク)も充実している。

これ単体ではChromeをPythonから操作できないようなので、別途Chrome用のweb driverをダウンロードし、中にあるexeファイルを、Pythonファイルと同じディレクトリに配置する。

基本的な操作はwebbrowserとほとんど変わらない。

# -*- coding: utf-8 -*-
from selenium import webdriver
# URLの指定
url = "http://www.xxx.co.jp/"
# ブラウザの起動
browser = webdriver.Chrome()
browser.get(url)
# 待機後、落とす
time.sleep(5)
browser.quit()

きちんと動いたことを確認。その勢いでfor文でループしながら、複数のサイトからダウンロードし、最後にChromeを落とす、という処理を試みると…

Chromeのウィンドウが大量に表示される事象が発生。どうやら「新しいタブで開く」ように作らないといけない模様。

新しいタブを開くには

元々はブラウザを直接操作できるモジュールということもあり、普通にキーボードを操作するように指示を出すことが可能。つまり、

新しいタブを開く:Ctrl + t

タブを閉じる:Ctrl + w

というキーボード操作を送れば、ウィンドウが大量発生する事象は回避できる。追加でimportが必要なので、要注意。

# 追加でimportが必要
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# URLの指定
url = “http://www.xxx.co.jp/
# タブ追加
browser.find_element_by_tag_name(“body”).send_keys(Keys.COMMAND + “t”)
browser.get(url)
time.sleep(5)# タブを閉じる
browser.find_element_by_tag_name(“body”).send_keys(Keys.COMMAND + “w”)

上の参考コードは何故かCOMMANDキーとMac仕様だが、Windowsでもこれで動く(直しておけよ)。

--

--