为什么要使用Selenium?

很多浏览器渲染页面的方式都很难找出其规律, 但是利用Selenium来驱动加载网页就可以直接拿到javaScript渲染后的结果了, 不需要再担心其相关的加密系统


声明浏览器对象

  1. from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. browser = webdriver.Firefox()
  4. browser = webdriver.Edge()
  5. browser = webdriver.PhantomJS()
  6. browser = webdriver.Safari()

访问页面 -> get()

  1. browser.get("页面网址")
  2. print(browser.page_source())
  3. browser.close()

获取单个节点 -> find_element() [只能获取单个节点]

  1. input_first = browser.find_element_by_id('q')
  2. input_second = browser.find_element_by_css_selector('#q')
  3. input_third = browser.find_element_by_xpath('//*[@id="q"]')
  4. print(input_first, input_second, input_third)

更通用的方式 -> find_element()

  • 传入两个参数: 查找方式By和值
  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. # 两者完全一致
  4. browser = webdriver.Chrome()
  5. browser.get('https://www.taobao.com/')
  6. input_first = browser.find_element(By.ID, 'q')
  7. input_afirst = browser.find_element_by_id('q')
  8. print(input_first)
  9. print(input_afirst)
  10. browser.close()

获取多个节点

在楼上的基础上, 每一个element后面都跟上一个s

eg:

find_elements_by_id()

find_elements()


节点交互

  1. 输入文字 -> send_keys()
  2. 清空文字 -> clear()
  3. 点击按钮 -> click()

  1. browser = webdriver.Chrome()
  2. browser.get('https://www.taobao.com/')
  3. input = browser.find_element_by_id('q')
  4. # send_keys() -> 输入文字
  5. input.send_keys('iPhone')
  6. time.sleep(1)
  7. # 清空输入的文字
  8. input.clear()
  9. input.send_keys('iPad')
  10. button = browser.find_element_by_class_name('btn-search')
  11. button.click()

动作链 -> ActionChain()

比如: 鼠标的拖拽、键盘按键等等

  1. browser = webdriver.Chrome()
  2. url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
  3. browser.get(url)
  4. browser.switch_to.frame('iframeResult')
  5. source = browser.find_element_by_css_selector('#draggable')
  6. target = browser.find_element_by_css_selector('#droppable')
  7. actions = ActionChains(browser)
  8. # .drag_and_drop()方法指定要拖拽的节点和拖拽的目标结点
  9. actions.drag_and_drop(source, target)
  10. # perform()方法才是真正的执行动作
  11. actions.perform()

JavaScript -> execute_script('执行js代码')

模拟下拉进度条

  1. browser = webdriver.Chrome()
  2. url = 'https://www.zhihu.com/explore'
  3. browser.get(url)
  4. # 利用execute_script('执行相关的js代码')
  5. browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
  6. browser.execute_script('alert("To Bottom")')

获取节点信息

  1. 获取属性 -> get_attribute()
  2. 获取文本值 -> text()
  3. 获取其他属性 -> 获取id(id) / 位置(location) / 标签名(tag_name) / 大小(size), 直接使用对应的属性即可

切换Frame

Iframe就是子Frame, 相当于页面的子页面

Selenium打开页面后, 默认是在父级的Frame里面操作, 如果此时页面中还有子Frame是获取不到子Frame中的节点的, 所以就使用switch_to.frame()方法来切换Frame

  1. browser = webdriver.Chrome()
  2. url = 'http://runoob.com/try/try.php?filename=jqueryui-api-droppable'
  3. browser.get(url)
  4. # 切换frame, 同时页面中iframe的id为iframeResult
  5. browser.switch_to.frame('iframeResult')
  6. try:
  7. logo = browser.find_element_by_class_name('logo')
  8. except NoSuchElementException:
  9. print('NO LOGO')
  10. # 再次切换到父级的frame中去
  11. browser.switch_to.parent_frame()
  12. logo = browser.find_element_by_class_name('logo')
  13. print(logo)
  14. print(logo.text)

当页面中包含子Frame时, 如果想要获取子Frame中的节点的时候, 首先需要调用switch_to.frame('iframe的id名'), 再进行相应的操作的.

想要再次切换回原始的父级Frame使用 -> browser.switch_to.parent_frame()


延时等待

selenium中, get()方法会在网页框架结束后结束执行, 此时去获取page_source可能并不是浏览器完全加载完成出来的页面, 如果某些页面有额外的Ajax请求, 在网页的源代码中也不一定能成功获取到. 所以需要延时等待一定时间, 确保节点以及被加载出来了.

等待分为两种:

  1. 隐式等待
  2. 显示等待
隐式等待

使用隐式等待, 则selenium在DOM中找到节点时, 将会继续进行等待, 等待一段时间后在查找DOM, 直到超出设定的时间.

  1. browser.implicitly_wait(10)
显式等待

隐式等待, 我们只能固定等待时间, 但是页面的加载时受到网络影响的, 所以其实效果并不太好.

显式等待:

指定要查找的结点, 然后指定一个最长的等待时间\(^{1}\)和等待条件\(^{2}\), 如果到了规定时间仍没有加载出该节点就抛出超时异常.

(这和隐式等待有什么区别...?)

  1. # 显示等待主要用到的是这几个
  2. from selenium.webdriver.support.ui import WebDriverWait
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.support import expected_conditions as EC
  5. browser = webdriver.Chrome()
  6. browser.get("https://www.taobao.com/")
  7. # 设定等待时间
  8. wait = WebDriverWait(browser, 10)
  9. # 调用until()方法
  10. # EC.presence_of_element_located()表示节点出现 -> 内部是元组类型
  11. input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
  12. # element_to_be_clickable就是可点击
  13. button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
等待条件



显隐对比
显式 隐式
等到某种等待条件出现, 如果超出设定时间仍未出险, 则抛出异常 如果在DOM找不到元素, 则在隐式等待期间内, 每隔一段时间再去寻找, 直至超设定时间, 抛出异常
抛出的异常为抛出异常TimeoutException 抛出的异常为NoSuchElementException

前进和后退

使用到的方法:

  • back() -> 页面后退, 回退到进入该页面前的页面
  • forward() -> 页面前进, 进入该页面后又进入的最新页面
  1. import time
  2. from selenium import webdriver
  3. browser = webdriver.Chrome()
  4. browser.get('https://www.baidu.com/')
  5. browser.get('https://www.taobao.com/')
  6. browser.get('https://www.zhihu.com/explore')
  7. browser.back() # 模拟页面的回退, 从知乎发现回退到淘宝页面
  8. time.sleep(1)
  9. browser.forward() # 模拟页面的前进, 从淘宝页面又前进到知乎发现了
  10. browser.close()

Cookies

使用到的方法:

  1. 获取Cookies -> browser.get_cookies()
  2. 添加Cookies -> browser.add_cookie({字典类型})
  3. 删除所有cookies (方法如其名, 最后就只剩下了一个空列表) -> browser.delete_all_cookies()
  1. from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. browser.get('https://www.zhihu.com/explore')
  4. # 获取cookie
  5. print(browser.get_cookies())
  6. # 添加cookie
  7. browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})
  8. print(browser.get_cookies())
  9. # 删除所有cookie
  10. browser.delete_all_cookies()
  11. print(browser.get_cookies())

选项卡管理

[1] 选项卡是什么?

就是平时用浏览器的时候, 切换页面点击的那个小长方形.

[2] 使用到的方法:

  1. execute_script('window.open()') -> 利用js打开一个新选项卡
  2. 切换选项卡 -> switch_to.window()
  3. 获取所有选项卡 -> browser.window_handles 注意这个window_handles是一个属性而不是一个方法.
  1. import time
  2. from selenium import webdriver
  3. browser = webdriver.Chrome()
  4. '''
  5. 工作流程为:
  6. 打开百度页面, 执行js的window.open()打开一个新的选项卡, 获取所有的选项卡,
  7. 利用switch_to.window()方法切换到当前页面的下一个选项卡, 也就是刚才打开的新选项卡, 在该选项卡中,
  8. 打开淘宝页面, 停留一秒, 再次切换回初始的百度页面选项卡, 在该页面中打开知乎发现界面
  9. '''
  10. browser.get('https://www.baidu.com')
  11. # window.open()表示利用js新开启一个选项卡
  12. browser.execute_script('window.open()')
  13. # browser.window_handles是什么?
  14. # window_handles获取当前所有开启的选项卡, 返回的是选项卡的带好列表
  15. print(browser.window_handles)
  16. # switch_to_window()方法用来切换选项卡
  17. browser.switch_to.window(browser.window_handles[1])
  18. # 在browser.window_handles[1]选项卡下打开淘宝页面
  19. browser.get("https://www.taobao.com")
  20. time.sleep(1)
  21. browser.switch_to.window(browser.window_handles[0])
  22. browser.get("https://www.zhihu.com/explore")

异常处理

  1. import time
  2. from selenium import webdriver
  3. from selenium.common.exceptions import TimeoutException, NoSuchElementException
  4. browser = webdriver.Chrome()
  5. try:
  6. browser.get('https://www.baidu.com')
  7. except TimeoutError:
  8. print('超时')
  9. try:
  10. browser.find_element_by_id('hello')
  11. except NoSuchElementException:
  12. print('没有该元素')
  13. finally:
  14. browser.close()

不打开浏览器

每次运行selenium都要自动打开浏览器, 很烦

  1. # 重点在下面的三句, 这样就不会弹出浏览器窗口
  2. chrome_options = webdriver.ChromeOptions()
  3. chrome_options.add_argument('--headless')
  4. chrome_options.add_argument('--disable-gpu')
  5. browser = webdriver.Chrome(options=chrome_options)
  6. browser.get("https://www.baidu.com/")
  7. print(browser.find_element_by_id("su").get_attribute("value"))

简单的操作实例

  1. """
  2. 进入百度页面, 填写搜索信息(python), 点击搜索按钮, 将下拉框拉到底, 停留几秒, 回退到百度初始页面, 同时包含异常处理
  3. """
  4. from selenium import webdriver
  5. from selenium.common.exceptions import TimeoutException, NoSuchElementException
  6. import time
  7. # 初始化
  8. driver = webdriver.Chrome()
  9. try:
  10. # 进入百度页面
  11. driver.get("https://www.baidu.com/")
  12. except TimeoutException:
  13. print("超时")
  14. try:
  15. # 找到输入框
  16. kw = driver.find_element_by_css_selector("#kw")
  17. except NoSuchElementException:
  18. print("找不到该元素")
  19. finally:
  20. # 输入关键字
  21. kw.send_keys("Python")
  22. time.sleep(5)
  23. try:
  24. # 找到搜索按钮
  25. button = driver.find_element_by_css_selector("#su")
  26. except NoSuchElementException:
  27. print("找不到该元素")
  28. finally:
  29. # 点击搜索
  30. button.click()
  31. time.sleep(3)
  32. # 将下拉框拉到底
  33. driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
  34. time.sleep(3)
  35. # 回退到初始页面
  36. driver.back()
  37. time.sleep(3)
  38. # 关闭浏览器
  39. driver.close()

python - selenium模块简介的更多相关文章

  1. python selenium模块调用浏览器的时候出错

    python selenium模块使用出错,这个怎么改 因为不同版本更新不同步问题,浏览器都要另外下一个驱动.

  2. Kemaswill 机器学习 数据挖掘 推荐系统 Python optparser模块简介

      Python optparser模块简介

  3. Python::OS 模块 -- 简介

    OS 模块简介 OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能.使用OS模块中提供的接口,可以实现跨平台访问.但是在OS模块中的接口并 ...

  4. Python CSV模块简介

    Table of Contents 1. CSV 1.1. 简介 1.2. 字典方式地读写 1.3. 其它 2. 参考资料 CSV csv文件格式是一种通用的电子表格和数据库导入导出格式.最近我调用R ...

  5. Python logging 模块简介

    Table of Contents 1. Logging 模块 1.1. 简介 1.2. 简单输出日志 1.3. 输入日志到文件 1.4. 几个基本概念 1.4.1. loggers 1.4.2. h ...

  6. python paramiko模块简介

    一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  7. python paramiko模块简介及安装

    一:简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...

  8. python selenium模块 css定位

    selenium是python的非标准库,使用时需要下载安装 安装命令  pip install selenium selenium是python的自动化测试模块,可以模拟浏览器的行为 所以在使用之前 ...

  9. python + selenium 模块封装及参数化

    模块封装 示例代码: baidu.py from time import sleep from selenium import webdriver driver = webdriver.Chrome( ...

随机推荐

  1. 【docker】使用学习

    [docker]使用学习 目录 =========================================================== 1.docker 安装 2.mysql 安装 3 ...

  2. C语言每日一练——第5题

    一.题目要求 选出大于100小于1000的所有个位数与十位数字之和被10除所得余数恰好是百位数字的所有数字(如293).计算并输出上述这些素数的个数cnt以及这些素数值得sum,最后把结果cnt和su ...

  3. .Net,Java,Redis,Vue等技术视屏教程分享(不定期更新)

    前言 作为一个资深的收藏家决定把我收集的那些精品资源不定时更新分享给大家 .所有资源全是收集余网络或为大佬分享,内容仅供观摩学习交流之用.如果犯了您的权益,请联系我. 2019.12.19更新 ASP ...

  4. AQS系列(三)- ReentrantReadWriteLock读写锁的加锁

    前言 前两篇我们讲述了ReentrantLock的加锁释放锁过程,相对而言比较简单,本篇进入深水区,看看ReentrantReadWriteLock-读写锁的加锁过程是如何实现的,继续拜读老Lea凌厉 ...

  5. Soc EmbeddedDesign Suite (EDS)13.1.0.162安装

    1.双击SoCEDSSetup-13.1.0.162.exe弹出如下窗口: 2.点击Next,弹出License Agreement界面: 3.选择I accept the agreement,点击N ...

  6. django基础之day08,ajax结合sweetalert的使用

    models.py文件 from django.db import models class User(models.Model): username=models.CharField(max_len ...

  7. eclipse 导入别人拷贝过来的工作空间项目

    切换自己的工作空间 File --> Import --> Existing Project into Workspace --> 选择项目根目录 --> 确定 如果你的ecl ...

  8. Wiki语法大全

    原文链接:wiki语法大全  编辑一个维客页面十分容易.只要点击页面上方的“编辑本页”或右侧的[编辑]链接即可修改该页,或点击“讨论本页”然后再点击“编辑页面”来讨论该页面.点击后您就会看到一个包含那 ...

  9. kafka2.3.1+zookeeper3.5.6+kafka-manager2.0.0.2集群部署(centos7.7)

    一.准备三台服务器,配置好主机名和ip地址 二.服务器初始化:包括安装常用命令工具,修改系统时区,校对系统时间,关闭selinux,关闭firewalld,修改主机名,修改系统文件描述符,优化内核参数 ...

  10. docker安装redis 5.0.7并挂载外部配置和数据

    环境 CentOS Linux release 7.7.1908 (Core) 拉取redis 5.0.7 镜像 docker pull redis:5.0.7 创建挂载目录 mkdir -p /ho ...