最終投稿日:2022年6月18日
ライブラリ(selenium)
インストール(環境構築)
selenium は、Anaconda3 には付属されていないためインストールする必要があります
● selenium のインストール
以下を叩きインストールする
pip install selenium
※selenium==3.12.0 をインストールしました
pip install selenium
※selenium==3.12.0 をインストールしました
● phantomjs のインストール
phantomjs とは、画面を持たないブラウザ(ヘッドレスブラウザ)です
http://phantomjs.org/download.html
上記へアクセスして Windows の欄にある「phantomjs-2.1.1-windows.zip」をダウンロードする
解凍後phantomjs-2.1.1にリネームしてCドライブ直下へ配置
環境変数に以下を追加する
C:\phantomjs-2.1.1\bin
コマンドラインから以下を実行しphantomjs のパスが通ってる事を確認
phantomjs -v
※駄目なら再起動する 【注意】
phantomjs の selenium サポートが切れているらしい
簡単なプログラムを組んで実行すると以下の様な警告がでました(2018/5/21 現在はプログラムは正常終了できた)
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
⇒ UserWarning:PhantomJSのSeleniumサポートは廃止されました。
代わりにChromeまたはFirefoxのヘッドレスバージョンを使用してください
http://phantomjs.org/download.html
上記へアクセスして Windows の欄にある「phantomjs-2.1.1-windows.zip」をダウンロードする
解凍後phantomjs-2.1.1にリネームしてCドライブ直下へ配置
環境変数に以下を追加する
C:\phantomjs-2.1.1\bin
コマンドラインから以下を実行しphantomjs のパスが通ってる事を確認
phantomjs -v
※駄目なら再起動する 【注意】
phantomjs の selenium サポートが切れているらしい
簡単なプログラムを組んで実行すると以下の様な警告がでました(2018/5/21 現在はプログラムは正常終了できた)
UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead
⇒ UserWarning:PhantomJSのSeleniumサポートは廃止されました。
代わりにChromeまたはFirefoxのヘッドレスバージョンを使用してください
● Headless Chrome のインストール
https://sites.google.com/a/chromium.org/chromedriver/downloads
上記サイトより ChromeDriver をダウンロードする
Latest Release: ChromeDriver 2.38 ※最新を選択した
選択すると更に画面遷移するので、windows 版をダウンロードする
※32bit 版しかないらしい。。
chromedriver_win32.zip
解凍すると chromedriver.exe のみが出来るので、とりあえず以下の様な構造で設置する
C:\chromedriver_win32\chromedriver.exe
環境変数に以下を追加する
C:\chromedriver_win32
コマンドラインから以下を実行しchromedriver のパスが通ってる事を確認
chromedriver -v
※駄目なら再起動する
上記サイトより ChromeDriver をダウンロードする
Latest Release: ChromeDriver 2.38 ※最新を選択した
選択すると更に画面遷移するので、windows 版をダウンロードする
※32bit 版しかないらしい。。
chromedriver_win32.zip
解凍すると chromedriver.exe のみが出来るので、とりあえず以下の様な構造で設置する
C:\chromedriver_win32\chromedriver.exe
環境変数に以下を追加する
C:\chromedriver_win32
コマンドラインから以下を実行しchromedriver のパスが通ってる事を確認
chromedriver -v
※駄目なら再起動する
画面キャプチャをとる(サンプル)
● phantomjs で画面キャプチャを取得
from selenium import webdriver
import os
dir = os.path.dirname(__file__)
SAVE_FILE = os.path.join( dir, 'hoge.png' )
url = 'http://www.aozora.gr.jp/cards/000081/files/46268_23911.html'
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
browser.get(url)
browser.save_screenshot(SAVE_FILE)
browser.quit()
print('おわり~') ※サポートが切れているので、これ以上 phantomjs での深掘りはしません。。
import os
dir = os.path.dirname(__file__)
SAVE_FILE = os.path.join( dir, 'hoge.png' )
url = 'http://www.aozora.gr.jp/cards/000081/files/46268_23911.html'
browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
browser.get(url)
browser.save_screenshot(SAVE_FILE)
browser.quit()
print('おわり~') ※サポートが切れているので、これ以上 phantomjs での深掘りはしません。。
● Headless Chrome で画面キャプチャを取得
from selenium import webdriver ※selenium のインポート
from selenium.webdriver.chrome.options import Options ※ドライバのインポート
import os
dir = os.path.dirname(__file__)
SAVE_FILE = os.path.join( dir, 'hoge.png' ) ※キャプチャの保存先
url = 'http://www.aozora.gr.jp/cards/000081/files/46268_23911.html'
options = Options() ※引数なしでドライバを初期化
options.add_argument('--headless') ※このオプションを追加するとブラウザが非表示となる
browser = webdriver.Chrome(chrome_options=options) ※selenium を使いブラウザのインスタンスを生成
browser.set_page_load_timeout(60) ※ページの読み込みのタイムアウト設定
browser.implicitly_wait(3) ※暗黙の待機
browser.get(url) ※URL へアクセスする
browser.save_screenshot(SAVE_FILE) ※save_screenshot メソッドでスクリーンキャプチャを保存する
browser.quit() ※ブラウザインスタンスを破棄する
print('おわり~')
from selenium.webdriver.chrome.options import Options ※ドライバのインポート
import os
dir = os.path.dirname(__file__)
SAVE_FILE = os.path.join( dir, 'hoge.png' ) ※キャプチャの保存先
url = 'http://www.aozora.gr.jp/cards/000081/files/46268_23911.html'
options = Options() ※引数なしでドライバを初期化
options.add_argument('--headless') ※このオプションを追加するとブラウザが非表示となる
browser = webdriver.Chrome(chrome_options=options) ※selenium を使いブラウザのインスタンスを生成
browser.set_page_load_timeout(60) ※ページの読み込みのタイムアウト設定
browser.implicitly_wait(3) ※暗黙の待機
browser.get(url) ※URL へアクセスする
browser.save_screenshot(SAVE_FILE) ※save_screenshot メソッドでスクリーンキャプチャを保存する
browser.quit() ※ブラウザインスタンスを破棄する
print('おわり~')
selenium を使って Headless Chrome を操作する
● ログインが必要なページをスクレイピングする
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
USER = 'hogehoge'
PWD = '123456'
url = 'http://localhost/cake3x/users/login'
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)
browser.set_page_load_timeout(60)
browser.implicitly_wait(3)
try:
#ログイン画面を取得
browser.get(url)
#最初に見つかった name 属性を取得
e = browser.find_element_by_name('username')
#一旦クリアして空にする
e.clear()
#定義したユーザー名を入力
e.send_keys(USER)
#最初に見つかった password 属性を取得
e = browser.find_element_by_name('password')
#一旦クリアして空にする
e.clear()
#定義したパスワードを入力
e.send_keys(PWD)
#セレクターで検索し、最初に見つかった form を取得
frm = browser.find_element_by_css_selector("body > div > form")
#サブミットする
frm.submit()
except Exception as e:
#エラーの詳細を表示
import traceback
print(traceback.format_exc())
browser.quit()
#何らかのエラーがあれば強制終了する
exit()
#ログインに成功すると index ページに行く(サイトの作りによる。。)ので A タグ要素を全て取得
links = browser.find_elements_by_css_selector('a')
for a in links:
#get_attribute メソッドでリンク部分を取得
href = a.get_attribute('href')
#テキストを取得
title = a.text
print('【' + title + '】->' + '【' + href + '】')
browser.quit()
print('おわり~')
from selenium.webdriver.chrome.options import Options
USER = 'hogehoge'
PWD = '123456'
url = 'http://localhost/cake3x/users/login'
options = Options()
options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=options)
browser.set_page_load_timeout(60)
browser.implicitly_wait(3)
try:
#ログイン画面を取得
browser.get(url)
#最初に見つかった name 属性を取得
e = browser.find_element_by_name('username')
#一旦クリアして空にする
e.clear()
#定義したユーザー名を入力
e.send_keys(USER)
#最初に見つかった password 属性を取得
e = browser.find_element_by_name('password')
#一旦クリアして空にする
e.clear()
#定義したパスワードを入力
e.send_keys(PWD)
#セレクターで検索し、最初に見つかった form を取得
frm = browser.find_element_by_css_selector("body > div > form")
#サブミットする
frm.submit()
except Exception as e:
#エラーの詳細を表示
import traceback
print(traceback.format_exc())
browser.quit()
#何らかのエラーがあれば強制終了する
exit()
#ログインに成功すると index ページに行く(サイトの作りによる。。)ので A タグ要素を全て取得
links = browser.find_elements_by_css_selector('a')
for a in links:
#get_attribute メソッドでリンク部分を取得
href = a.get_attribute('href')
#テキストを取得
title = a.text
print('【' + title + '】->' + '【' + href + '】')
browser.quit()
print('おわり~')
● selenium で DOM 要素を選択する方法
○ DOM の中から最初に見つかった要素を1つだけ取得
find_element_by_id('id') ※id 属性から要素を1つ取得
find_element_by_name('name') ※name 属性から要素を1つ取得
find_element_by_css_selector('セレクタ') ※CSS セレクタを指定して要素を1つ取得
find_element_by_xpath('xpath') ※xpath を指定して要素を1つ取得
find_element_by_tag_name('タグ名') ※タグ名の要素を1つ取得
find_element_by_link_text('リンクのテキスト') ※リンクのテキストから要素を1つ取得
find_element_by_class_name('クラス名') ※クラス名から要素を1つ取得
find_element_by_name('name') ※name 属性から要素を1つ取得
find_element_by_css_selector('セレクタ') ※CSS セレクタを指定して要素を1つ取得
find_element_by_xpath('xpath') ※xpath を指定して要素を1つ取得
find_element_by_tag_name('タグ名') ※タグ名の要素を1つ取得
find_element_by_link_text('リンクのテキスト') ※リンクのテキストから要素を1つ取得
find_element_by_class_name('クラス名') ※クラス名から要素を1つ取得
○ DOM の中にある全ての要素を取得
find_elements_by_css_selector('セレクタ') ※CSS セレクタを指定して複数の要素を取得
find_elements_by_xpath('xpath') ※xpath を指定して複数の要素を取得
find_elements_by_tag_name('タグ名') ※タグ名の要素を複数取得
find_elements_by_class_name('クラス名') ※クラス名の要素を複数取得
find_elements_by_partial_link_text('リンクのテキストの一部') ※リンク名の部分一致する要素を複数取得
find_element_by_partial_link_text('リンクのテキストの一部') ※同上
find_elements_by_xpath('xpath') ※xpath を指定して複数の要素を取得
find_elements_by_tag_name('タグ名') ※タグ名の要素を複数取得
find_elements_by_class_name('クラス名') ※クラス名の要素を複数取得
find_elements_by_partial_link_text('リンクのテキストの一部') ※リンク名の部分一致する要素を複数取得
find_element_by_partial_link_text('リンクのテキストの一部') ※同上
● selenium で要素に対して行う操作
[d] = webdriver から取得したインスタンス、[e] = 各エレメント
d.back() ※ヒストリーバック
e.clear() ※テキスト入力できる要素でテキストをクリアする
e.click() ※要素をクリックする
d.close() ※ウィンドウを閉じる(終わりにする場合は d.quit() を使う)
d.execute_script(コード) ※Java Script を実行する
d.forward() ※1つ前へ進む
e.get_attribute('属性名') ※要素の属性名の内容を取得する
例)
要素.get_attribute('href') ※リンクの URL を取得
e.is_displayed() ※要素がユーザーから見える状態かどうか
e.is_enabled() ※要素が有効かどうか
e.is_selected() ※チェックボックス等の要素が選択された状態かどうか
d.maximize_window() ※ブラウザサイズを最大にする(ブラウザを非表示にすると機能しない。。)
d.quit() ※全てのウィンドウをを閉じる
d.refresh() ※リフレッシュする
d.save_screenshot('保存パス') ※スクリーンショットを保存する
e.send_keys('値') ※キーを送信する(入力する)
d.set_window_size(x, y) ※ブラウザサイズを変更する
e.submit() ※フォームを送信する
e.value_of_css_property('属性名') ※CSS の name の値を取得する d.current_url ※現在の URL を取得
e.id ※id 要素を取得する
e.location ※要素の位置を取得する
d.page_source ※ページのソースを取得する
e.parent ※親要素を取得する
e.rect ※サイズと位置の情報を辞書型で取得する
d.screenshot_as_base64 ※スクリーンショットを Base64 で取得する
d.screenshot_as_png ※スクリーンショットを png 形式のバイナリデータを取得する
e.size ※要素のサイズを取得する
e.tag_name ※タグの名前を取得する
e.text ※要素のテキストを取得する
d.title ※ブラウザのタイトルを取得する
d.back() ※ヒストリーバック
e.clear() ※テキスト入力できる要素でテキストをクリアする
e.click() ※要素をクリックする
d.close() ※ウィンドウを閉じる(終わりにする場合は d.quit() を使う)
d.execute_script(コード) ※Java Script を実行する
d.forward() ※1つ前へ進む
e.get_attribute('属性名') ※要素の属性名の内容を取得する
例)
要素.get_attribute('href') ※リンクの URL を取得
e.is_displayed() ※要素がユーザーから見える状態かどうか
e.is_enabled() ※要素が有効かどうか
e.is_selected() ※チェックボックス等の要素が選択された状態かどうか
d.maximize_window() ※ブラウザサイズを最大にする(ブラウザを非表示にすると機能しない。。)
d.quit() ※全てのウィンドウをを閉じる
d.refresh() ※リフレッシュする
d.save_screenshot('保存パス') ※スクリーンショットを保存する
e.send_keys('値') ※キーを送信する(入力する)
d.set_window_size(x, y) ※ブラウザサイズを変更する
e.submit() ※フォームを送信する
e.value_of_css_property('属性名') ※CSS の name の値を取得する d.current_url ※現在の URL を取得
e.id ※id 要素を取得する
e.location ※要素の位置を取得する
d.page_source ※ページのソースを取得する
e.parent ※親要素を取得する
e.rect ※サイズと位置の情報を辞書型で取得する
d.screenshot_as_base64 ※スクリーンショットを Base64 で取得する
d.screenshot_as_png ※スクリーンショットを png 形式のバイナリデータを取得する
e.size ※要素のサイズを取得する
e.tag_name ※タグの名前を取得する
e.text ※要素のテキストを取得する
d.title ※ブラウザのタイトルを取得する
● 取得例
○ セレクトボックスの一覧を取得
#<select id='hoge'><option value='100'></option><option value='101'></option></select>
インスタンス.find_elements_by_css_selector('#hoge > option')
for op in e:
#100 200 と順に取得できる
print(op.get_attribute('value'))
インスタンス.find_elements_by_css_selector('#hoge > option')
for op in e:
#100 200 と順に取得できる
print(op.get_attribute('value'))
○ セレクトボックスを選択する
#Select をインポートする必要があります
from selenium.webdriver.support.ui import Select
#まずは、<select id='hoge'> 自体の要素を取得します
s = インスタンス.find_element_by_id('hoge')
#これで <option value='100'> を選択した状態となります
Select(s).select_by_value('100')
from selenium.webdriver.support.ui import Select
#まずは、<select id='hoge'> 自体の要素を取得します
s = インスタンス.find_element_by_id('hoge')
#これで <option value='100'> を選択した状態となります
Select(s).select_by_value('100')
○ execute_script メソッドを使い画面を一番下へスクロールする
インスタンス.execute_script("window.scrollTo(0, document.body.scrollHeight);")
※JavaScript を操作するメソッドです
※JavaScript を操作するメソッドです



