0


爬虫神器Selenium傻瓜教程,看了直呼牛掰

0. 准备工作

在开始后续功能演示之前,我们需要先安装

  1. Chrome

浏览器并配置好

  1. ChromeDriver

,当然也需要安装

  1. selenium

库!

0.1. 安装selenium库

  1. pip install selenium

0.2. 安装浏览器驱动

其实,有两种方式安装浏览器驱动:一种是常见的手动安装,另一种则是利用第三方库自动安装。

以下前提:大家都已经安装好了

  1. Chrome

浏览器哈

手动安装

先查看本地

  1. Chrome

浏览器版本:(两种方式均可)

  • 在浏览器的地址栏键入Chrome://version,即可查看浏览器版本号
  • 或者点击Chrome菜单 帮助关于Google Chrome,查看浏览器版本号

再选择对应版本号的驱动版本

下载地址:https://chromedriver.storage.googleapis.com/index.html

最后进行环境变量配置,也就是将对应的

  1. ChromeDriver

的可执行文件

  1. chromedriver.exe

文件拖到

  1. Python

  1. Scripts

目录下。

注:当然也可以不这样做,但是在调用的时候指定

  1. chromedriver.exe

绝对路径亦可。

自动安装

自动安装需要用到第三方库

  1. webdriver_manager

,先安装这个库,然后调用对应的方法即可。

  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. from webdriver_manager.chrome import ChromeDriverManager
  4. browser = webdriver.Chrome(ChromeDriverManager().install())
  5. browser.get('http://www.baidu.com')
  6. search = browser.find_element_by_id('kw')
  7. search.send_keys('python')
  8. search.send_keys(Keys.ENTER)
  9. # 关闭浏览器
  10. browser.close()

在上述代码中,

  1. ChromeDriverManager().install()

方法就是自动安装驱动的操作,它会自动获取当前浏览器的版本并去下载对应的驱动到本地。

  1. ====== WebDriver manager ======
  2. Current google-chrome version is 96.0.4664
  3. Get LATEST chromedriver version for 96.0.4664 google-chrome
  4. There is no [win32] chromedriver for browser in cache
  5. Trying to download new driver from https://chromedriver.storage.googleapis.com/96.0.4664.45/chromedriver_win32.zip
  6. Driver has been saved in cache [C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45]

如果本地已经有该浏览器渠道,则会提示其已存在。

  1. ====== WebDriver manager ======
  2. Current google-chrome version is 96.0.4664
  3. Get LATEST driver version for 96.0.4664
  4. Driver [C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe] found in cache

搞定以上准备工作,我们就可以开始本文正式内容的学习啦~

1. 基本用法

这节我们就从初始化浏览器对象、访问页面、设置浏览器大小、刷新页面和前进后退等基础操作。

1.1. 初始化浏览器对象

在准备工作部分我们提到需要将浏览器渠道添加到环境变量或者指定绝对路径,前者可以直接初始化后者则需要进行指定。

  1. from selenium import webdriver
  2. # 初始化浏览器为chrome浏览器
  3. browser = webdriver.Chrome()
  4. # 指定绝对路径的方式
  5. path = r'C:\Users\Gdc\.wdm\drivers\chromedriver\win32\96.0.4664.45\chromedriver.exe'
  6. browser = webdriver.Chrome(path)
  7. # 关闭浏览器
  8. browser.close()

初始化浏览器对象

可以看到以上是有界面的浏览器,我们还可以初始化浏览器为无界面的浏览器

  1. from selenium import webdriver
  2. # 无界面的浏览器
  3. option = webdriver.ChromeOptions()
  4. option.add_argument("headless")
  5. browser = webdriver.Chrome(options=option)
  6. # 访问百度首页
  7. browser.get(r'https://www.baidu.com/')
  8. # 截图预览
  9. browser.get_screenshot_as_file('截图.png')
  10. # 关闭浏览器
  11. browser.close()

截图

完成浏览器对象的初始化后并将其赋值给了

  1. browser

对象,接下来我们就可以调用

  1. browser

来执行各种方法模拟浏览器的操作了。

1.2. 访问页面

进行页面访问使用的是

  1. get

方法,传入参数为待访问页面的

  1. URL

地址即可。

  1. from selenium import webdriver
  2. # 初始化浏览器为chrome浏览器
  3. browser = webdriver.Chrome()
  4. # 访问百度首页
  5. browser.get(r'https://www.baidu.com/')
  6. # 关闭浏览器
  7. browser.close()

1.3. 设置浏览器大小

  1. set_window_size()

方法可以用来设置浏览器大小(就是分辨率),而

  1. maximize_window

则是设置浏览器为全屏!

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. # 设置浏览器大小:全屏
  5. browser.maximize_window()
  6. browser.get(r'https://www.baidu.com')
  7. time.sleep(2)
  8. # 设置分辨率 500*500
  9. browser.set_window_size(500,500)
  10. time.sleep(2)
  11. # 设置分辨率 1000*800
  12. browser.set_window_size(1000,800)
  13. time.sleep(2)
  14. # 关闭浏览器
  15. browser.close()

这里就不截图了,大家自行演示看效果哈~

1.4. 刷新页面

刷新页面是我们在浏览器操作时很常用的操作,这里

  1. refresh()

方法可以用来进行浏览器页面刷新。

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. # 设置浏览器全屏
  5. browser.maximize_window()
  6. browser.get(r'https://www.baidu.com')
  7. time.sleep(2)
  8. try:
  9. # 刷新页面
  10. browser.refresh()
  11. print('刷新页面')
  12. except Exception as e:
  13. print('刷新失败')
  14. # 关闭浏览器
  15. browser.close()

大家也是自行演示看效果哈,同

  1. F5

快捷键。

1.5. 前进后退

前进后退也是我们在使用浏览器时非常常见的操作,这里

  1. forward()

方法可以用来实现前进,

  1. back()

可以用来实现后退。

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. # 设置浏览器全屏
  5. browser.maximize_window()
  6. browser.get(r'https://www.baidu.com')
  7. time.sleep(2)
  8. # 打开淘宝页面
  9. browser.get(r'https://www.taobao.com')
  10. time.sleep(2)
  11. # 后退到百度页面
  12. browser.back()
  13. time.sleep(2)
  14. # 前进的淘宝页面
  15. browser.forward()
  16. time.sleep(2)
  17. # 关闭浏览器
  18. browser.close()

2. 获取页面基础属性

当我们用

  1. selenium

打开某个页面,有一些基础属性如网页标题、网址、浏览器名称、页面源码等信息。

  1. from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. browser.get(r'https://www.baidu.com')
  4. # 网页标题
  5. print(browser.title)
  6. # 当前网址
  7. print(browser.current_url)
  8. # 浏览器名称
  9. print(browser.name)
  10. # 网页源码
  11. print(browser.page_source)

输出如下:

  1. 百度一下,你就知道
  2. https://www.baidu.com/
  3. chrome
  4. <html><head><script async="" src="https://passport.baidu.com/passApi/js/wrapper.js?cdnversion=1640515789507&amp;_=1640515789298"></script><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color"..."

需要注意的是,这里的页面源码我们就可以用

  1. 正则表达式

  1. Bs4

  1. xpath

以及

  1. pyquery

等工具进行解析提取想要的信息了。

3. 定位页面元素

我们在实际使用浏览器的时候,很重要的操作有输入文本、点击确定等等。对此,

  1. Selenium

提供了一系列的方法来方便我们实现以上操作。常说的

  1. 8

定位页面元素的操作方式,我们一一演示一下!

我们以百度首页的搜索框节点为例,搜索python

搜索框

搜索框的

  1. html

结构:

  1. <input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

3.1. id定位

  1. find_element_by_id()

根据

  1. id

属性获取,这里

  1. id

属性是

  1. kw
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 在搜索框输入 python
  7. browser.find_element_by_id('kw').send_keys('python')
  8. time.sleep(2)
  9. # 关闭浏览器
  10. browser.close()

3.2. name定位

  1. find_element_by_name()

根据

  1. name

属性获取,这里

  1. name

属性是

  1. wd
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 在搜索框输入 python
  7. browser.find_element_by_name('wd').send_keys('python')
  8. time.sleep(2)
  9. # 关闭浏览器
  10. browser.close()

3.3. class定位

  1. find_element_by_class_name()

根据

  1. class

属性获取,这里

  1. class

属性是

  1. s_ipt
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 在搜索框输入 python
  7. browser.find_element_by_class_name('s_ipt').send_keys('python')
  8. time.sleep(2)
  9. # 关闭浏览器
  10. browser.close()

3.4. tag定位

我们知道

  1. HTML

是通过

  1. tag

来定义功能的,比如

  1. input

是输入,

  1. table

是表格等等。每个元素其实就是一个

  1. tag

,一个

  1. tag

往往用来定义一类功能,我们查看百度首页的

  1. html

代码,可以看到有很多同类

  1. tag

,所以其实很难通过

  1. tag

去区分不同的元素。

  1. find_element_by_tag_name()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 在搜索框输入 python
  7. browser.find_element_by_tag_name('input').send_keys('python')
  8. time.sleep(2)
  9. # 关闭浏览器
  10. browser.close()

由于存在多个

  1. input

,以上代码会报错。

3.5. link定位

这种方法顾名思义就是用来定位文本链接的,比如百度首页上方的分类模块链接。

  1. find_element_by_link_text()

以新闻为例

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 点击新闻 链接
  7. browser.find_element_by_link_text('新闻').click()
  8. time.sleep(2)
  9. # 关闭浏览器全部页面
  10. browser.quit()

3.6. partial定位

有时候一个超链接的文本很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。

  1. find_element_by_partial_link_text()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 点击新闻 链接
  7. browser.find_element_by_partial_link_text('闻').click()
  8. time.sleep(2)
  9. # 关闭浏览器全部页面
  10. browser.quit()

3.7. xpath定位

前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一

  1. id

  1. name

  1. class

  1. 超链接文本

的属性,那么我们就可以通过这个唯一的属性值来定位他们。

但是在实际工作中并非有这么美好,那么这个时候我们就只能通过

  1. xpath

或者

  1. css

来定位了。

  1. find_element_by_xpath()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 在搜索框输入 python
  7. browser.find_element_by_xpath("//*[@id='kw']").send_keys('python')
  8. time.sleep(2)
  9. # 关闭浏览器
  10. browser.close()

3.8. css定位

这种方法相对

  1. xpath

要简洁些,定位速度也要快些。

  1. find_element_by_css_selector()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 在搜索框输入 python
  7. browser.find_element_by_css_selector('#kw').send_keys('python')
  8. time.sleep(2)
  9. # 关闭浏览器
  10. browser.close()

3.9. find_element的By定位

除了上述的

  1. 8

种定位方法,

  1. Selenium

还提供了一个通用的方法

  1. find_element()

,这个方法有两个参数:定位方式和定位值。

  1. # 使用前先导入By类
  2. from selenium.webdriver.common.by import By

以上的操作可以等同于以下:

  1. browser.find_element(By.ID,'kw')
  2. browser.find_element(By.NAME,'wd')
  3. browser.find_element(By.CLASS_NAME,'s_ipt')
  4. browser.find_element(By.TAG_NAME,'input')
  5. browser.find_element(By.LINK_TEXT,'新闻')
  6. browser.find_element(By.PARTIAL_LINK_TEXT,'闻')
  7. browser.find_element(By.XPATH,'//*[@id="kw"]')
  8. browser.find_element(By.CSS_SELECTOR,'#kw')

3.10. 多个元素

如果定位的目标元素在网页中不止一个,那么则需要用到

  1. find_elements

,得到的结果会是列表形式。简单来说,就是

  1. element

后面多了复数标识

  1. s

,其他操作一致。

4. 获取页面元素属性

既然我们有很多方式来定位页面的元素,那么接下来就可以考虑获取以下元素的属性了,尤其是用

  1. Selenium

进行网络爬虫的时候。

4.1. get_attribute获取属性

以百度首页的logo为例,获取logo相关属性

  1. <img hidefocus="true" id="s_lg_img" class="index-logo-src" src="//www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png" width="270" height="129" onerror="this.src='//www.baidu.com/img/flexible/logo/pc/index.png';this.onerror=null;" usemap="#mp">

获取logo的图片地址

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. logo = browser.find_element_by_class_name('index-logo-src')
  6. print(logo)
  7. print(logo.get_attribute('src'))
  8. # 关闭浏览器
  9. browser.close()

输出:

  1. <selenium.webdriver.remote.webelement.WebElement (session="e95b18c43a330745af019e0041f0a8a4", element="7dad5fc0-610b-45b6-b543-9e725ee6cc5d")>
  2. https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png

4.2. 获取文本

以热榜为例,获取热榜文本和链接

  1. <a class="title-content tag-width c-link c-font-medium c-line-clamp1" href="https://www.baidu.com/s?cl=3&amp;tn=baidutop10&amp;fr=top1000&amp;wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&amp;rsv_idx=2&amp;rsv_dl=fyb_n_homepage&amp;sa=fyb_n_homepage&amp;hisfilter=1" target="_blank"><span class="title-content-index c-index-single c-index-single-hot1">1</span><span class="title-content-title">各地贯彻十九届六中全会精神纪实</span></a>

获取热榜的文本,用的是

  1. text

属性,直接调用即可

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. logo = browser.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(1) > a')
  6. print(logo.text)
  7. print(logo.get_attribute('href'))
  8. # 关闭浏览器
  9. browser.close()

输出:

  1. 1各地贯彻十九届六中全会精神纪实
  2. https://www.baidu.com/s?cl=3&tn=baidutop10&fr=top1000&wd=%E5%90%84%E5%9C%B0%E8%B4%AF%E5%BD%BB%E5%8D%81%E4%B9%9D%E5%B1%8A%E5%85%AD%E4%B8%AD%E5%85%A8%E4%BC%9A%E7%B2%BE%E7%A5%9E%E7%BA%AA%E5%AE%9E&rsv_idx=2&rsv_dl=fyb_n_homepage&sa=fyb_n_homepage&hisfilter=1

4.3. 获取其他属性

除了属性和文本值外,还有id、位置、标签名和大小等属性。

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. logo = browser.find_element_by_class_name('index-logo-src')
  6. print(logo.id)
  7. print(logo.location)
  8. print(logo.tag_name)
  9. print(logo.size)
  10. # 关闭浏览器
  11. browser.close()

输出:

  1. 6af39c9b-70e8-4033-8a74-7201ae09d540
  2. {'x': 490, 'y': 46}
  3. img
  4. {'height': 129, 'width': 270}

5. 页面交互操作

页面交互就是在浏览器的各种操作,比如上面演示过的输入文本、点击链接等等,还有像清除文本、回车确认、单选框与多选框选中等。

5.1. 输入文本

其实,在之前的小节中我们有用过此操作。

  1. send_keys()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 定位搜索框
  7. input = browser.find_element_by_class_name('s_ipt')
  8. # 输入python
  9. input.send_keys('python')
  10. time.sleep(2)
  11. # 关闭浏览器
  12. browser.close()

5.2. 点击

同样,我们也用过这个点击操作。

  1. click()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 选中新闻按钮
  7. click = browser.find_element_by_link_text('新闻')
  8. # 点击之
  9. click.click()
  10. time.sleep(2)
  11. # 关闭浏览器全部页面
  12. browser.quit()

5.3. 清除文本

既然有输入,这里也就有清除文本啦。

  1. clear()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 定位搜索框
  7. input = browser.find_element_by_class_name('s_ipt')
  8. # 输入python
  9. input.send_keys('python')
  10. time.sleep(2)
  11. # 清除python
  12. input.clear()
  13. time.sleep(2)
  14. # 关闭浏览器
  15. browser.close()

5.4. 回车确认

比如,在搜索框输入文本

  1. python

,然后回车就出查询操作结果的情况。

  1. submit()
  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get(r'https://www.baidu.com')
  5. time.sleep(2)
  6. # 定位搜索框
  7. input = browser.find_element_by_class_name('s_ipt')
  8. # 输入python
  9. input.send_keys('python')
  10. time.sleep(2)
  11. # 回车查询
  12. input.submit()
  13. time.sleep(5)
  14. # 关闭浏览器
  15. browser.close()

5.5. 单选

单选比较好操作,先定位需要单选的某个元素,然后点击一下即可。

5.6. 多选

多选好像也比较容易,依次定位需要选择的元素,点击即可。

5.7. 下拉框

下拉框的操作相对复杂一些,需要用到

  1. Select

模块。

先导入该类

  1. from selenium.webdriver.support.select import Select

  1. select

模块中有以下定位方法

  1. '''1、三种选择某一选项项的方法'''
  2. select_by_index() # 通过索引定位;注意:index索引是从“0”开始。
  3. select_by_value() # 通过value值定位,value标签的属性值。
  4. select_by_visible_text() # 通过文本值定位,即显示在下拉框的值。
  5. '''2、三种返回options信息的方法'''
  6. options # 返回select元素所有的options
  7. all_selected_options # 返回select元素中所有已选中的选项
  8. first_selected_options # 返回select元素中选中的第一个选项
  9. '''3、四种取消选中项的方法'''
  10. deselect_all # 取消全部的已选择项
  11. deselect_by_index # 取消已选中的索引项
  12. deselect_by_value # 取消已选中的value值
  13. deselect_by_visible_text # 取消已选中的文本值

我们来进行演示一波,由于暂时没找到合适的网页,我这边写了一个简单的网页本地测试(文件存为 帅哥.html)

  1. <html>
  2. <body>
  3. <form>
  4. <select name="帅哥">
  5. <option value="才哥">才哥</option>
  6. <option value="小明" selected="">小明</option>
  7. <option value="小华">小华</option>
  8. <option value="草儿">小草</option>
  9. </select>
  10. </form>
  11. </body>
  12. </html>

然后,再演示下拉框的不同选择的方式

  1. from selenium import webdriver
  2. from selenium.webdriver.support.select import Select
  3. import time
  4. url = 'file:///C:/Users/Gdc/Desktop/帅哥.html'
  5. browser = webdriver.Chrome()
  6. browser.get(url)
  7. time.sleep(2)
  8. # 根据索引选择
  9. Select(browser.find_element_by_name("帅哥")).select_by_index("2")
  10. time.sleep(2)
  11. # 根据value值选择
  12. Select(browser.find_element_by_name("帅哥")).select_by_value("草儿")
  13. time.sleep(2)
  14. # 根据文本值选择
  15. Select(browser.find_element_by_name("帅哥")).select_by_visible_text("才哥")
  16. time.sleep(2)
  17. # 关闭浏览器
  18. browser.close()

下拉框

6. 多窗口切换

比如同一个页面的不同子页面的节点元素获取操作,不同选项卡之间的切换以及不同浏览器窗口之间的切换操作等等。

6.1. Frame切换

  1. Selenium

打开一个页面之后,默认是在父页面进行操作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则需要切换到子页面进行擦走,这时候

  1. switch_to.frame()

就来了。如果想回到父页面,用

  1. switch_to.parent_frame()

即可。

6.2. 选项卡切换

我们在访问网页的时候会打开很多个页面,在

  1. Selenium

中提供了一些方法方便我们对这些页面进行操作。

  1. current_window_handle

:获取当前窗口的句柄。

  1. window_handles

:返回当前浏览器的所有窗口的句柄。

  1. switch_to_window()

:用于切换到对应的窗口。

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. # 打开百度
  5. browser.get('http://www.baidu.com')
  6. # 新建一个选项卡
  7. browser.execute_script('window.open()')
  8. print(browser.window_handles)
  9. # 跳转到第二个选项卡并打开知乎
  10. browser.switch_to.window(browser.window_handles[1])
  11. browser.get('http://www.zhihu.com')
  12. # 回到第一个选项卡并打开淘宝(原来的百度页面改为了淘宝)
  13. time.sleep(2)
  14. browser.switch_to.window(browser.window_handles[0])
  15. browser.get('http://www.taobao.com')

7. 模拟鼠标操作

既然是模拟浏览器操作,自然也就需要能模拟鼠标的一些操作了,这里需要导入

  1. ActionChains

类。

  1. from selenium.webdriver.common.action_chains import ActionChains

7.1. 左键

这个其实就是页面交互操作中的点击

  1. click()

操作。

7.2. 右键

  1. context_click()
  1. from selenium.webdriver.common.action_chains import ActionChains
  2. from selenium import webdriver
  3. import time
  4. browser = webdriver.Chrome()
  5. browser.get(r'https://www.baidu.com')
  6. time.sleep(2)
  7. # 定位到要右击的元素,这里选的新闻链接
  8. right_click = browser.find_element_by_link_text('新闻')
  9. # 执行鼠标右键操作
  10. ActionChains(browser).context_click(right_click).perform()
  11. time.sleep(2)
  12. # 关闭浏览器
  13. browser.close()

在上述操作中

  1. ActionChains(browser)

:调用

  1. ActionChains()

类,并将浏览器驱动

  1. browser

作为参数传入

  1. context_click(right_click)

:模拟鼠标双击,需要传入指定元素定位作为参数

  1. perform()

:执行

  1. ActionChains()

中储存的所有操作,可以看做是执行之前一系列的操作

7.3. 双击

  1. double_click()
  1. from selenium.webdriver.common.action_chains import ActionChains
  2. from selenium import webdriver
  3. import time
  4. browser = webdriver.Chrome()
  5. browser.get(r'https://www.baidu.com')
  6. time.sleep(2)
  7. # 定位到要双击的元素
  8. double_click = browser.find_element_by_css_selector('#bottom_layer > div > p:nth-child(8) > span')
  9. # 双击
  10. ActionChains(browser).double_click(double_click).perform()
  11. time.sleep(15)
  12. # 关闭浏览器
  13. browser.close()

7.4. 拖拽

  1. drag_and_drop(source,target)

拖拽操作嘛,开始位置和结束位置需要被指定,这个常用于滑块类验证码的操作之类。

我们以菜鸟教程的一个案例来进行演示

https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable

  1. from selenium.webdriver.common.action_chains import ActionChains
  2. from selenium import webdriver
  3. import time
  4. browser = webdriver.Chrome()
  5. url = 'https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
  6. browser.get(url)
  7. time.sleep(2)
  8. browser.switch_to.frame('iframeResult')
  9. # 开始位置
  10. source = browser.find_element_by_css_selector("#draggable")
  11. # 结束位置
  12. target = browser.find_element_by_css_selector("#droppable")
  13. # 执行元素的拖放操作
  14. actions = ActionChains(browser)
  15. actions.drag_and_drop(source, target)
  16. actions.perform()
  17. # 拖拽
  18. time.sleep(15)
  19. # 关闭浏览器
  20. browser.close()

拖拽

7.5. 悬停

  1. move_to_element()
  1. from selenium.webdriver.common.action_chains import ActionChains
  2. from selenium import webdriver
  3. import time
  4. browser = webdriver.Chrome()
  5. url = 'https://www.baidu.com'
  6. browser.get(url)
  7. time.sleep(2)
  8. # 定位悬停的位置
  9. move = browser.find_element_by_css_selector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap > span.soutu-btn")
  10. # 悬停操作
  11. ActionChains(browser).move_to_element(move).perform()
  12. time.sleep(5)
  13. # 关闭浏览器
  14. browser.close()

悬停效果

8. 模拟键盘操作

  1. selenium

中的

  1. Keys()

类提供了大部分的键盘操作方法,通过

  1. send_keys()

方法来模拟键盘上的按键。

引入

  1. Keys

  1. from selenium.webdriver.common.keys import Keys

常见的键盘操作

  1. send_keys(Keys.BACK_SPACE)

:删除键(BackSpace)

  1. send_keys(Keys.SPACE)

:空格键(Space)

  1. send_keys(Keys.TAB)

:制表键(TAB)

  1. send_keys(Keys.ESCAPE)

:回退键(ESCAPE)

  1. send_keys(Keys.ENTER)

:回车键(ENTER)

  1. send_keys(Keys.CONTRL,'a')

:全选(Ctrl+A)

  1. send_keys(Keys.CONTRL,'c')

:复制(Ctrl+C)

  1. send_keys(Keys.CONTRL,'x')

:剪切(Ctrl+X)

  1. send_keys(Keys.CONTRL,'v')

:粘贴(Ctrl+V)

  1. send_keys(Keys.F1)

:键盘F1

.....

  1. send_keys(Keys.F12)

:键盘F12

实例操作演示:

定位需要操作的元素,然后操作即可!

  1. from selenium.webdriver.common.keys import Keys
  2. from selenium import webdriver
  3. import time
  4. browser = webdriver.Chrome()
  5. url = 'https://www.baidu.com'
  6. browser.get(url)
  7. time.sleep(2)
  8. # 定位搜索框
  9. input = browser.find_element_by_class_name('s_ipt')
  10. # 输入python
  11. input.send_keys('python')
  12. time.sleep(2)
  13. # 回车
  14. input.send_keys(Keys.ENTER)
  15. time.sleep(5)
  16. # 关闭浏览器
  17. browser.close()

9. 延时等待

如果遇到使用

  1. ajax

加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在

  1. get

方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。

三种方式可以来玩玩:强制等待、隐式等待和显式等待

9.1. 强制等待

就很简单了,直接

  1. time.sleep(n)

强制等待n秒,在执行

  1. get

方法之后执行。

9.2. 隐式等待

  1. implicitly_wait()

设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。

  1. from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. # 隐式等待,等待时间10秒
  4. browser.implicitly_wait(10)
  5. browser.get('https://www.baidu.com')
  6. print(browser.current_url)
  7. print(browser.title)
  8. # 关闭浏览器
  9. browser.close()

9.3. 显式等待

设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。

  1. from selenium import webdriver
  2. from selenium.webdriver.support.wait import WebDriverWait
  3. from selenium.webdriver.support import expected_conditions as EC
  4. from selenium.webdriver.common.by import By
  5. import time
  6. browser = webdriver.Chrome()
  7. browser.get('https://www.baidu.com')
  8. # 设置等待时间10s
  9. wait = WebDriverWait(browser, 10)
  10. # 设置判断条件:等待id='kw'的元素加载完成
  11. input = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
  12. # 在关键词输入:关键词
  13. input.send_keys('Python')
  14. # 关闭浏览器
  15. time.sleep(2)
  16. browser.close()

WebDriverWait的参数说明

  1. WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
  1. driver

: 浏览器驱动

  1. timeout

: 超时时间,等待的最长时间(同时要考虑隐性等待时间)

  1. poll_frequency

: 每次检测的间隔时间,默认是0.5秒

  1. ignored_exceptions

:超时后的异常信息,默认情况下抛出

  1. NoSuchElementException

异常

until(method,message='')

  1. method

: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False

  1. message

: 如果超时,抛出

  1. TimeoutException

,将

  1. message

传入异常

until_not(method,message='')

  1. until_not

  1. until

相反,

  1. until

是当某元素出现或什么条件成立则继续执行,

  1. until_not

是当某元素消失或什么条件不成立则继续执行,参数也相同。

其他等待条件

  1. from selenium.webdriver.support import expected_conditions as EC
  2. # 判断标题是否和预期的一致
  3. title_is
  4. # 判断标题中是否包含预期的字符串
  5. title_contains
  6. # 判断指定元素是否加载出来
  7. presence_of_element_located
  8. # 判断所有元素是否加载完成
  9. presence_of_all_elements_located
  10. # 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0,传入参数是元组类型的locator
  11. visibility_of_element_located
  12. # 判断元素是否可见,传入参数是定位后的元素WebElement
  13. visibility_of
  14. # 判断某个元素是否不可见,或是否不存在于DOM树
  15. invisibility_of_element_located
  16. # 判断元素的 text 是否包含预期字符串
  17. text_to_be_present_in_element
  18. # 判断元素的 value 是否包含预期字符串
  19. text_to_be_present_in_element_value
  20. #判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
  21. frame_to_be_available_and_switch_to_it
  22. #判断是否有alert出现
  23. alert_is_present
  24. #判断元素是否可点击
  25. element_to_be_clickable
  26. # 判断元素是否被选中,一般用在下拉列表,传入WebElement对象
  27. element_to_be_selected
  28. # 判断元素是否被选中
  29. element_located_to_be_selected
  30. # 判断元素的选中状态是否和预期一致,传入参数:定位后的元素,相等返回True,否则返回False
  31. element_selection_state_to_be
  32. # 判断元素的选中状态是否和预期一致,传入参数:元素的定位,相等返回True,否则返回False
  33. element_located_selection_state_to_be
  34. #判断一个元素是否仍在DOM中,传入WebElement对象,可以判断页面是否刷新了
  35. staleness_of

10. 其他

补充一些

10.1. 运行JavaScript

还有一些操作,比如下拉进度条,模拟

  1. javaScript

,使用

  1. execute_script

方法来实现。

  1. from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. # 知乎发现页
  4. browser.get('https://www.zhihu.com/explore')
  5. browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
  6. browser.execute_script('alert("To Bottom")')

10.2. Cookie

  1. selenium

使用过程中,还可以很方便对

  1. Cookie

进行获取、添加与删除等操作。

  1. from selenium import webdriver
  2. browser = webdriver.Chrome()
  3. # 知乎发现页
  4. browser.get('https://www.zhihu.com/explore')
  5. # 获取cookie
  6. print(f'Cookies的值:{browser.get_cookies()}')
  7. # 添加cookie
  8. browser.add_cookie({'name':'才哥', 'value':'帅哥'})
  9. print(f'添加后Cookies的值:{browser.get_cookies()}')
  10. # 删除cookie
  11. browser.delete_all_cookies()
  12. print(f'删除后Cookies的值:{browser.get_cookies()}')

输出:

  1. Cookies的值:[{'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com', ...]
  2. 添加后Cookies的值:[{'domain': 'www.zhihu.com', 'httpOnly': False, 'name': '才哥', 'path': '/', 'secure': True, 'value': '帅哥'}, {'domain': '.zhihu.com', 'httpOnly': False, 'name': 'Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49', 'path': '/', 'secure': False, 'value': '1640537860'}, {'domain': '.zhihu.com',...]
  3. 删除后Cookies的值:[]

以上就是本次有关

  1. Selenium

的全部内容,后续我们将演示

  1. Selenium

爬虫以及web自动化方面的一些实战案例,敬请期待!

需要完整版PDF,请私博主!


本文转载自: https://blog.csdn.net/npm_run_dev__/article/details/126878317
版权归原作者 npm_run_dev__ 所有, 如有侵权,请联系我们删除。

“爬虫神器Selenium傻瓜教程,看了直呼牛掰”的评论:

还没有评论