以前からやってみたかったブラウザのオートメーションツール、Selenium(セレニウム)に触れてみました。
スクリプトで複雑なブラウザー操作ができるので、かなり自動化できる表現の幅が広がりそうです。
seleniumの環境構築
Pythonのインストール
インストーラーをダウンロードしてWindowsにPython 3.7.4(Windows x86-64 web-based installer)を入れます。
https://www.python.org/downloads/windows/
Add Python 3.4 to PATHにチェックを入れていれば環境変数にパスが追加されます。
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37\
C:\Users\ユーザー名\AppData\Local\Programs\Python\Python37\Scripts\
seleniumのインストール
コマンドプロンプトを開いて、下記のコマンドを入力
pip install selenium
ChromeDriverのダウンロード
まずChromeを開いてスリードットメニュー>ヘルプ>Chromeについてからバージョンを確認します。
次に下記のリンクからChromeのバージョンと合わせたドライバーをダウンロード(ChromeDriver 76.0.3809.68)
http://chromedriver.chromium.org/downloads
seleniumの実行
Chromeを起動してGoogleを開く
test.pyという名前で中身は下記のコードにしたものをコマンドプロンプトで実行してみます。
python C:\Users\ユーザー名\Desktop\test.py
※もちろん.pyをダブルクリックでもOKです。
from selenium import webdriver
driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
driver.get("https://google.co.jp")
※Windowsの場合は\ではなくバックスラッシュ(/)でパスを区切ること!
※文字エンコードは「UTF-8」
テストして、Chromeが起動すればOKです。
※ブラウザーとドライバーのバージョンが合わせないと起動しません
Googleで「CGメソッド」と検索する
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
driver.get("https://www.google.co.jp/")
search = driver.find_element_by_name("q")
search.send_keys("CGメソッド")
search.send_keys(Keys.RETURN)
このブログ内で「恋声」と検索する
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
driver.get("https://cg-method.com")
xpath = '//*[@id="s"]'
search = driver.find_elements_by_xpath(xpath)[1]
search.send_keys("恋声")
search.send_keys(Keys.RETURN)
※検索BOXが複数ある場合はdriver.find_elements_by_xpath(xpath)[1]と記述する
Twitterアナリティクスにログインして今月のツイート数を取得する
一番身近なのでテストとしてTwitterを選びましたが、本来はスクレイピング禁止なので実用化は非推奨です!
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
twitter()
account = 'アカウント'
password = 'パスワード'
def twitter():
driver = webdriver.Chrome("C:/chromedriver_win32/chromedriver.exe")
driver.get('https://analytics.twitter.com/user/cg_method/home')
time.sleep(3)
element_account = driver.find_element_by_class_name("js-username-field")
element_account.send_keys(account)
time.sleep(3)
element_pass = driver.find_element_by_class_name("js-password-field")
element_pass.send_keys(password)
time.sleep(3)
element_login = driver.find_element_by_xpath('//*[@id="page-container"]/div/div[1]/form/div[2]/button')
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
element_login.click()
time.sleep(3)
selector = "body > div.container > div > div.home-content > div > div.home-columns > div.home-column-secondary > div:nth-child(2) > div > div > div:nth-child(1) > div > div"
tweetsNum = driver.find_element_by_css_selector(selector)
print("今月のツイート数:",tweetsNum.text)
取得したい要素を拾う方法
- 要素を選択して右クリック>検証
-
さらに右クリックしてCSSなりXpathなりをコピーするだけです。
[追記]フレーム単位でアクセスするスクリプト例
フレームで別れている場合に手間取ったのでメモ。
上部のフレームにスイッチ▶一度上の階層に戻って▶下のフレームにスイッチする。
参考
https://selenium-python.readthedocs.io/locating-elements.html
https://qiita.com/mastar_3104/items/0a1ce2bfa1d29287bc35
https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a
まとめ
Selenium(セレニウムを使うことで、ログインして数値を取得して、スプレッドシートシートに記入する(下記の記事)とほしい数字をデータベース化できそうです!
Seleniumを使って情報を取得する方法も下記の記事に記載しております。