python3.doc_34
R e i - D r e a m
for Laravel
TOP > Python3 > ライブラリ(selenium)
Guest
login

最終投稿日:2022年6月18日

ライブラリ(selenium)
インストール(環境構築)
selenium は、Anaconda3 には付属されていないためインストールする必要があります
● selenium のインストール
以下を叩きインストールする
    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のヘッドレスバージョンを使用してください
● 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
    ※駄目なら再起動する
画面キャプチャをとる(サンプル)
● 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 での深掘りはしません。。
● 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('おわり~')
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('おわり~')
● 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つ取得
○ 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('リンクのテキストの一部')      ※同上
● 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                                          ※ブラウザのタイトルを取得する
● 取得例
○ セレクトボックスの一覧を取得
#<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'))
○ セレクトボックスを選択する
#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')
○ execute_script メソッドを使い画面を一番下へスクロールする
インスタンス.execute_script("window.scrollTo(0, document.body.scrollHeight);")
※JavaScript を操作するメソッドです
きっぷる
ログインしてコメントを残そう!!


きっぷる