##前書き
初投稿記事です。
Seleniumというものがあることを知り、使ってみろと言われたため
備忘録的に残しおておこうと思います。
##ゴール
・PythonとSeleniumのライブラリを使って自動でWebサイトを操作
・必要な情報をログとして保存
##準備物について
###使用するもの
・Python v3.7.7
・Selenium v4.0.0
・ChromeDriver 96.0.4664.45 (多分)
PythonもSeleniumもChromeDriverも触ったことがなかったので、それぞれの概要を以下にまとめます。
###〇Pythonとは
Pythonとはプログラム言語の事。
拡張性が高く、機械言語などで評価されている。
###〇Seleniumとは
Selenium(セレニウム)とは、ブラウザの操作を自動化するための物。
→このURLのこのボタン押して~みたいなことを自動で行ってくれる。
###〇ChromeDriverとは
プログラムとChrome(ブラウザ)をつなげる役割を果たすドライバー。
様々なドライバーがあるが、今回はchromeを使用する。
##準備(インストールなど)
###Seleniumのインストール
まずはSeleniumのライブリを落としてきましょう。
pip経由でインストールするのがよさそう
pip install selenium
###ChromeDriverのインストール
Googleで調べると出てきます。
使っているChromeのバージョンと合わせましょう。
ダウンロードしてきたchromedriver.exeの場所は控えておきましょう。後ほど使います。
###seleniumインストール時に怒られた
たまにcryptographyが~と怒られる時がありますが
そういう時は
python -m pip install --upgrade pip
でpipを更新してあげると解決するかもしれません。
##実践
###ブラウザの立ち上げ
早速Seleniumを使ってみます。
以下のようなコードを打ってみてください
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome("chromedriver.exeのPATH")
driver.get('https://qiita.com')
sleep(3)
driver.close()
driver.quit()
多分一瞬Qiitaのページが表示されて消えると思います。
それぞれなにをしているか解説していきましょう。
driver = webdriver.Chrome("chromedriver.exeのPATH")
ここでは、webdriverのインスタンスを生成しています。
インスタンス生成の引数として、ドライバーのパスを入れています。
※ドライバーのパスが通っていれば引数に指定する必要は無いみたいです。
driver.get('https://qiita.com')
getの引数にURLを入れると、そのURLを開きます。
sleep(3)
待機。
driver.close()
driver.quit()
それぞれ、開いたブラウザを閉じ、
インスタンスを終了する。という処理になります。
これがないとブラウザが開きっぱなしなので、
開きっぱなしは困るよ…という人は記載するといいと思います。
これでブラウザを立ち上げることはできましたね。
###ページ遷移と値取得
「ブラウザを開いたのはいいけど、何もできないよ…」
「コレじゃあテストもクソも無いやん!」
というワガママボーイズ・ガールズの声が聞こえてくるので、
ページ遷移する機能を追加してみます。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(r"C:\driver\chromedriver\chromedriver.exe")
driver.get('https://qiita.com')
print('URLを開きました')
element = WebDriverWait(driver, 30).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'))
)
mainNavigation = element.find_elements(By.CSS_SELECTOR, 'div.st-NewHeader_navigationTabContainer > a')
mainNavigation[1].click()
sleep(2)
driver.close()
driver.quit()
上記コードを実行すると、Qiitaの記事を開いた後、
「ホーム」から「タイムライン」に遷移するのでは無いでしょうか。
このコードのポイントは
element = WebDriverWait(driver, 30).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'))
)
mainNavigation = element.find_elements(By.CSS_SELECTOR, 'div.st-NewHeader_navigationTabContainer > a')
mainNavigation[1].click()
です。
それぞれ、
element = WebDriverWait(driver, 30).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'))
)
この記述でやっていることは、「div.st-NewHeader_mainNavigationという要素が出現するまで待つ」ということをやっています。
WebDriverWaitにドライバーとタイムアウトの秒数を記述しています。
untilの中身は待機するまでの条件を記載しています。
ECには沢山のプロパティがありますが、今回は.visibility_of_element_locatedを使用しています。コレは特定の要素が出現するまで待つという命令です。
この引数にはセレクターを指定します。
By.CSS_SELECTOR, 'div.st-NewHeader_mainNavigation'
という部分でセレクターを検索しています。
この書き方はいろんなところで使います。
で、要素が出現したら「element」にWebElementを入れています。
このWebElementというのは、
簡単に言うとSeleniumを用いてセレクター検索をした結果取得できる物
くらいに思っておいてください。
mainNavigation = element.find_elements(By.CSS_SELECTOR, 'div.st-NewHeader_navigationTabContainer > a')
mainNavigation[1].click()
ここでは先程のWebElementにfind_elementsというメソッドを用いて検索をかけています。
WebElementの中に該当のセレクターはあるかな。と検索しているわけです。
このセレクターはQiita上部のタブ群を指しています。
タブの中身は複数個あるため、検索結果が複数出てきます。
その中の一つを選択したいときは[1]をみたいな感じで指定することができます。
二行目では、取得したウェブエレメントの2つ目(1つ目)をClickしています。
ここは説明不要ですね。要素をクリックしております。
###まとめ
このようにSeleniumを使用します。
色々なメソッド、プロパティを使えば、いろいろなことができるので、
是非調べてみてください。