2
7

More than 3 years have passed since last update.

PythonでSeleniumを使った時の例外に対する対処

Posted at

はじめに

スクレイピングでデータを収集するということでここはPythonを使いやっていこうとなりSeleniumを使用しました。その時の様々なエラーに対する処理についてまとめました。
スクレイピングが禁止になっているサイトもあるのでそこは使用する時に調べて下さい。

エラーに対する処理

自分が、一番多く遭遇したエラーはTimeoutExceptionです。この原因としては

ボタンが表示される前にクリックをしてしまった

要素を取得することができなかった

などの理由があげられます。その対策として下記の二つが挙げられます。

driver = webdriver.Chrome(PATH)
# ボタンが表示されるのを10秒待機
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.ID, 'idを記入'))) #BYの部分はXPATHなどでもOK
# ボタンをクリック
driver.find_element_by_id('idを記入').click()

上記の処理は、ボタンが表示されるまでの10秒の間は待機します。
(10秒たっても表示されない場合はエラーとなります)

driver = webdriver.Chrome(PATH)
# 指定のドライバーの要素が表示されるまで10秒待機
driver.implicitly_wait(10)
driver.get(URL)
element = driver.find_element_by_id('idを記入')

上記の処理は、指定されたドライバーの要素すべてに対して表示されるまで待機します。
(10秒たっても表示されない場合はエラーとなるります)

次によく使用するのが、for文のループ処理やwhile文のループ処理です。
for文を使用した時に途中でエラーが発生して処理が止まらずに回って欲しい時にするのが例外処理で使用するtry exceptです。

for i in mylist:
    try:
        # 何らかの処理
    except:
        pass

上記の処理は、tryの中で何らかのエラーが発生した時にexceptに処理を移動しpassの処理が走り次の処理に移行してくれます。exceptに対してはすべてのエラーをキャッチするようにしているので、できることならその都度エラー処理を確認してそのエラーをキャッチするようにするのがオススメです。

最後に、できるだけsleepの処理を使用せずに処理をした方がいいです。やたらと、無駄な時間を取られる時もあるからです。forやwhileで早く回してる時に接続が切られる時があるのでその時には、sleepを入れて対処しています。

おわりに

スクレイピングは、不安定になったりする時がたまにあるのでエラーを確認してその都度エラーにあった対処をすることがオススメです。今後、エラーを見つけたら加えていきます。

参考文献

https://www.seleniumqref.com/api/python/time_set/Python_implicitly_wait.html
https://qiita.com/snowp/items/d5892708bc41fa7c4e39

2
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
7