爬虫(三)selenium

news2024/11/17 12:21:59

文章目录

  • 1. Selenium 安装
  • 2. Selenium 基本功能
    • 2.1 初始化浏览器
    • 2.2 其他功能
  • 3. 查找元素
    • 3.1 八大定位方法
    • 3.2 查找相对元素
    • 3.3 键盘事件
  • 4. 元素方法
  • 5. JS执行

运行环境:

selenium==4.7.2

1. Selenium 安装

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接在浏览器中运行,就像真实用户所做的一样。Selenium测试可以在Windows、Linux和Macintosh上的Internet Explorer、Chrome和Firefox中运行。其他测试工具都不能覆盖如此多的平台。使用Selenium和在浏览器中运行测试还有很多其他好处。

selenium安装首先要看Google浏览器的版本,点击谷歌浏览器右上的三个点 → \rightarrow 帮助 → \rightarrow 关于 Google Chrome,即可看到下面的版本号。
在这里插入图片描述
版本号只需要看前两位即可,比如我这里只需要记住版本号是 108.0 就行,然后到这里去下载对应版本号前两位的驱动,比如这里我下载两个 108.0 的驱动都行。
在这里插入图片描述
然后将下载的压缩包解压,得到 chromedriver.exe 就是我们要使用的驱动文件。

2. Selenium 基本功能

2.1 初始化浏览器

# 这里的executable_path是上面下载的浏览器驱动的路径
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

# 浏览器跳转到的网址
driver.get("https://www.baidu.com")

driver.quit()

2.2 其他功能

方法描述
driver.page_source获取当前页面的所有源码
driver.current_url获取当前页面的URL
driver.close()关闭当前标签页,如果只有一个标签页则关闭整个浏览器
driver.quit()关闭整个浏览器
driver.forward()页面前进
driver.back()页面前进
driver.save_screenshot(img_name)页面截图,并保存到 img_name
driver.maximize_window()最大化窗口
driver.minimize_window()最小化窗口
driver.fullscreen_window()全屏窗口,相当于按下F11
driver.minimize_window()最小化窗口
driver.get(url)跳转到URL
driver.switch_to.new_window('tab')如果是参数是 'tab',则打开一个新的标签页;如果是 'window',打开一个新的窗口
driver.current_window_handle获取当前窗口的句柄
driver.window_handles获取当前浏览器的所有窗口的句柄
driver.switch_to.window(param)切换到param对应的窗口

3. 查找元素

selenium既然是模拟浏览器,那么肯定也能对浏览器进行一些点击或者输入内容的操作了,当需要进行点击等操作时,第一个操作其实是找到点击或输入的元素,由此,下面我介绍集中常用的元素查询方式。

3.1 八大定位方法

在selenium4中,像 find_element_by_id 这种方法都被移除了,不建议使用,换为了 find_element 方法以及 find_elements 方法。两个方法其实用途都是差不多的,只不过前面一个方法只返回查询到的第一个元素,后一个方法会返回查询到的所有元素。在使用这两种方法时,首先需要在第一个参数中注明是依据什么进行查询,第二个参数才是需要进行查询的内容,具体描述如下。

查询方式描述
find_element(By.ID, 'kw')返回 id=kw 的元素
find_element(By.NAME, 'kw')返回 name=kw 的元素
find_element(By.CLASS_NAME, 'kw')返回 class=kw 的元素
find_element(By.TAG_NAME, 'div')HTML有许多的标签,如 div,span 等,返回标签为 div 的元素
find_element(By.LINK_TEXT, '新闻')Link表示包含有属性 href = “https://www.xxxxxxx.com” 的元素,可以通过linktext定位,linktext是页面上展示的文字
find_element(By.PARTIAL_LINK_TEXT, '新')可通过部分的linktext进行查询
find_element(By.XPATH, '/html/body/script[5]')通过Xpath语法进行查询
find_element(By.CSS_SELECTOR, '#www-home-right > div.www-home-silde')可通过部分的linktext进行查询

上述查询方式中,Xpath查询需要一点Xpath语法基础,可以看我的上一篇文章进行学习,CSS查询方式的话符号 . 代表 class, 符号 # 代表 id,符号 > 代表下一级子元素。

具体每个方法查询的地方如下图所示
在这里插入图片描述
下面是示例代码:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time


# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯')
# 点击id=su的元素(即搜索)
driver.find_element(By.ID, 'su').click()
# 获取当前窗口的句柄
a=driver.current_window_handle

# 打开一个新的标签页
driver.switch_to.new_window('tab')
driver.get("https://www.baidu.com")
driver.find_element(By.LINK_TEXT, '新闻').click()

# 切换到第二个窗口
driver.switch_to.window(driver.window_handles[1])
time.sleep(2)
# 切换到搜索香克斯的窗口
driver.switch_to.window(a)
time.sleep(3)

driver.quit()

3.2 查找相对元素

这是selenium4新增加的方法,相对定位器,这种定位器是从人肉眼的角度来区分位置。该定位器使用的方法如下:

方法描述
above()查找该元素上面的元素
below()查找该元素下面的元素
to_left_of()查找该元素上面的元素
to_right_of()查找该元素上面的元素
near()查找该元素附近的元素

比如以下的百度首页,我查询视频所在元素的右边元素,那么我们查找到的就不止有其右边的三个元素,还有下面相对其偏右的所有元素。

在这里插入图片描述
拿上图做例子,示例代码如下:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.relative_locator import with_tag_name
from selenium.webdriver.support.relative_locator import locate_with


s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

link = driver.find_element(By.LINK_TEXT, '视频')
# with_tag_name能够只找寻对应传入参数对应的标签名
ele1 = driver.find_elements(with_tag_name('a').to_right_of(link))
# 可以在locate_with中使用上面的八大定位方法
ele2 = driver.find_elements(locate_with(By.TAG_NAME, 'a').to_right_of(link))
print(ele1[1].text)
print(ele2[4].text)

driver.quit()

输出如下

网盘
开年元首外交传递中国声音

3.3 键盘事件

send_keys() 方法能够想指定元素输入字符串,其实,除此之外还可以输入更多的键盘操作。

键盘事件描述
send_keys(Keys.BACK_SPACE)删除键(BackSpace)
send_keys(Keys.SPACE)空格键(Space)
send_keys(Keys.TAB)制表键(Tab)
send_keys(Keys.ESCAPE)回退键(Esc)
send_keys(Keys.ENTER)回车键(Enter)
send_keys(Keys.CONTROL,'a')全选(Ctrl+A)
send_keys(Keys.CONTROL,'c')复制(Ctrl+C)
send_keys(Keys.CONTROL,'x')剪切(Ctrl+X)
send_keys(Keys.CONTROL,'v')粘贴(Ctrl+V)
send_keys(Keys.F1)键盘 F1

由此,上面的搜索我们完全可以不用单独查询搜索的元素并点击,只需要在输入后加个回车键即可,更改后如下:

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time


# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯', Keys.ENTER)

time.sleep(3)
driver.quit()

4. 元素方法

当使用 find_elements() 方法后,得到的是一个个的 WebElement 对象组成的列表,这些对象肯定是无法直接使用的,这里我来介绍下这些对象所具有的方法以及属性。

方法或属性描述
click()点击当前元素
get_attribute(name)获取对象属性比如 name 可以为 class,name,id等,如果 name='outerHTML' 则返回整个HTML元素
screenshot(file)获取当前元素的截图,保存为png
send_keys(value)给当前元素模拟输入
text获取当前元素的文本内容
tag_name获取当前元素的标签名
size获取当前元素的大小
rect获取一个包含当前元素大小和位置的字典
parent获取当前元素的父节点
location获取当前元素的位置
id获取当前元素的id

示例如下:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By


s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

link = driver.find_element(By.LINK_TEXT, '视频')
# with_tag_name能够只找寻对应传入参数对应的标签名
ele1 = driver.find_elements(with_tag_name('a').to_right_of(link))
print('ele[1]为:{}'.format(ele1[1]))
print('ele[1]HTML格式为:{}'.format(ele1[1].get_attribute('outerHTML')))
print('ele[1]的class属性为:{}'.format(ele1[1].get_attribute('class')))
print('ele[1]文本为:{}'.format(ele1[1].text))
print('ele[1]位置为:{}'.format(ele1[1].location))

driver.quit()

输出结果为:

ele[1]为:<selenium.webdriver.remote.webelement.WebElement (session=“136a0261d244743418c7035dfca659d7”, element=“a8ed04b4-57c0-4540-b74b-c6c40b822b1d”)>
ele[1]HTML格式为:<a href=“https://pan.baidu.com?from=1026962h” target=“_blank” class=“mnav c-font-normal c-color-t”>网盘</a>
ele[1]的class属性为:mnav c-font-normal c-color-t
ele[1]文本为:网盘
ele[1]位置为:{‘x’: 341, ‘y’: 19}

5. JS执行

javascript是可以独以运行的脚本,可以不使用selenium的方法,进行页面元素的点击、输入、拖拽等等操作,像如果对js使用很熟练,那么也就完全不需要管上面的定位方式。全部可以使用js来实现页面元素的各种操作。

像滚动条拖拽是没法用元素定位操作的,只能使用js,比如我们使用搜索页面搜索后,将滚动条拖到底。

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
import time


# 加载驱动
s = Service(executable_path=r'F:\Chrome\chromedriver_win32_108.0\chromedriver.exe')
driver = webdriver.Chrome(service=s)

driver.get("https://www.baidu.com")

# 向输入框(其name=wd)输入文字‘香克斯’
driver.find_element(By.NAME, 'wd').send_keys('香克斯', Keys.ENTER)
time.sleep(3)
# 一般距离顶部10000的距离都已经见底了
driver.execute_script('document.documentElement.scrollTop=10000')

time.sleep(5)
driver.quit()

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

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

相关文章

成都欢蓬电商:抖音带话题春日好物节活动规则

抖音带话题“春日好物节”&#xff0c;投稿瓜分优质内容激励&#xff0c;快来投稿参与本次抖音活动&#xff01; 一、活动玩法 活动时间&#xff1a;3月3日-3月16日 活动形式&#xff1a; 玩法说明&#xff1a; 若同一id同时参加获奖&#xff0c;则不重复激励; 因视频投流涉…

易基因:RRBS揭示晚年锻炼可以减缓骨骼肌表观遗传衰老(甲基化年龄)|新研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2021年12月21日&#xff0c;美国阿肯色大学、德克萨斯大学和肯塔基大学的研究人员合作在《Aging Cell》杂志发表了题为“Late-life exercise mitigates skeletal muscle epigenetic aging”…

还是要学好数学啊

有一个无穷大的二维网格图&#xff0c;一开始所有格子都未染色。给你一个正整数 n &#xff0c;表示你需要执行以下步骤 n 分钟&#xff1a;第一分钟&#xff0c;将任一格子染成蓝色。之后的每一分钟&#xff0c;将与蓝色格子相邻的 所有 未染色格子染成蓝色。下图分别是 1、2、…

每日一问-ChapGPT-20230308-关于技术与思考的问题

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230308-关于技术与思考的问题matplotlib_venn 中 venn2函数调用时&#xff0c;subsets传入A list (or a tuple) containing two set objects&#xff0c;怎么理解plt.pie() 包含哪些参数&#xff0c;以及每个参数的意义mat…

云端地球2月更新了这些功能,你都用过了吗?

时光飞逝、转眼已到2023年的第三个月&#xff0c;武汉的天气也逐渐转好&#xff0c;温度步步高升。云端地球产研团队的脚步也越走越快&#xff0c;虽然春节仿佛还是昨天的事&#xff0c;但云端地球已经完成了四次迭代&#xff0c;为广大建模爱好者带来了更多实用功能&#xff0…

BOSHIDA 模块电源的安装与维护

BOSHIDA三河博电科技 模块电源的安装与维护 由于各生产的模块电源的类别、系列、规格品种难以数计&#xff0c;故其功能特性和物理特性不尽相同&#xff0c;因此在安装、使用与维护方面亦各有不同&#xff0c;但应在以下几方面引起注意。 &#xff08;1&#xff09;打开包装后…

【Redis】搭建哨兵集群

目录 集群结构 准备实例和配置 启动 测试 集群结构 这里我们搭建一个三节点形成的Sentinel集群&#xff0c;来监管之前的Redis主从集群。如图&#xff1a; 三个sentinel实例信息如下&#xff1a; 节点IPPORTs1192.168.150.10127001s2192.168.150.10127002s3192.168.150.…

10 卷积神经网络及python实现

1 卷积神经网络简介 卷积神经网络(Convolutional Neural Network, CNN)由LeCun在上世纪90年代提出。 LeCun Y., Bottou L., Bengio Y., and Haffner P., Gradient-based learning applied to document recognition, Proceedings of the IEEE, pp. 1-7, 1998. 卷积核和特征图&…

STM32定时器Timer(PWM呼吸灯)

目录 定时器介绍 定时器工作原理&#xff1a; 定时器分类&#xff1a; STM32F103C8T6定时器资源&#xff1a; ​编辑 通用定时器介绍&#xff1a; 定时器计数模式&#xff1a; 定时器时钟源&#xff1a; ​编辑 定时器溢出时间计算公式&#xff1a; 定时器中断实验…

「IT女神勋章」挑战赛#

缓存 本地缓存 本地缓存为了保证线程安全问题&#xff0c;一般使用ConcurrentMap的方式保存在内存之中 分布式缓存。 常见的分布式缓存则有Redis&#xff0c;MongoDB等。 一致性&#xff1a;本地缓存由于数据存储于内存之中&#xff0c;每个实例都有自己的副本&#xff0c…

完全解读低通滤波,并且用其C语言实现

1、什么是低通滤波 低通滤波是一种信号处理技术&#xff0c;它可以用于去除高频信号成分&#xff0c;只保留低频信号成分。低通滤波器的本质是一个线性时不变系统&#xff0c;它可以通过差分方程或者频域响应的形式来描述。 在差分方程的形式下&#xff0c;低通滤波器可以表示…

MySQL数据库引擎(MyIsAm和InnoDB)

一、数据库引擎 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的&#xff0c;而不是基于库的&#xff0c;所以存储引擎也可被称为表类型。MySQL5.5版本之后默认InnoDB&#xff0c;之前是MyIsAm。 PS&#xff1a; 设置引擎语句&#xff1…

计算机网络:RIP协议以及距离向量算法

RIP协议 RIP是一种分布式的基于适量向量的路由选择协议&#xff0c;最大优点是简单。要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的唯一最佳&#xff08;最短&#xff09;距离记录&#xff0c;最多包含15个路由器&#xff0c;距离为16就表示网络不可达&…

每天一道大厂SQL题【Day15】微众银行真题实战(五)

每天一道大厂SQL题【Day15】微众银行真题实战(五) 大家好&#xff0c;我是Maynor。相信大家和我一样&#xff0c;都有一个大厂梦&#xff0c;作为一名资深大数据选手&#xff0c;深知SQL重要性&#xff0c;接下来我准备用100天时间&#xff0c;基于大数据岗面试中的经典SQL题&…

DBT 收购 Transform,指标平台已成现代数据栈关键拼图

今年 2 月初&#xff0c;现代数据技术栈独角兽 DBT 宣布完成对 Transform 的并购。在现代数据栈的体系中&#xff0c;DBT 和 Transform 都扮演着重要角色&#xff0c;DBT 侧重于整个分析链路上的数据转换处理&#xff0c;而 Transform 则聚焦在以指标为中心搭建业务分析应用。 …

【java】Java 封装

文章目录Java 封装封装的优点实现Java封装的步骤实例Java 封装 在面向对象程式设计方法中&#xff0c;封装&#xff08;英语&#xff1a;Encapsulation&#xff09;是指一种将抽象性函式接口的实现细节部分包装、隐藏起来的方法。 封装可以被认为是一个保护屏障&#xff0c;防…

14个Python处理Excel的常用操作分享

自从学了Python后就逼迫用Python来处理Excel&#xff0c;所有操作用Python实现。目的是巩固Python&#xff0c;与增强数据处理能力。本文为大家整理了14个Python处理Excel的常用操作&#xff0c;非常好用&#xff0c;希望对大家有所帮助目录自从学了Python后就逼迫用Python来处…

[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译

[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译 文章目录[AI助力] 2023.3.9 考研英语学习 2013 英语二翻译2013 英语二 翻译真题总结Powered with AI用perfect prompt 生成 prompt然后让它们评价&#xff0c;翻译&#xff0c;并改进New Bing 的回答让它改进~ &#xff08;太惊…

06-CSS

学习目标&#xff1a;能够使用精灵图能够使用字体图标能够写出 CSS 三角能够写出常见的 CSS 用户界面样式能够说出常见的布局技巧1. 精灵图&#xff08;重点&#xff09;1.1 为什么需要精灵图一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&am…

Cloudflare自动检测恶意IP拉黑到防火墙和自动切换5秒盾防CC攻击

资源宝分享&#xff1a;www.httple.net Cloudflare很多朋友都在使用&#xff0c;如果你的网站服务器架设在国外&#xff0c;那Cloudflare是一个非常好的加速工具&#xff0c;一可以为你的网站进行加速&#xff0c;二可以给你的网站提供防护 网站遭遇非常强大的CC和DDoS攻击时&…