質問編集履歴

1 インデント修正

pethagoras

pethagoras score 11

2018/08/18 13:36  投稿

python seleniumでタイムアウトになった時、リトライしたい。
### 前提・実現したいこと
python3
seleniumでスクレイピング中、度々タイムアウトエラーに陥るので
タイムアウトの時にリトライさせたいのですが、
どんなコードを書けばいいのかわかりません。
### 発生している問題・エラーメッセージ
Traceback (most recent call last):
 File "C:/pycharm/kabusyutoku.py", line 21, in <module>
   btn.click()
 File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 80, in click
   self._execute(Command.CLICK_ELEMENT)
 File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webelement.py", line 628, in _execute
   return self._parent.execute(command, params)
 File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 320, in execute
   self.error_handler.check_response(response)
 File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
   raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message: timeout
 (Session info: chrome=68.0.3440.106)
 (Driver info: chromedriver=2.40.565498 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 6.1.7601 SP1 x86_64)
### 該当のソースコード
```python3  
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome("E:/Users/chromedriver_win32/chromedriver.exe")
driver.get("https://kabuoji3.com/stock/")
入力画面のURL取得
cur_url = driver.current_url
for i in range(1598,9999):
   form = driver.find_element_by_class_name("form_txt")
   form.send_keys(i)
   検索ボタンクリック
   time.sleep(0.5)
   btn = driver.find_element_by_css_selector("#base_box > div > form > button.btn_form.btn_submit")
   btn.click()
   企業名を探す True→銘柄クリック False→次の企業へ
   meigara = driver.find_elements_by_css_selector("#base_box > div > div.data_contents > div > div > div > table > tbody > tr > td:nth-child(1) > a")
   if meigara:
       meigara[0].click()
       cur_url2 = driver.current_url
       2018年クリック
       wait = WebDriverWait(driver, 60)
       wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#base_box > div > ul > li:nth-child(2) > a")))
       data = driver.find_element_by_css_selector("#base_box > div > ul > li:nth-child(2) > a")
       time.sleep(0.5)
       data.click()
       ダンロードリンククリック
       wait = WebDriverWait(driver, 60)
       wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#base_box > div > div:nth-child(3) > form > button")))
       download = driver.find_element_by_css_selector("#base_box > div > div:nth-child(3) > form > button")
       time.sleep(0.5)
       download.click()
       ダウンロード
       wait = WebDriverWait(driver, 60)
       wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#base_box > div > div.mt_10.tc > form > button")))
       downloader = driver.find_element_by_css_selector("#base_box > div > div.mt_10.tc > form > button")
       time.sleep(0.5)
       downloader.click()
       time.sleep(1)
       画面を戻して2017年をクリック 2017が無い時はスルー
       driver.implicitly_wait(60)
       driver.get(cur_url2)
       data = driver.find_elements_by_css_selector("#base_box > div > ul > li:nth-child(3) > a")
       if data:
           data[0].click()
           ダンロードリンククリック
           wait = WebDriverWait(driver, 60)
           wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#base_box > div > div:nth-child(3) > form > button")))
           download = driver.find_element_by_css_selector("#base_box > div > div:nth-child(3) > form > button")
           time.sleep(0.5)
           download.click()
           #ダウンロード
           wait = WebDriverWait(driver, 60)
           wait.until(expected_conditions.element_to_be_clickable((By.CSS_SELECTOR, "#base_box > div > div.mt_10.tc > form > button")))
           downloader = driver.find_element_by_css_selector("#base_box > div > div.mt_10.tc > form > button")
           time.sleep(0.5)
           downloader.click()
           print(i,"完了")
           #銘柄入力画面に戻る
           driver.implicitly_wait(1)
           driver.get(cur_url)
       else:
           print(i,"は2017年は無し")
           driver.implicitly_wait(1)
           driver.get(cur_url)
   else:
       wait = WebDriverWait(driver, 10)
       wait.until(expected_conditions.element_to_be_clickable((By.CLASS_NAME, "form_txt")))
       form2 = driver.find_element_by_class_name("form_txt")
       form2.clear()
       print(i , "は無し")
```  
### 試したこと
クリックさせる前に下記の関数で待ち時間を作ってみましたが、タイムアウトエラーは解決しませんでした。
time.sleep
implicitly_wait
wait = WebDriverWait(driver, 10)
   wait.until(expected_conditions.element_to_be_clickable((By.CLASS_NAME, "form_txt")))
ご解答お待ちしています。
上記の解決方法、ご教授いただけますようお願いいたします。
  • Python

    17984 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Python 3.x

    13755 questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • selenium

    1090 questions

    Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

  • スクレイピング

    787 questions

    スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る