Pythonでスクレイピングをする際にSeleniumでよく使うコードを簡単にまとめています。
今後も追加していきます。
1. 各種設定
まずはインポート
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.select import Select # プルダウンメニューを選択するとき用
from selenium.webdriver.common.action_chains import ActionChains # クリックやタグへの移動をするとき用
from selenium.common.exceptions import NoSuchElementException # 要素がない場合の例外処理を指定するとき用
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from time import sleep # 待機するとき用
オプション設定及びドライバーの起動
options.add_argument("--user-data-dir=" + userDir) # userDirはchromeのプロファイルの保存先
options.add_argument("--headless") # ブラウザ表示なし
options.add_argument("--disable-gpu") # メモリ節約系
options.add_argument("--no-sandbox") # メモリ節約系
options.add_argument("--disable-dev-shm-usage") # メモリ節約系
options.add_experimental_option("excludeSwitches", ["enable-logging"]) # DevToolsのログを出力しない
driver = webdriver.Chrome(options=options)
driver.maximize_window()
driver.implicitly_wait(3) # 要素を発見できない場合に何秒待つか
1行目は、ログイン情報保持が必要なときのみ必要です。chrome://versionでプロフィールパスの部分を指定します。3-5行目はメモリ節約のために入れるオプションです。
8行目は、画面の大きさによってHTMLの構造が異なる場合に設定します。ただ、小さくしたほうがメモリの消費を抑えられます。以下のようにサイズ指定も可能です。
driver.set_window_size(1200, 1000)
2. 要素の取得
通常の取得
HTML例
<body>
<form id="loginForm">
<input name="username" type="text" />
</form>
</body>
自分は基本的にCSSセレクタで選択しています。XPathだと要素数が変わった場合に意図しない要素を取得してしまうためです。
# cssセレクタでの選択
form_tag = driver.find_element_by_css_selector("form#loginForm") # 旧
form_tag = driver.find_element(By.CSS_SELECTOR, "form#loginForm") # 新(Selenium 4.0以降)
# XPathでの選択
form_tag = driver.find_element_by_xpath("//form[@id='loginForm']") # 旧
form_tag = driver.find_element(By.XPATH, "//form[@id='loginForm']") # 新(Selenium 4.0以降)
# タグ名での選択
input_tag = form_tag.find_element_by_tag_name("input") # 旧
inputa_tag = form_tag.find_element(By.TAG_NAME, "input") # 新(Selenium 4.0以降)
CSSセレクタの選択は以下のサイトでかなり詳しくわかりやすく説明されています。

文字列として取得する場合は「.text」を付けるだけです。
element = driver.find_element_by_css_selector("cssセレクタ").text # 旧
element = driver.find_element(By.CSS_SELECTOR, "cssセレクタ").text # 新(Selenium 4.0以降)
3. プログラムの終了時
スクレイピングを終了するときは、以下2つのコードを必ず入れるようにします。
driver.close() # アクティブタブを閉じる
driver.quit() # すべてのタブを閉じてブラウザ自体を終了する
1行目だけだと見た目上はわからないですが、プロセスが残っていることになるため、メモリ不足になる要因になってしまいます。
4. 操作
クリック
次のページに移動するボタンなどをクリックしたい場合
actions = ActionChains(driver)
actions.move_to_element(next_btn)
actions.click(next_btn)
actions.perform()
sleep(3)
print(driver.current_url) # ページ移動後のURLを表示
事前にボタン要素をnext_btnに指定しておきmove_to_elementでその要素まで移動して、その要素をクリックします。移動しなくてもクリックできる場合もありますが、念のため基本的には移動するようにしています。
チェックボタンにチェックを入れたい場合もこちらの方法でできます。
フォームへの入力
# keyに入力したい文字列を指定
# key_inputに要素を指定
key_input.clear()
key_input.send_keys(key)
# key_input.submit() # 入力後にEnterを押す形で送信したい場合
プルダウン(ドロップダウン)メニューの選択
HTML例
<select id="dropdown">
<option value="1">1番</option>
<option value="2">2番</option>
<option value="3">3番</option>
</select>
取得(2番を選択する例)
dropdown = driver.find_element(By.CSS_SELECTOR,'select#dropdown') # selectタグを取得
select = Select(dropdown) # Selectオブジェクトを生成
second = select.select_by_index(1) # 指定方法 1 (インデックス指定)
second = select.select_by_value("2") # 指定方法 2 (value指定)
second = select.select_by_visible_text("2番") # 指定方法 3 (表示テキスト指定)
上記のように3種類の方法で要素を選択することができます。どれで選択しても結果は同じになります。
その他
手動操作との組み合わせ
条件検索画面で複雑な条件を指定する必要があり、その部分を人間が手作業で行い、その手作業を待ってから情報収集を開始するときに使える方法です。
ハローワークのような構造でしたら、この方法で手作業と組み合わせることができます。
driver.get("URL")
# ここで人間が手作業で条件指定を行う
WebDriverWait(driver, 300).until(
EC.presence_of_element_located(
(By.CSS_SELECTOR, "CSSセレクタ")
)
)
print("情報が表示されました")
6行目では、検索結果のいずれかの要素を指定して、その要素が表示されるまで300秒待つというコードです。
検索条件を指定して検索開始まで人間が行い、検索結果の特定の要素が表示されるのを待って情報収集が始まります。そのため、指定する要素は、検索開始をした後に初めて出てくる要素でなければなりません。
ご不明点や作業のご依頼などはこちらからお願い致します。

コメント