selenium模块(自动化)

news2024/11/24 10:38:23

文章目录

  • 一、环境配置
  • 二、使用selenium解析源码
  • 三、基本函数
  • 四、子页面(ifFrame)(动作链,拖拽)
  • 五、实现无可视化界面,规避被检测的风险(反反爬)
  • 六、等待
  • 七、异常处理

Selenium是自动化测试工具,可以驱动浏览器执行特定的动作,如单击、下拉等,同时可以获取浏览器当前呈现的源代码,做到可见即可爬,便捷的获取网站中动态加载的数据,便捷实现模拟登录

安装:pip install selenium

一、环境配置

以Chrome浏览器为例:首先需要安装好Chrome浏览器并且配置好ChromeDriver。ChromeDriver文件在网址http://npm.taobao.org/mirrors/chromedriver/中下载,下载Chrome浏览器对应的版本,在Chrome浏览器中,选择设置->帮助->关于chrome可以查看其版本
在这里插入图片描述
找到后在网址中下载对应版本的文件下载,最后解压复制到python软件对应的文件中
在这里插入图片描述

二、使用selenium解析源码

from selenium import webdriver
from lxml import etree

# 实例化一个浏览器对象(传入浏览器的驱动),打开浏览器
bro = webdriver.Chrome()
# 让浏览器对制定URL发送请求
bro.get('https://www.baidu.com/')
# 获取浏览器当前页面源码数据
page_text = bro.page_source
# 解析源码
tree = etree.HTML(page_text)
# 解析获取li节点
li_list = tree.xpath('//li')
print(li_list)

关于Xpath的使用介绍请看https://blog.csdn.net/weixin_46287157/article/details/116432393

三、基本函数

先举个例子:

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 初始化
browser = webdriver.Chrome()
# 发出请求
browser.get('http://www.baidu.com')
# 输出源码
print(browser.page_source)
# 延时,便于观看效果
time.sleep(2)

# 根据ID值获取输入框节点
# 获取第一个ID为kw的节点,这个地方刚好是第一个且为唯一,find_element获取所有符合要求的节点
info = browser.find_element(By.ID, 'kw')
# 输出该节点的id值
print(info.id)
# 在输入框中输入Python
info.send_keys('Python')
time.sleep(2)

# 获取搜索按钮
button = browser.find_element(By.ID, 'su')
# 点击搜索按钮
button.click()
time.sleep(2)

# 返回上一个页面
browser.back()
time.sleep(2)

# 创建新选项卡
browser.execute_script('window.open()')
time.sleep(2)
# 切换到新选项卡
browser.switch_to.window(browser.window_handles[1])
time.sleep(2)
# 请求URL
browser.get('http://www.zhihu.com')
time.sleep(2)

# 执行一组js程序,移动滚轮使页面滑到底部
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
time.sleep(2)
# 关闭页面
browser.close()

常用函数如下

函数含义举例
基本使用导库from selenium import webdriver
webdriver.Chrome()初始化browser = webdriver.Chrome()
初始化browser = webdriver.Firefox()
初始化browser = webdriver.Edge()
get()请求URLbrowser.get(url)
page_source输出源码browser.page_source
current_url输出请求的URLbrowser.current_url
get_cookies()获取cookiesbrowser.get_cookies()
add_cookie()添加cookiesbrowser.add_cookie({‘name’:‘name’,‘domain’:‘www.zhihu.com’})
delete_all_cookies()删除cookiesbrowser.delete_all_cookies()
获取节点信息
browser.find_element()获取节点loge = browser.find_element(‘AppHeader-login’)
get_attribute()获取节点的属性值(class)loge.get_attribute(‘class’)
text文本loge.text
id获取id属性loge.id
location获取节点相对位置loge.location
tag_name获取标签名称loge.tag_name
size获取节点大小loge.size
前进回退
back()后退browser.back()
forward()前进browser.forward()
选项卡
execute_script()开启新的选项卡browser.execute_script(‘window.open()’)
browser.window_handles所有窗口句柄print(browser.window_handles)
browser.switch_to.window()切换到新选项卡,参数为选项卡代号browser.switch_to.window(browser.window_handles[1])
进度条
execute_script()滑到底部browser.execute_script(‘window.scrollTo(0, document.body.scrollHeight)’)
弹出提示框browser.execute_script(‘alert(“To Bottom”)’)
节点定位导库from selenium.webdriver.common.by import By
find_element(定位方法,value)查找一个节点info = browser.find_element(By.ID, ‘kw’)
find_elements(定位方法,value)查找一组节点info = browser.find_elements(By.ID, ‘kw’)
定位方法
定位元素定位方式定位方法
id通过属性id定位元素By.ID
name通过属性name定位元素By.NAME
class_name通过属性class name定位元素By.CLASS_NAME
tag_name通过标签名称定位元素By.TAG_NAME
link_text通过链接文本定位元素By.LINK_TEXT
partial_link_text通过部分链接文本定位元素By.PARTIAL_LINK_TEXT
css_selector通过css选择器定位元素By.CSS_SELECTOR
xpath通过相对/绝对路径定位元素By.XPATH
节点交互定位标签info = browser.find_element(By.ID, 'kw')
send_keys()输入文字info.send_keys(‘iPhone’)
clear()清空文字info.clear()
click()点击button.click()

更多操作在https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement中

四、子页面(ifFrame)(动作链,拖拽)

页面中有一种节点叫作ifFrame,也就是子Frame,相当于页面的子页面,结构与外部网页的结构完全一致,Selenium打开页面后,默认在父级Frame里面操作,如果页面中还有子Frame,它是不能获取子Frame里面的节点,这时需要使用switch_to.frame()方法来切换到子页面Frame

动作链没有特定的执行对象,比如鼠标拖拽、键盘按键等。
现在实现一个节点的拖拽操作,将某节点从一处拖拽到另一处:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

# 初始化
browser = webdriver.Chrome()
# 发起请求
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

# 切换到页面的frame标签中进行(该标签的id为iframeResult)
browser.switch_to.frame('iframeResult')
# 定位标签
source = browser.find_element(By.CSS_SELECTOR, '#draggable')
target = browser.find_element(By.CSS_SELECTOR, '#droppable')

# 声明对象
actions = ActionChains(browser)
# 执行拖拽
actions.drag_and_drop(source, target)
# 释放动作链
action.release()

'''或者使用如下方法
# 动作链(拖动操作)
action = ActionChains(browser)
# 点击长按指定的标签
action.click_and_hold(source)
for i in range(5):
    # perform()立即执行动作链操作
    # move_by_offset(x, y): x水平方向,y垂直方向
    action.move_by_offset(17,0).perform()
    sleep(0.3)
# 释放动作链
action.release()
'''

# 回到父页面
browser.switch_to.parent_frame()
# 关闭页面
browser.close()

更多动作链在https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

五、实现无可视化界面,规避被检测的风险(反反爬)

和正常操作一样,只是没有将操作的页面显示出来,有操作无页面显示

实现无可视化界面

from selenium import webdriver
# 实现无可视化界面
from selenium.webdriver.chrome.options import Options

# 创建一个对象,用来控制chrome以无界面模式打开
option = Options()
option.add_argument('--headless')
option.add_argument('--disable-gpu')

# 无头浏览器(无界面浏览器)
bro = webdriver.Chrome(options=option)

# 让浏览器对制定URL发送请求
bro.get('https://www.baidu.com')

# 关闭浏览器
bro.quit()

规避被检测的风险(反反爬)

from selenium import webdriver
# 实现规避检测
from selenium.webdriver import ChromeOptions

# 让selenium规避被检测到的风险(反反爬)
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
# 无头浏览器(无界面浏览器),规避被检测到的风险
bro = webdriver.Chrome(options=option)

# 让浏览器对制定URL发送请求
bro.get('https://www.baidu.com')

# 关闭浏览器
bro.quit()

六、等待

延时等待
获取的源码不一定是加载完全的页面,如果有额外的Ajax请求,在网页源码中也不一定成功获取到,这里需要延时等待一定的时间,确保节点已经加载出来

隐式等待
没有找到节点时将继续等待,超过设定时间后,抛出找不到节点的异常,默认为0

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
# 设定等待时间
browser.implicitly_wait(10)
# 发起请求
browser.get('https://www.zhihu.com/explore')
# 获取节点
info = browser.find_element(By.NAME, 'AppHeader')
print(info)

隐式等待不太好,只设定一个固定时间,页面的加载时间会受到网络条件的影响

显式等待
指定要查找的节点,然后指定最长等待时间,加载出来了则返回该节点,没加载出来则抛出异常

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')

# 等待最长时间
wait = WebDriverWait(browser,10) 
# 传入要等待的条件,这个条件是代表节点出现的意思,参数是节点定位元组,也就是ID为q的节点搜索框
info = wait.until(EC.presence_of_element_located((By.ID, 'q')))
# 对于按钮,这里element_to_be_clickable,也就是可点击,规定时间内如果加载出来可点击则返回该按钮,否则抛出异常
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(info, button)
等待条件含义
presence_of_element_located节点加载出来,传入定位元组,如(By.ID,‘p’)
element_to_be_clickable节点可点击
title_is标题是某内容
title_contains标题包含某内容
visibility_of_element_lcated节点可见,传入定位元组
visibility_of可见,传入节点对象
presence_of_all_elements_located所有节点加载出来
text_to_be_present_in_element某节点文本包含某文字
text_to_be_present_in_element_value某节点值包含某文字
frame_to_be_available_and_switch_to_it加载并切换
invisibility_of_element_located节点不可见
staleness_of判断一个节点是否仍在DOM,可判断页面是否已经更新
element_to_be_selected节点可选择,传节点对象
element_located_to_be_selected节点可选择,传定位元组
element_selection_state_to_be传入节点对象及其状态,相等返回True,否则返回False
element_located_selection_state_to_be传入定位元组及其状态,相等返回True,否则返回False
alert_is_present是否出现警告

七、异常处理

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
# 请求超时异常处理
try:
    browser.get('https://www.baidu.com/')
except TimeoutException:
    print('Time Out')
# 无该id节点异常
try:
    browser.find_element(By.ID, 'hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()

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

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

相关文章

Vue+python+django+flask共享汽车租赁管理系统

共享汽车管理系统的系统管理员可以管理用户,可以对用户信息修改删除以及查询操作。具体界面的展示如图所示。 3.2投放地区管理 系统管理员可以对投放地区信息进行添加,修改,删除以及查询操作。具体界面如图所示。 3.3汽车信息管理 系统管…

【原创】java+swing+mysql教室管理系统设计与实现

大学生活中,我们很多时候都要用到教室,比如开个班会,开展某次活动,一般情况下为了避免占用教室资源,一般情况下都会提前进行预约教室,所以今天我们讲的就是如何使用javaswingmysql去设计一个教室预约管理系…

13 Sentinel初始化监控

Sentinel初始化工程演示 通过一个案例来让大家了解Sentinel的初始化演示,现在我们需要做几件事: 启动本地Nacos: 8848创建新的Module:cloudalibaba-sentinel-service8401启动Sentinel服务:8080启动sentinel微服务840…

Day901.内部临时表 -MySQL实战

内部临时表 Hi,我是阿昌,今天学习记录的是关于内部临时表的内容。 sort buffer、内存临时表和 join buffer。这三个数据结构都是用来存放语句执行过程中的中间数据,以辅助 SQL 语句的执行的。 其中,在排序的时候用到了 sort bu…

win10环境下安装openCDA(详细解答CARLA+SUMO以及遇到的问题)

目录预备知识CARLA安装安装CMAKE安装MAKE安装Visual Studio 2019安装unreal engine 4.26openCDA安装安装SUMO预备知识 opeCDA结合了carla和sumo,支持协同驾驶开发与测试,最近开源了。 论文链接:https://arxiv.org/abs/2107.06260 官方linux安…

事件驱动设计模式

是一种常见的设计模式,其核心思想是:系统中发生的事件会触发相应的事件处理器或监听器,从而实现特定的业务逻辑或功能 该设计模式通常由以下几个要素组成: 事件源(Event Source):事件源是指发生…

C++数据结构 —— AVL树

目录 1.AVL树介绍 2.AVL树如何进行平衡调整 2.1平衡因子 2.2AVL树的插入 2.3左单旋 2.4右单旋 2.5左右双旋 2.6右左双旋 2.8完整代码 3.测试用例 4.验证是否为AVL树 1.AVL树介绍 AVL树是map/set/multimap/multi/set等容器的一种底层结构,其本质就是一颗…

推荐系统算法总览【持续学习ing】

推荐系统整体知识架构 推荐模型发展 工业 CTR模型的三个改进大点:显性特征交叉, 特征重要度, user历史信息的挖掘 显性特征交叉: 针对的是隐性无脑交叉的DNN的不足, 针对一些重要的关键特征进行显性特征交叉&#xf…

Java中BIO、NIO和AIO的区别和应用场景

IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 一、BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信&#…

学习网安需要了解的一些基础知识

P1.基本概念 1.POC/EXP POC(proof of concept)常指一段漏洞验证代码;EXP(exploit)指利用系统漏洞进行攻击的动作 PoC是证明漏洞存在的,而 Exp 是利用这个漏洞进一步进行攻击,先有POC,才有EXP 2.Payload/shellcode payload&#xff0…

【奶奶看了也不会】AI绘画 Mac安装stable-diffusion-webui绘制AI妹子保姆级教程

1.作品图 2.准备工作 目前网上能搜到的stable-diffusion-webui的安装教程都是Window和Mac M1芯片的,而对于因特尔芯片的文章少之又少,这就导致我们还在用老Intel 芯片的Mac本,看着别人生成美女图片只能眼馋。所以小卷这周末折腾了一天&#…

Random(一)高并发问题,ThreadLocalRandom源码解析

目录1.什么是伪随机数?2.Random2.1 使用示例2.2 什么种子重复,随机数会重复?2.3 nextInt() 源码分析2.4 线程安全的实现2.5 高并发问题3.ThreadLocalRandom3.1 使用示例3.2 current() 源码解析3.2.1 Thread中保存的变量:3.2.2 Thr…

2023最新谷粒商城笔记之MQ消息队列篇(全文总共13万字,超详细)

MQ消息队列 其实队列JDK中本身就有,不过这种队列也只能单体服务可能会使用,一旦项目使用的分布式架构,那么一定还是需要用到一个消息中间件的。我们引入消息队列的原因就是对我们的页面相应速度再优化,让用户的体验更好&#xff…

Ae:使用占位符

占位符 Placeholder本质上是一个静止的彩条图像,用来临时代替缺失的素材。自动占位符当 Ae 找不到源素材,比如被移动、删除或重命名,Ae 将自动生成占位符,在项目面板中用斜体显示,使用该素材的任何合成将用一个占位符图…

【R统计】R语言相关性分析及其可视化

💂 个人信息:酷在前行👍 版权: 博文由【酷在前行】原创、需要转载请联系博主👀 如果博文对您有帮助,欢迎点赞、关注、收藏 订阅专栏🔖 本文收录于【R统计】,该专栏主要介绍R语言实现统计分析的…

libxlsxwriter簇状柱形图绘制

libxlsxwriter的功能覆盖面很大,今天一起来看一下如何用这个库来生成带有簇状柱形图的表格。 1 簇形柱状图 首先来看一下Excel的样例表格,簇状柱形图往往是用来对比若干“系列”的数据在某一时间段内,或某一情境下的差异情况。在商务领域还…

小白量化《穿云箭集群量化》(4)指标公式写策略

小白量化《穿云箭集群量化》(4)指标公式写策略 穿云箭量化平台支持中文Python写量化策略,同时也直接支持股票公式指标写策略。下面我们看看是如何实现的。 股票软件的指标公式语法是一样的,不同仅仅是个别函数或绘图函数或绘图命令…

java多态理解和底层实现原理剖析

java多态理解和底层实现原理剖析多态怎么理解java中方法调用指令invokespecial和invokevirtual指令的区别invokeinterface指令方法表接口方法调用为什么不能利用方法表快速定位小结多态怎么理解 抽象事务的多种具体表现,称为事务的多态性。我们在编码过程中通常都是…

计算机网络 第4章 作业1

一、选择题 1. 由网络层负责差错控制与流量控制,使分组按序被递交的传输方式是_________(C) A.电路交换 B.报文交换 C.基于虚电路的分组交换 D.基于数据报的分组交换 2. TCP/IP 参考…

Bunifu.UI.WinForms 6.0.2 Crack

Bunifu.UI.WinForms为 WinForms创建令人惊叹的UI Bunifu.UI.WinForms我们为您提供了现代化的快速用户界面控件。用于 WinForms C# 和 VB.NET 应用程序开发的完美 UI 工具 简单 Bunifu.UI.WinForms没有臃肿的特征。正是您构建令人惊叹的 WinForms 应用程序所需要的。只需拖放然…