Python爬虫基础之Selenium详解

目录

  • 1. Selenium简介
  • 2. 为什么使用Selenium?
  • 3. Selenium的安装
  • 4. Selenium的使用
  • 5. Selenium的元素定位
  • 6. Selenium的交互
  • 7. Chrome handless
  • 参考文献

原文地址:https://program-park.top/2023/10/16/reptile_3/

本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关。

1. Selenium简介

  Selenium 是一个用于 Web 应用程序测试的工具。最初是为网站自动化测试而开发的,可以直接运行在浏览器上,支持的浏览器包括 IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera 和 Edge 等。
  爬虫中使用它是为了解决 requests 无法直接执行 JavaScript 代码的问题。Selenium 本质上是通过驱动浏览器,彻底模拟浏览器的操作,好比跳转、输入、点击、下拉等,来拿到网页渲染之后的结果。Selenium 是 Python 的一个第三方库,对外提供的接口能够操作浏览器,从而让浏览器完成自动化的操作。

2. 为什么使用Selenium?

  Selenium 能模拟浏览器功能自动执行网页中的 JavaScript 代码,实现动态加载。

3. Selenium的安装

  谷歌浏览器驱动下载地址:https://registry.npmmirror.com/binary.html?path=chromedriver/
  查看自己谷歌浏览器的版本,我这里的版本是正式版本116.0.5845.188,驱动下载地址最新的只有114.0.5735.90,所以只能去官网的测试页面下载118.0.5993.70版本的驱动(https://googlechromelabs.github.io/chrome-for-testing/#stable,版本向下兼容),然后把下载的压缩包解压,将exe文件放入 PyCharm 项目的根目录下。
  之后执行pip install selenium命令,安装 selenium 库。

4. Selenium的使用

from selenium import webdriver# 创建浏览器操作对象
path = 'chromedriver.exe'
browser= webdriver.Chrome(path)# 访问网站
url = 'https://www.baidu.com'browser.get(url)
# content = browser.page_source
# print(content)

  需要注意的是,如果你的 selenium 是4.11.2以上的版本,不需要设置driver.exe的路径,selenium 可以自己处理浏览器的驱动程序,因此代码直接改为brower = webdriver.Chrome()即可。
  运行代码,得到下面的效果:

5. Selenium的元素定位

  自动化工具要做的就是模拟鼠标和键盘来操作点击、输入等等元素,但是操作这些元素的前提是找到它们,WebDriver 提供了很多元素定位的方法:

  • 根据标签 id 获取元素:
    from selenium import webdriver
    from selenium.webdriver.common.by import By# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser= webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)button = browser.find_element(By.ID, 'su')
    # button = browser.find_elements(By.ID, 'su')
    print(button)
    
  • 根据标签 name 属性的值获取元素:
    button = browser.find_element(By.NAME, 'wd')
    print(button)
    
  • 根据 Xpath 语句获取元素;
    button = browser.find_element(By.XPATH, '//input[@id="su"]')
    print(button)
    
  • 根据标签名获取元素:
    button = browser.find_elements(By.TAG_NAME, 'input')
    print(button)
    
  • 根据 bs4 语法获取元素:
    button = browser.find_elements(By.CSS_SELECTOR, '#su')
    print(button)
    
  • 根据标签的文本获取元素(精确定位):
    button = browser.find_elements(By.LINK_TEXT, '地图')
    print(button)
    
  • 根据标签的文本获取元素(模糊定位):
    button = browser.find_elements(By.PARTIAL_LINK_TEXT, '地')
    print(button)
    
  • 根据 class 属性获取元素:
    button = browser.find_element(By.CLASS_NAME, 'wrapper_new')
    print(button)
    

  当我们定位到元素之后,自然就要考虑如何获取到元素的各种信息,selenium 给我们提供了获取元素不同信息的方法:

  • 获取元素属性:
    from selenium import webdriver
    from selenium.webdriver.common.by import By# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser= webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)button = browser.find_element(By.ID, 'su')
    print(input.get_attribute('class'))
    
  • 获取元素标签名:
    input = browser.find_element(By.ID, 'su')
    print(input.tag_name)
    
  • 获取元素文本:
    input = browser.find_element(By.ID, 'su')
    print(input.text)
    
  • 获取元素位置:
    input = browser.find_element(By.ID, 'su')
    print(input.location)
    
  • 获取元素大小:
    input = browser.find_element(By.ID, 'su')
    print(input.size)
    

6. Selenium的交互

  页面交互指的是我们平时在浏览器上的各种操作,比如输入文本、点击链接、回车、下拉框等,下面就演示 selenium 是如何进行页面交互的。

  • 输入文本:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser = webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)# 定位输入框
    input = browser.find_element(By.ID, 'kw')
    # 输入文本selenium
    input.send_keys('selenium')
    time.sleep(2)# 关闭浏览器
    browser.close()
    
  • 点击:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser = webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)# 定位输入框
    input = browser.find_element(By.ID, 'kw')
    # 输入文本selenium
    input.send_keys('selenium')
    time.sleep(2)# 定位百度一下的按钮
    button = browser.find_element(By.ID, 'su')
    # 点击按钮
    button.click()
    time.sleep(2)# 关闭浏览器
    browser.close()
    
  • 清除文本:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser = webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)# 定位输入框
    input = browser.find_element(By.ID, 'kw')
    # 输入文本selenium
    input.send_keys('selenium')
    time.sleep(2)# 清除selenium
    input.clear()
    time.sleep(2)# 关闭浏览器
    browser.close()
    
  • 回车确认:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser = webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)# 定位输入框
    input = browser.find_element(By.ID, 'kw')
    # 输入文本selenium
    input.send_keys('selenium')
    time.sleep(2)# 回车查询
    input.submit()
    time.sleep(2)# 关闭浏览器
    browser.close()
    
  • 运行 JavaScript:
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser = webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)# 定位输入框
    input = browser.find_element(By.ID, 'kw')
    # 输入文本selenium
    input.send_keys('selenium')
    time.sleep(2)# 回车查询
    input.submit()
    time.sleep(2)# js代码
    js_bottom = 'document.documentElement.scrollTop=100000'
    # 下拉进度条,页面滑动
    browser.execute_script(js_bottom)
    time.sleep(2)# 关闭浏览器
    browser.close()
    
  • 前进后退
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time# 创建浏览器操作对象
    # path = 'chromedriver.exe'
    browser = webdriver.Chrome()# 访问网站
    url = 'https://www.baidu.com'
    browser.get(url)# 定位输入框
    input = browser.find_element(By.ID, 'kw')
    # 输入文本selenium
    input.send_keys('selenium')
    time.sleep(2)# 回车查询
    input.submit()
    time.sleep(2)# js代码
    js_bottom = 'document.documentElement.scrollTop=100000'
    # 页面滑动
    browser.execute_script(js_bottom)
    time.sleep(2)# 定位下一页的按钮
    next = browser.find_element(By.XPATH, '//a[@class="n"]')
    # 点击下一页
    next.click()
    time.sleep(2)# 返回到上一页面
    browser.back()
    time.sleep(2)# 前进到下一页
    browser.forward()
    time.sleep(2)# 关闭浏览器
    browser.close()
    

7. Chrome handless

  在上面的测试过程中可以发现,虽然 selenium 简便好用,但是它的运行速度很慢,这是因为 selenium 是有界面的,需要执行前端 css 和 js 的渲染。那么下面就介绍一个无界面的浏览器,Chrome-handless 模式,运行效率要比真实的浏览器快很多,在 selenium 的基础上,支持页面元素查找、js 执行等,代码和 selenium 一致。
  使用前提:

  • Chrome
    • Unix\Linux chrome >= 59
    • Windows chrome >= 60
  • Python >= 3.6
  • Selenium >= 3.4.*
from selenium import webdriverdef share_browser():# headless自带配置,不需要再做额外的修改from selenium.webdriver.chrome.options import Options# 初始化chrome_options = Options()chrome_options.add_argument('‐‐headless')chrome_options.add_argument('‐‐disable‐gpu')# 谷歌浏览器的安装路径path = r'C:\Users\\AppData\Local\Google\Chrome\Application\chrome.exe'chrome_options.binary_location = pathbrowser = webdriver.Chrome(options=chrome_options)return browserbrowser = share_browser()
url = 'https://www.baidu.com'
browser.get(url)# 本地保存照片
browser.save_screenshot('baidu.png')

参考文献

  【1】http://www.noobyard.com/article/p-boitcibx-g.html
  【2】https://www.jb51.net/article/149145.htm
  【3】https://zhuanlan.zhihu.com/p/462460461
  【4】https://blog.csdn.net/weixin_67553250/article/details/127555724
  【5】https://www.cnblogs.com/Summer-skr–blog/p/11491078.html
  【6】https://www.bilibili.com/video/BV1Db4y1m7Ho?p=77

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112966.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

左连接一对多的情况

左连接一对多时候,应该以主表唯一数据为左表 GROUP_CONCAT()

Flutter之Widget生命周期

目录 初始化构造函数initStatedidChangeDependencies 运行时builddidUpdateWidget 组件移除deactivatedisposereassemble 函数生命周期说明:实际场景App生命周期 前言:生命周期是一个组件加载到卸载的整个周期,熟悉生命周期可以让我们在合适的…

父组件与子组件的属性透传

透传是vue中一种特性,官方的解释是:“透传 attribute”指的是传递给一个组件,却没有被该组件声明为 props 或 emits 的 attribute 或者 v-on 事件监听器。最常见的例子就是 class、style 和 id。这句话解释过来就是一些不被prop定义的属性直接…

尚硅谷Flink(完)FlinkSQL

🧙FlinkSQL🏂🤺 Table API 和 SQL 是最上层的 API,在 Flink 中这两种 API 被集成在一起,SQL 执行的对象也是Flink 中的表(Table),所以我们一般会认为它们是一体的。 SQL API 是基于…

短视频矩阵系统源头开发

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统,目前是全国源头独立开发),开发功能大拆解分享,功能大拆解: 7大模型剪辑法(数学阶乘&#x…

openHarmony UI开发

常用组件和布局方式 组件 ArkUI有丰富的内置组件,包括文本、按钮、图片、进度条、输入框、单选框、多选框等。和布局一样,我们也可以将基础组件组合起来,形成自定义组件。 按钮: Button(Ok, { type: ButtonType.Normal, stateEf…

C# Onnx Yolov8 Detect 烟雾检测

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…

用Python解析HTML页面

用Python解析HTML页面 文章目录 用Python解析HTML页面HTML 页面的结构XPath 解析CSS 选择器解析简单的总结 在前面的课程中,我们讲到了使用 request三方库获取网络资源,还介绍了一些前端的基础知识。接下来,我们继续探索如何解析 HTML 代码&…

Python超入门(5)__迅速上手操作掌握Python

# 20.列表# 一维列表 names [Hash, Bob, Nick] print(names) # 全打印 print(names[:]) # 全打印 print(names[1:3]) # 打印1到2号索引 print(names[:2]) # 打印0到1号索引[Hash, Bob, Nick] [Hash, Bob, Nick] [Bob, Nick] [Hash, Bob]# 二维列表:一维列表中嵌套一维列表…

R语言:因子分析 factor analysis

文章目录 因子分析数据集处理步骤主成分法做因子分析最大似然法做因子分析 因子分析 因子分析的用途与主成分分析类似,它也是一种降维方法。由于因子往往比主成分更易得到解释,故因子分析比主成分分析更容易成功,从而有更广泛的应用。 从方法…

微前端二:qiankun

qiankun是基于Single-spa开发的框架,所以我们先来看下Single-spa是怎么做的: Single-spa 是最早的微前端框架,兼容多种前端技术栈,是一个将多个单页面应用聚合为一个整体应用的 JavaScript 微前端框架; 优点&#xf…

APP应用开发sdk版本过低可能性原因问题排查及解决方案

同学们,在移动 app 开发中,提示sdk版本过低缺找不到原因的情况都知道的吧哈哈哈,这个我觉得我有必要全面的分析和排查,让同学们看完这个文章都得以解决。这是我的初衷奈何地主家里也没有余粮呀(我也不能完全总结出来&a…

《动手学深度学习 Pytorch版》 8.7 通过时间反向传播

8.7.1 循环神经网络的梯度分析 本节主要探讨梯度相关问题,因此对模型及其表达式进行了简化,进行如下表示: h t f ( x t , h t − 1 , w h ) o t g ( h t , w o ) \begin{align} h_t&f(x_t,h_{t-1},w_h)\\ o_t&g(h_t,w_o) \end{ali…

用 Python 这样去创建词云不是更美嘛?

什么是词云?在网络上我们经常可以看到一张图片,上面有一大堆大小不一的文字,这便是词云。词云一般是根据输入的大量词语生成的,如果某个词语出现的次数越多,那么相应的大小就会越大。 Python 中有一个专门用来生成词云…

智慧公厕:打造未来城市公共设施的智慧选择

随着信息技术的不断发展,城市公共设施需要实现个性化、高效化和智能化,其中包括公共厕所。智慧公厕是一种结合物联网、互联网、人工智能、云计算、大数据和传感感知等技术的新型公厕,旨在提高公共厕所管理效率、跨区域跨系统的联网管理、自动…

【C++入门 一 】学习C++背景、开启C++奇妙之旅

目录 1.什么是C2. C的发展史3. C的重要性3.1 语言的使用广泛度3.2 在工作领域1. 操作系统以及大型系统软件开发2. 服务器端开发3. 游戏开发4. 嵌入式和物联网领域5. 数字图像处理6. 人工智能7. 分布式应用 3.3 在校招领域3.3.1 岗位需求3.3.2 笔试题 4. 如何学习C4.1 别人怎么学…

WAL 模式(PostgreSQL 14 Internals翻译版)

性能 当服务器正常运行时,WAL文件不断被写入磁盘。但是,这些写操作是顺序的:几乎没有随机访问,因此即使是HDD也可以处理这个任务。由于这种类型的加载与典型的数据文件访问非常不同,因此有必要为WAL文件设置一个单独的物理存储&a…

数据结构之堆

目录 前言 堆的概念与结构 堆的实现 堆的初始化 堆的销毁 堆的显示 堆的插入 堆的向上调整算法 堆的删除 堆的向下调整算法 堆的判空 获取堆顶元素 堆的数据个数 堆的创建 前言 二叉树的顺序结构存储即使用数组存储,而数组存储适用于完全二叉树&#xf…

【具身智能综述1】A Survey of Embodied AI: From Simulators to Research Tasks

论文标题:A Survey of Embodied AI: From Simulators to Research Tasks 论文作者:Jiafei Duan, Samson Yu, Hui Li Tan, Hongyuan Zhu, Cheston Tan 论文原文:https://arxiv.org/abs/2103.04918 论文出处:IEEE Transactions on E…

柯桥银泰附近有学德语的地方吗,留学德语培训

01 die Garantiefr jemandem/etwas 给某人或某事的保障 Das System bietet die Garantie fr die Bauer. 02 der Gebrauch von etwas 使用某物 Wir haben den Gebrauch vom Computer gelerbt. 我们学会了使用电脑。 03 Die Geduld mit jemandem/etwas 对..的耐心 Der Lehre…