[Python]Seleniumでのwaitの方法とは?様々な待機方法を紹介します!
- システム
エンジニア - PythonでSeleniumを使ったwaitの方法を教えてください。
- プロジェクト
マネージャー - 分かりました。それでは、PythonでSeleniumを使ったwaitの方法について解説いたしましょう。
[Python]Seleniumでのwaitの方法とは?
今回は、PythonでのSeleniumを使った待機方法について説明します。Webページは読み込まれるまでに時間がかかる場合があります。スクレイピングを行う場合、読み込まれるまで待機しなければ、意図した動作はできません。Seleniumでの待機方法について紹介します。
Windows10でPython 3.7を使って開発します。ブラウザはGoogle Chrome(以下、Chrome)を使用します。また、ライブラリは以下をインストールしておいてください。
1
2
|
selenium 3.141.0
chromedriver-binary-auto 0.1
|
PythonでのSeleniumを使った待機方法に興味のある方はぜひご覧ください。
待機なし
まずは、待機処理をせずにSeleniumでChromeを動かしてみます。Googleに移動して、検索ボックスに「Python wait」と入力して、検索を実行します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
from selenium import webdriver
import chromedriver_binary
# ChromeOptionsを設定
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
options.add_argument('--kiosk')
# Chromeを起動
print('Chromeを起動中...')
driver = webdriver.Chrome(options=options)
# 指定したURLに遷移
driver.get('https://www.google.co.jp/')
# 検索文字列を入力
search_bar = driver.find_element_by_name("q")
search_bar.send_keys("Python wait")
# 検索を実行
search_bar.submit()
# Chromeを終了
driver.quit()
|
実行すると、Chromeの自動操作が行われることが分かります。
time.sleepによる待機
単純に待機する方法として、time.sleep()を紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
import time
from selenium import webdriver
import chromedriver_binary
# ChromeOptionsを設定
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
options.add_argument('--kiosk')
# Chromeを起動
print('Chromeを起動中...')
driver = webdriver.Chrome(options=options)
# 指定したURLに遷移
driver.get('https://www.google.co.jp/')
# 3秒待機
time.sleep(3)
# 検索文字列を入力
search_bar = driver.find_element_by_name("q")
search_bar.send_keys("Python wait")
# 検索を実行
search_bar.submit()
# Chromeを終了
driver.quit()
|
実行すると、Googleに移動した後に3秒待機することが分かります。time.sleepはスクレイピングの間隔を広げて、サーバの負荷を下げるためには有効です。しかし、待機したからといってWebページが読み込まれることを保証するものではありません。
implicitly_waitによる待機
要素が見つかるまでの間、時間指定で待機するimplicitly_waitを紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
from selenium import webdriver
import chromedriver_binary
# ChromeOptionsを設定
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
options.add_argument('--kiosk')
# Chromeを起動
print('Chromeを起動中...')
driver = webdriver.Chrome(options=options)
# 指定したURLに遷移
driver.get('https://www.google.co.jp/')
# 明示的な待機
driver.implicitly_wait(20)
# 検索文字列を入力
search_bar = driver.find_element_by_name("q")
search_bar.send_keys("Python wait")
# 検索を実行
search_bar.submit()
# Chromeを終了
driver.quit()
|
implicitly_waitを使うと、上記のサンプルではfind_element_by_nameなどで要素が見つかるまで最大20秒待機します。要素が見つかればそれ以上待機しません。
では、要素が見つからずにタイムアウトする例を見てみましょう。find_element_by_nameを適当に変更してみます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
from selenium import webdriver
import chromedriver_binary
# ChromeOptionsを設定
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
options.add_argument('--kiosk')
# Chromeを起動
print('Chromeを起動中...')
driver = webdriver.Chrome(options=options)
# 指定したURLに遷移
driver.get('https://www.google.co.jp/')
# 明示的な待機
driver.implicitly_wait(20)
# 検索文字列を入力(qqqqqqは存在しない要素)
search_bar = driver.find_element_by_name("qqqqqq")
search_bar.send_keys("Python wait")
# 検索を実行
search_bar.submit()
# Chromeを終了
driver.quit()
|
実行すると、20秒経過するとNoSuchElementExceptionの例外が発生することが分かります。
1
2
|
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="qqqqqq"]"}
|
untilによる待機
Webページのコンテンツを基準にして待機するuntilを紹介します。実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
from telnetlib import EC
from selenium import webdriver
import chromedriver_binary
# ChromeOptionsを設定
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
options = webdriver.ChromeOptions()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
options.add_argument('--kiosk')
# Chromeを起動
print('Chromeを起動中...')
driver = webdriver.Chrome(options=options)
# 指定したURLに遷移
driver.get('https://www.google.co.jp/')
# 定義済みの条件で待機
wait = WebDriverWait(driver, 20)
wait.until(EC.presence_of_element_located(By.NAME, "q"))
# 検索文字列を入力
search_bar = driver.find_element_by_name("q")
search_bar.send_keys("Python wait")
# 検索を実行
search_bar.submit()
# Chromeを終了
driver.quit()
|
presence_of_element_locatedで、要素がloadされるまで最大20秒待機します。
By.NAMEの個所は、IDやXPATHなども指定できます。実際のソースコードを見てみましょう。try-catchで例外処理を実装することもできます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# TimeoutExceptionに必要
from selenium.common.exceptions import TimeoutException
wait = WebDriverWait(driver, 20)
# ページ上のすべての要素が読み込まれるまで待機
wait.until(EC.presence_of_all_elements_located)
# NAME指定したページ上の要素が読み込まれるまで待機
wait.until(EC.presence_of_element_located(By.NAME, "NAME"))
# ID指定したページ上の要素が読み込まれるまで待機
wait.until(EC.presence_of_element_located(By.ID, "ID"))
# XPATH指定したページ上の要素が読み込まれるまで待機
wait.until(EC.presence_of_element_located(By.XPATH, "XPATH"))
# CLASS_NAME指定したページ上の要素が読み込まれるまで待機
wait.until(EC.presence_of_element_located(By.CLASS_NAME, "CLASS_NAME"))
# try-catchも可能
try:
wait.until(EC.presence_of_element_located(By.NAME, "NAME"))
except TimeoutException as te:
print("例外処理")
|
- システム
エンジニア - PythonでSeleniumを使ったwaitの方法について、よく分かりました。
- プロジェクト
マネージャー - ご紹介したソースコードを参考に、ご自身でもソースコードを書いて理解を深めてください。
まとめ
いかがでしたでしょうか。PythonでのSeleniumを使った待機方法について説明しました。Webページは読み込まれるまでに時間がかかる場合があります。スクレイピングを行う場合、読み込まれるまで待機しなければ、意図した動作はできません。
time.sleepによる待機、implicitly_waitによる待機、untilによる待機について紹介しました。
ぜひご自身でPythonのソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
新着案件New Job
-
開発エンジニア/東京都品川区/【WEB面談可】/在宅ワーク
月給29万~30万円東京都品川区(大崎駅) -
遠隔テストサービス機能改修/JavaScript/東京都港区/【WEB面談可】/テレワーク
月給45万~60万円東京都港区(六本木駅) -
病院内システムの不具合対応、保守/東京都豊島区/【WEB面談可】/テレワーク
月給30万~30万円東京都豊島区(池袋駅) -
開発/JavaScript/東京都豊島区/【WEB面談可】/テレワーク
月給50万~50万円東京都豊島区(大塚駅) -
債権債務システム追加開発/東京都文京区/【WEB面談可】/在宅勤務
月給62万~67万円東京都文京区(後楽園駅) -
PMO/東京都豊島区/【WEB面談可】/在宅勤務
月給55万~55万円東京都豊島区(池袋駅)