Python Selenium 设置元素等待的三种方式


Posted in Python onMarch 18, 2020

Selenium 设置元素等待的三种方式

    1. sleep 强制等待
    2. implicitly_wait() 隐性等待
    3. WebDriverWait()显示等待

三种方式的优缺点

1. sleep 强制等待

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
sleep(2)    #设置等待2秒钟
driver.get('http://www.baidu.com')

优点: 
           代码简介,简单明了

缺点: 
           如果设置sleep等待时间过短,元素还没加载出来,程序报错,sleep设置等待时间过长,元素早就加载出来了,程序还在等待,浪费是时间,影响代码整体的运行效率

个人看法: 
           简单粗暴,根据网站的响应速度和自己的网速来设置合理的休眠时间

2. implicitly_wait() 隐性等待

from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(20) #设置等待20秒钟
driver.get('http://www.baidu.com')

优点: 
          1.代码简介
          2.在代码前部分加implicitly_wait(10) ,整个的程序运行过程中都会有效(作用于全局,直接在初始化driver的后面加,后面的代码都会受影响),都会等待元素加载完成
          3.在设置的时间内没有加载到整个页面,则会报NosuchElementError。如果元素在第10s被加载出来,自动执行下面的脚本,不会一直等待10s

缺点:
          1. 非要加载到整个页面才执行代码,这样影响代码的执行效率,一般情况下,我们想要的结果是只需加载到了我要定位的元素就执行代码,不需要等待整个页面的完全加载出来再执行代码。

个人看法: 
          1.不适合用在数据在ajax的网站中,比如翻页什么的,某个元素一直存在,但是数据一直在变,这样的话只要加载出来第一页,后面翻页的数据全部会和第一页的数据相同,因为代码判断了这个元素已经被加载出来了,不会等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('元素定位报错%s'%message)
finally:
  pass

优点:
           代码执行效率快。无需等待整个页面加载完成,只需加载到你要定位的元素就可以执行代码。是最智能的设置元素等待的方式。

缺点:
           1.要导入from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.common.by import By

            必须要导入以上3个包,导包路径相当的复杂,??露?衣榉?br />            2.写等待时间的代码也是复杂。步骤稍微有点多。

element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,‘kw')))
element.send_keys(‘123')

个人看法: 相比于两种,这种方式可以算的上好的了,但是就是麻烦,写的代码太多,使用的话可以和第一种方式sleep混合使用,不过我还是喜欢用sleep,本身使用selenium就是没办法破开网站,或者使用selenium比直接破解的方式更好才使用这种,我个人是能不用就不用,抓取速度太慢了。

附上我抓取一个网站的代码,这网站作者的成果抓不到,只好用这种方式来抓了:

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': '复旦大学, 教授', '项目': 20, '成果': 234, 'H指数': '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:
        # 防止抓取到半路的时候页面没有响应,这部分数据就直接扔掉
        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')))
          # 这个也不适合这个网站,还是会抓到重复的
          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": "四川大学, 主治医师", "项目": "0", "成果": "11", "H指数": "0"}
  # {"img": "https://www.scholarmate.com/avatars/01/ea/59/1000002180047.png?A=DVUy", "name": "白晓涓",
  # "url": "https://www.scholarmate.com/P/73me22", "org": "", "项目": "6", "成果": "8", "H指数": "0"}
  # {"img": "https://www.scholarmate.com/avatars/fe/0d/89/1000000732306.png?A=D65r", "name": "原鹏飞",
  # "url": "https://www.scholarmate.com/P/77nIFr", "org": "国家统计局统计科学研究所, 副研究员", "项目": "0", "成果": "90", "H指数": "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

到此这篇关于Python Selenium 设置元素等待的三种方式的文章就介绍到这了,更多相关Selenium 元素等待内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的魔法方法深入理解
Jul 09 Python
使用Python设置tmpfs来加速项目的教程
Apr 17 Python
编写Python的web框架中的Model的教程
Apr 29 Python
python下MySQLdb用法实例分析
Jun 08 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
python爬虫使用cookie登录详解
Dec 27 Python
Python生成器以及应用实例解析
Feb 08 Python
Windows系统下pycharm中的pip换源
Feb 23 Python
Python小白学习爬虫常用请求报头
Jun 03 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 Python
Python经典五人分鱼实例讲解
Jan 04 Python
解决jupyter notebook启动后没有token的坑
Apr 24 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 #Python
Python semaphore evevt生产者消费者模型原理解析
Mar 18 #Python
Python中remove漏删和索引越界问题的解决
Mar 18 #Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 #Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 #Python
PyTorch加载自己的数据集实例详解
Mar 18 #Python
Python进程间通信multiprocess代码实例
Mar 18 #Python
You might like
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
PHP+JS实现大规模数据提交的方法
2015/07/02 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
Laravel 创建可以传递参数 Console服务的例子
2019/10/14 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JS解析XML实例分析
2015/01/30 Javascript
javascript感应鼠标图片透明度显示的方法
2015/02/24 Javascript
EasyUi 打开对话框后控件赋值及赋值后不显示的问题解决办法
2017/01/19 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
详解angularjs中如何实现控制器和指令之间交互
2017/05/31 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
小程序实现tab标签页
2020/11/16 Javascript
如何利用nodejs自动定时发送邮件提醒(超实用)
2020/12/01 NodeJs
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
python实现折半查找和归并排序算法
2017/04/14 Python
Python实现的递归神经网络简单示例
2017/08/11 Python
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
解决pyecharts在jupyter notebook中使用报错问题
2020/04/23 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
pycharm实现在子类中添加一个父类没有的属性
2020/03/12 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
LocalStorage记住用户和密码功能
2017/07/24 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
Strathberry苏贝瑞中国官网:西班牙高级工匠手工打造
2020/10/19 全球购物
初中三年学生的学习自我评价
2013/11/13 职场文书
大学自荐信
2013/12/12 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
2016优秀大学生个人事迹材料范文
2016/03/01 职场文书