Selenium driver.get (url)
は、ページ全体がロードされるまで待機します。しかし、スクレイピングページは、デッドJSスクリプトをロードしようとします。だから私のPythonスクリプトはそれを待って数分動作しません。この問題はサイトのすべてのページで発生する可能性があります。
_from Selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.cortinadecor.com/productos/17/estores-enrollables-screen/estores-screen-corti-3000')
# It try load: https://www.cetelem.es/eCommerceCalculadora/resources/js/eCalculadoraCetelemCombo.js
driver.find_element_by_name('ANCHO').send_keys("100")
_
待機時間を制限する方法、ブロックAJAXファイルのロード、または他の方法ですか?
また、webdriver.Chrome()
でスクリプトをテストしますが、PhantomJS()またはおそらくFirefox()を使用します。そのため、何らかの方法でブラウザー設定の変更を使用する場合、それは普遍的でなければなりません。
Seleniumがデフォルトでページ/ URLをロードするとき、pageLoadStrategy
がnormal
に設定されたデフォルト構成に従います。 Seleniumがページ全体の読み込みを待たないようにするには、pageLoadStrategy
を構成します。 pageLoadStrategy
は、次の3つの異なる値をサポートします。
normal
(全ページ読み込み)eager
(インタラクティブ)none
pageLoadStrategy
を設定するコードブロックは次のとおりです。
Firefox:
from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities().FIREFOX
caps["pageLoadStrategy"] = "normal" # complete
#caps["pageLoadStrategy"] = "eager" # interactive
#caps["pageLoadStrategy"] = "none"
driver = webdriver.Firefox(desired_capabilities=caps, executable_path=r'C:\path\to\geckodriver.exe')
driver.get("http://google.com")
Chrome:
from Selenium import webdriver
from Selenium.webdriver.common.desired_capabilities import DesiredCapabilities
caps = DesiredCapabilities().CHROME
caps["pageLoadStrategy"] = "normal" # complete
#caps["pageLoadStrategy"] = "eager" # interactive
#caps["pageLoadStrategy"] = "none"
driver = webdriver.Chrome(desired_capabilities=caps, executable_path=r'C:\path\to\chromedriver.exe')
driver.get("http://google.com")
注:
pageLoadStrategy
値normal
、eager
およびnone
は WebDriver W3C EditorのDraft ですが、pageLoadStrategy
値はeager
はまだWIP(Work In Progress)内ChromeDriver 実装。詳細な議論は PythonでのChromedriver Seleniumの「熱心な」ページ読み込み戦略の回避策 にあります。
Selenium Webdriverは、暗黙と明示の2種類の待機を提供します。明示的な待機により、WebDriverは特定の条件が発生するまで待機してから、さらに実行を進めます。
from Selenium import webdriver
from Selenium.webdriver.common.by import By
from Selenium.webdriver.support.ui import WebDriverWait
from Selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
これは、10秒以内に返される要素を見つけない限り、
TimeoutException
をスローする前に最大10秒待機します。
そのため、解決策として、待機する時間を設定し、その一定期間内に要素がキャッチされない場合、例外をキャッチしてイベントをログに記録するか、何も記録せずに最終的に続行します。コードサンプルは here から取得されています