Python爬蟲之設(shè)置selenium webdriver等待
?
ajax技術(shù)出現(xiàn)使異步加載方式呈現(xiàn)數(shù)據(jù)的網(wǎng)站越來越多,當(dāng)瀏覽器在加載頁面時,頁面上的元素可能并不是同時被加載完成,這給定位元素的定位增加了困難。
如果因?yàn)樵诩虞d某個元素時延遲而造成ElementNotVisibleException(不可見元素異常)的情況出現(xiàn),那么就會降低自動化腳本的穩(wěn)定性,設(shè)置元素等待可改善這種問題造成的不穩(wěn)定。
一、強(qiáng)制等待
?強(qiáng)制等待是利用python語言自帶的time庫中的sleep()方法:
from selenium import webdriver from time import sleep def test(): # 打開瀏覽器 driver = webdriver.Firefox() driver.get( ' http://www.baidu.com ' ) sleep(5 ) driver.quit()
sleep(5)會掛起這個腳本,五秒后再繼續(xù)執(zhí)行,但是這種方式會導(dǎo)致這個腳本運(yùn)行時間過長,不到萬不得已盡可能少用,特殊情況下,時間設(shè)置最好不超過1秒,一般0.5秒。
二、隱式等待
隱式等待:在腳本中我們一般看不到等待語句,但是它會在每個頁面加載的時候自動等待;隱式等待只需要聲明一次,一般在打開瀏覽器后進(jìn)行聲明。聲明之后對整個drvier的生命周期都有效,后面不用重復(fù)聲明。?
設(shè)置一定的時長等待頁面上某元素加載完成,如果超出了設(shè)置的時長元素還沒有被加載,則拋出NoSuchElementException異常,沒有超過規(guī)定時間就繼續(xù)往下執(zhí)行,WebDriver提供了implicitly_wait()方法來實(shí)現(xiàn)隱式等待,默認(rèn)設(shè)置為0:
from selenium import webdriver def test (): # 打開瀏覽器 driver = webdriver.Firefox() # 隱式等待 設(shè)置等待時間為10秒 driver.implicitly_wait(10 ) driver.get( ' http://www.baidu.com ' )
注意:隱式等待中,如果元素在規(guī)定時間內(nèi)加載出來,也得繼續(xù)等待到規(guī)定的時間結(jié)束。
?
三、顯示等待
顯示等待:顯示等待必須在每個需要等待的元素前面進(jìn)行聲明。
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 def test(): # 打開瀏覽器 driver = webdriver.Firefox() driver.get( ' http://www.baidu.com ' ) # 顯示等待 element = WebDriverWait(driver,5,0.5).until(ec.presence_of_all_elements_located((By.ID, " kw " ))) driver.find_element_by_id( " kw " ).send_keys( " selenium " )
顯示等待需要用到兩個類:
WebDriverWait和expected_conditions兩個類。
1、WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
屬性
driver:瀏覽器驅(qū)動
timeout:最長超時時間,默認(rèn)以秒為單位
poll_frequency:檢測的間隔步長,默認(rèn)為0.5s
ignored_exceptions:超時后的拋出的異常信息,默認(rèn)拋出NoSuchElementExeception異常。
WebDriverWait()一般由until()或until_not()方法配合使用,下面是方法說明 :
until(method,message= ”) method: 在等待期間,每隔一段時間( __init__中的poll_frequency )調(diào)用這個傳入的方法,直到返回值不是False message: 如果超時,拋出TimeoutException,將message傳入異常 until_not(method,message = ”) 與until相反,until是當(dāng)某元素出現(xiàn)或什么條件成立則繼續(xù)執(zhí)行, until_not是當(dāng)某元素消失或什么條件不成立則繼續(xù)執(zhí)行,參數(shù)也相同。
?
2、expected_conditions類
各種類,達(dá)到某種條件,返回True和False
常用條件:
? ? ? ? ? ? ? ? ? ? ? ?條件 ? ? ? ? ? ? ? ? ? ? ? ? 說明
presence_of_element_located 判斷某個元素是否被加到了DOM樹里,并不代表該元素一定可見
visibility_of_element_located 判斷某個元素是否可見,可見代表元素非隱藏,并且元素的寬和高都不等于0
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
