Python Selenium 設(shè)置元素等待的三種方式
Selenium 設(shè)置元素等待的三種方式
1. sleep 強(qiáng)制等待
2. implicitly_wait() 隱性等待
3. WebDriverWait()顯示等待
三種方式的優(yōu)缺點(diǎn)
1. sleep 強(qiáng)制等待
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
sleep(2) #設(shè)置等待2秒鐘
driver.get('http://www.baidu.com')
優(yōu)點(diǎn):
代碼簡(jiǎn)介,簡(jiǎn)單明了
缺點(diǎn):
如果設(shè)置sleep等待時(shí)間過短,元素還沒加載出來,程序報(bào)錯(cuò),sleep設(shè)置等待時(shí)間過長(zhǎng),元素早就加載出來了,程序還在等待,浪費(fèi)是時(shí)間,影響代碼整體的運(yùn)行效率
個(gè)人看法:
簡(jiǎn)單粗暴,根據(jù)網(wǎng)站的響應(yīng)速度和自己的網(wǎng)速來設(shè)置合理的休眠時(shí)間
2. implicitly_wait() 隱性等待
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(20) #設(shè)置等待20秒鐘
driver.get('http://www.baidu.com')
優(yōu)點(diǎn):
1.代碼簡(jiǎn)介
2.在代碼前部分加implicitly_wait(10) ,整個(gè)的程序運(yùn)行過程中都會(huì)有效(作用于全局,直接在初始化driver的后面加,后面的代碼都會(huì)受影響),都會(huì)等待元素加載完成
3.在設(shè)置的時(shí)間內(nèi)沒有加載到整個(gè)頁面,則會(huì)報(bào)NosuchElementError。如果元素在第10s被加載出來,自動(dòng)執(zhí)行下面的腳本,不會(huì)一直等待10s
缺點(diǎn):
1. 非要加載到整個(gè)頁面才執(zhí)行代碼,這樣影響代碼的執(zhí)行效率,一般情況下,我們想要的結(jié)果是只需加載到了我要定位的元素就執(zhí)行代碼,不需要等待整個(gè)頁面的完全加載出來再執(zhí)行代碼。
個(gè)人看法:
1.不適合用在數(shù)據(jù)在ajax的網(wǎng)站中,比如翻頁什么的,某個(gè)元素一直存在,但是數(shù)據(jù)一直在變,這樣的話只要加載出來第一頁,后面翻頁的數(shù)據(jù)全部會(huì)和第一頁的數(shù)據(jù)相同,因?yàn)榇a判斷了這個(gè)元素已經(jīng)被加載出來了,不會(huì)等ajax去加載
3. WebDriverWait()顯示等待
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait #WebDriverWait注意大小寫
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
try:
element =
WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,'kw')))
element.send_keys('123')
driver.find_element_by_id('su').click()
except Exception as message:
print('元素定位報(bào)錯(cuò)%s'%message)
finally:
pass
優(yōu)點(diǎn):
代碼執(zhí)行效率快。無需等待整個(gè)頁面加載完成,只需加載到你要定位的元素就可以執(zhí)行代碼。是最智能的設(shè)置元素等待的方式。
缺點(diǎn):
1.要導(dǎo)入from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By
必須要導(dǎo)入以上3個(gè)包,導(dǎo)包路徑相當(dāng)?shù)膹?fù)雜,啰嗦而且麻煩
2.寫等待時(shí)間的代碼也是復(fù)雜。步驟稍微有點(diǎn)多。
element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,‘kw'))) element.send_keys(‘123')
個(gè)人看法: 相比于兩種,這種方式可以算的上好的了,但是就是麻煩,寫的代碼太多,使用的話可以和第一種方式sleep混合使用,不過我還是喜歡用sleep,本身使用selenium就是沒辦法破開網(wǎng)站,或者使用selenium比直接破解的方式更好才使用這種,我個(gè)人是能不用就不用,抓取速度太慢了。
附上我抓取一個(gè)網(wǎng)站的代碼,這網(wǎng)站作者的成果抓不到,只好用這種方式來抓了:
from selenium import webdriver
import time
from lxml.html import etree
import copy
import json
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def getAuthors():
j1 = set()
f = open('Author.json', 'r', encoding='utf-8')
data = f.read()
data_list = data.split('\n')
for dt in data_list:
j1.add(dt)
f.close()
print('j1= ', len(j1))
j2 = set()
f1 = open('yzq.json', 'r', encoding='utf-8')
data1 = f1.read()
data_list1 = data1.split('\n')
for dt in data_list1:
j2.add(dt)
print('j2= ', len(j2))
countSet = j1 - j2
print('countset= ', len(countSet))
AuthorsData = []
for dt in countSet:
dt_json = json.loads(dt)
if int(dt_json["成果"]) > 0:
AuthorsData.append(dt_json)
# dt = {'img': 'https://www.scholarmate.com/avatars/99/92/62/37572.jpg', 'name': '吳偉',
# 'url': 'https://www.scholarmate.com/P/aeiUZr', 'org': '復(fù)旦大學(xué), 教授', '項(xiàng)目': 20, '成果': 234, 'H指數(shù)': '24'}
print('AuthorData= ', len(AuthorsData))
return AuthorsData
def parseHtml(html, i):
temp_list = []
html_data = etree.HTML(html)
project_html = html_data.xpath('//div[@class="pub-idx__main"]')
for p in project_html:
# pro_name = p.xpath('./div[@class="pub-idx__main_title"]/a/@title')[0]
pro_name = p.xpath('.//a/@title')[0].strip().replace(r'\xa0', '')
# pro_url = p.xpath('./div[@class="pub-idx__main_title"]/a/@href')[0]
pro_url = p.xpath('.//a/@href')[0]
pro_author = p.xpath('./div[2]/@title')[0].strip().replace('\xa0', '')
# pro_author = p.xpath('.//div[@class="pub-idx__main_author"]/@title')
pro_inst = p.xpath('./div[3]/@title')[0]
temp_dict = {
'num': i,
'pro_name': pro_name,
'pro_url': pro_url,
'pro_author': pro_author,
'pro_inst': pro_inst
}
temp_list.append(copy.deepcopy(temp_dict))
return temp_list
def parseData(author_data):
try:
url = author_data['url']
ach_num = int(author_data['成果'])
pages = ach_num // 10
pages_ys = ach_num % 10
if pages_ys > 0:
pages += 1
driver = webdriver.Chrome()
# driver.implicitly_wait(10)
driver.get(url)
psn_data = []
for i in range(1, pages+1):
if i == 1:
# 防止抓取到半路的時(shí)候頁面沒有響應(yīng),這部分?jǐn)?shù)據(jù)就直接扔掉
try:
# time.sleep(2)
driver.find_element_by_xpath('//*[@id="pubTab"]').click()
# time.sleep(3)
# 有以下這些選擇
# WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.ID, 'pub-idx__main')))
# WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CLASS_NAME, 'pub-idx__main')))
# WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, './/pub-idx__main')))
# 這個(gè)也不適合這個(gè)網(wǎng)站,還是會(huì)抓到重復(fù)的
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//div[@class="pub-idx__main"]')))
html = driver.page_source
temp_dict = parseHtml(html, i)
psn_data.append(copy.deepcopy(temp_dict))
except:
import traceback
print(traceback.print_exc())
pass
else:
# driver.find_element_by_xpath('//*[@id="pubTab"]').click()
# 將頁面拉到底部
try:
js = "var q=document.documentElement.scrollTop=100000"
driver.execute_script(js)
# time.sleep(1)
driver.find_element_by_xpath('//div[@class="pagination__pages_next"]').click()
# time.sleep(2)
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.XPATH, '//div[@class="pub-idx__main"]')))
html = driver.page_source
temp_dict = parseHtml(html, i)
psn_data.append(copy.deepcopy(temp_dict))
except:
pass
driver.close()
psn_data = {
'init_data': author_data,
'psn_data': psn_data
}
print(psn_data)
psn_data_string = json.dumps(psn_data, ensure_ascii=False)
with open('data.json', 'a+', encoding='utf-8') as f:
f.write('{}\n'.format(psn_data_string))
author_data_string = json.dumps(author_data, ensure_ascii=False)
with open('yzq.json', 'a+', encoding='utf-8') as f:
f.write('{}\n'.format(author_data_string))
except:
pass
# import traceback
# print(traceback.print_exc())
# au_strign = json.dumps(author_data, ensure_ascii=False)
# author_data_string = json.dumps(au_strign, ensure_ascii=False)
# with open('error.json', 'a+', encoding='utf-8') as f:
# f.write('{}\n'.format(author_data_string))
def main():
# authors的值:給出三條
# {"img": "https://www.scholarmate.com/avatars/e4/fe/1e/1000002077830.png?A=DMkT", "name": "胡婷",
# "url": "https://www.scholarmate.com/P/QFFbae", "org": "四川大學(xué), 主治醫(yī)師", "項(xiàng)目": "0", "成果": "11", "H指數(shù)": "0"}
# {"img": "https://www.scholarmate.com/avatars/01/ea/59/1000002180047.png?A=DVUy", "name": "白曉涓",
# "url": "https://www.scholarmate.com/P/73me22", "org": "", "項(xiàng)目": "6", "成果": "8", "H指數(shù)": "0"}
# {"img": "https://www.scholarmate.com/avatars/fe/0d/89/1000000732306.png?A=D65r", "name": "原鵬飛",
# "url": "https://www.scholarmate.com/P/77nIFr", "org": "國(guó)家統(tǒng)計(jì)局統(tǒng)計(jì)科學(xué)研究所, 副研究員", "項(xiàng)目": "0", "成果": "90", "H指數(shù)": "0"}
AuthorsData = getAuthors()
for authors in AuthorsData:
print('author= ', authors)
parseData(authors)
if __name__ == '__main__':
main()
友情鏈接:
https://www.cnblogs.com/zhaof/p/6953241.html
https://blog.csdn.net/xiezhiming1234/article/details/83865314
https://www.cnblogs.com/April-Chou-HelloWorld/p/8855760.html
到此這篇關(guān)于Python Selenium 設(shè)置元素等待的三種方式的文章就介紹到這了,更多相關(guān)Selenium 元素等待內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?GUI多行輸入文本Text的實(shí)現(xiàn)
這篇文章主要介紹了python?GUI多行輸入文本Text的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
python基于tkinter制作下班倒計(jì)時(shí)工具
這篇文章主要介紹了python基于tkinter制作倒計(jì)時(shí)工具的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-04-04
Python標(biāo)準(zhǔn)庫之urllib和urllib3的使用及說明
這篇文章主要介紹了Python標(biāo)準(zhǔn)庫之urllib和urllib3使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
使用python-Jenkins批量創(chuàng)建及修改jobs操作
這篇文章主要介紹了使用python-Jenkins批量創(chuàng)建及修改jobs操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
詳解Python常用標(biāo)準(zhǔn)庫之時(shí)間模塊time和datetime
time和datetime是Python中常用的兩個(gè)時(shí)間模塊,本文將通過示例詳細(xì)為大家講講二者的使用方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)2022-05-05
python批量修改圖片尺寸,并保存指定路徑的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python批量修改圖片尺寸,并保存指定路徑的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07

