selenium模块(自动化)

news/2024/4/19 19:10:05/文章来源:https://blog.csdn.net/weixin_46287157/article/details/129149265

文章目录

  • 一、环境配置
  • 二、使用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 Bybrowser = 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 ECbrowser = 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 Bybrowser = 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.luyixian.cn/news_show_74435.aspx

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

相关文章

kafka使用入门案例与踩坑记录

每次用到kafka时都会出现各种奇怪的问题,综合实践,下面汇总下主要操作步骤: Docker镜像形式启动 zookeeper启动 docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeperkafka启动 docker run --name kafka01 -p 9092:909…

YOLOV5s+Shufflenetv2+VOC数据集+迁移学习

前言:更改YOLOV5的backbone网络为 Shufflenetv2,便于达到轻量化的目的 1. 试运行YOLOv5 b站推土机 2. VOC数据集处理 3. 更改轻量级网络 参考魔改yolov5 3.1 在common.py末尾加入以下代码 #添加轻量化模块Shufflenetv2 # ------------------------…

安装配置DHCP

本次实验采用CentOS71.检查在安装DHCP之前先使用rpm命令查看系统中已有的DHCP软件包rpm -qa | grep dhcp由此可知,系统中尚未安装DHCP软件包2.安装我们可以使用yum命令为系统安装DHCP软件包yum -y install dhcp安装完成后再次检查可以看到DHCP软件包3.配置dhcp配置文…

办公室人员离岗识别检测系统 yolov7

办公室人员离岗识别检测系统根据yolov7网络模型深度学习技术,办公室人员离岗识别检测算法能够7*24小时全天候自动识别人员是否在岗位。YOLOv7 在 5 FPS 到 160 FPS 范围内,速度和精度都超过了所有已知的目标检测器,并在V100 上,30…

刷题28-有效的变位词

32-有效的变位词 解题思路: 注意变位词的条件,当两个字符串完全相等或者长度不等时,就不是变位词。 把字符串中的字符映射成整型数组,统计每个字符出现的次数 注意数组怎么初始化: int [] s1new int[26]代码如下&a…

Docker buildx 的跨平台编译

docker buildx 默认的 docker build 命令无法完成跨平台构建任务,我们需要为 docker 命令行安装 buildx 插件扩展其功能。buildx 能够使用由 Moby BuildKit 提供的构建镜像额外特性,它能够创建多个 builder 实例,在多个节点并行地执行构建任…

社畜大学生的Python之pandas学习笔记,保姆入门级教学

接上期,上篇介绍了 NumPy,本篇介绍 pandas。 目录 pandas 入门pandas 的数据结构介绍基本功能汇总和计算描述统计处理缺失数据层次化索引 pandas 入门 Pandas 是基于 Numpy 构建的,让以 NumPy 为中心的应用变的更加简单。 Pandas是基于Numpy…

NLP中的对话机器人——预训练基准模型

引言 本文是七月在线《NLP中的对话机器人》的视频笔记,主要介绍FAQ问答型聊天机器人的实现。 场景二 上篇文章中我们解决了给定一个问题和一些回答,从中找到最佳回答的任务。 在场景二中,我们来实现: 给定新问题,从…

基础夯实,字节内部总结240道算法LeetCode刷题笔记,直呼太全

1、什么是算法算法(algorithm,[ˈlɡərɪəm],计算程序):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转化成输出结…

java spring AOP 完全注解开发

我们先创建一个项目 然后引入java spring aop的依赖 然后 在src下创建目录 我这里 直接就叫 Aop了 下面创建一个User类 参考代码如下 package Aop;import org.springframework.stereotype.Component;Component public class User {public void add(){System.out.println(&qu…

Redis高级-主从复制相关操作

2.1 主从复制简介 2.1.1 高可用 首先我们要理解互联网应用因为其独有的特性我们演化出的三高架构 高并发 应用要提供某一业务要能支持很多客户端同时访问的能力,我们称为并发,高并发意思就很明确了 高性能 性能带给我们最直观的感受就是:速…

Java EE|TCP/IP协议栈之应用层协议DNS详解

文章目录一、对DNS的感性认识简介特点一些常见疑问二、DNSDNS域名结构域名的分级三、域名服务器四、域名解析过程参考一、对DNS的感性认识 简介 DNS,即Domain Name System,是域名系统的简称。它是Internet上解决网上机器命名的一种系统。 TCP/IP中的IP地址是由四…

【蓝桥集训】第七天并查集

作者:指针不指南吗 专栏:Acwing 蓝桥集训每日一题 🐾或许会很慢,但是不可以停下来🐾 文章目录1.亲戚2.合并集合3.连通块中点的数量有关并查集的知识学习可以移步至—— 【算法】——并查集1.亲戚 或许你并不知道&#…

c语言tips-大端小端存储介绍和使用union判断大小端

1. 大小端介绍 大端(Big Endian)和小端(Little Endian)是两种CPU或者计算机系统存储数据的方式。 在大端系统中,数据的高位字节(MSB)存储在内存地址的低位,低位字节(LSB…

【C++】C++入门(下)

引用 什么是引用?   引用是给一个已经存在的变量取一个别名,在语法上并不会给这个别名开一个空间,它和她引用的变量共用一个空间。但是实际上引用也是开了一块空间的,用来存放引用名。引用是按照指针的方式来实现的。引用语法&…

《分布式技术原理与算法解析》学习笔记Day23

分布式数据复制 我们在进行分布式数据存储设计时,通常会考虑对数据进行备份,以提高数据的可用性和可靠性,“数据复制技术”就是实现数据备份的关键技术。 什么是数据复制技术? 在分布式数据库系统中,通常会设置主备…

华为OD机试用Python实现 -【统一限载货物数最小值】(2023-Q1 新题)

华为OD机试题 华为OD机试300题大纲统一限载货物数最小值题目描述输入描述输出描述说明示例一输入输出说明示例二输入输出说明Python 代码实现算法逻辑华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查…

python爬虫常见错误

python爬虫常见错误前言python常见错误1. AttributeError: WebDriver object has no attribute find_element_by_id1. 问题描述2. 解决办法2. selenium:DeprecationWarning: executable_path has been deprecated, please pass in1. 问题描述2. 解决办法3. 下载了包…

k8s-资源限制-探针检查

文章目录一、资源限制1、资源限制的使用2、reuqest资源(请求)和limit资源(约束)3、Pod和容器的资源请求和限制4、官方文档示例5、资源限制实操5.1 编写yaml资源配置清单5.2 释放内存(node节点,以node01为例…

《程序员思维修炼》速读笔记

文章目录书籍信息概览绪论从新手到专家的历程认识大脑利用右脑调试大脑主动学习积累经验控制注意力超越专家图解书籍信息 书名:《程序员思维修炼(修订版)》 作者:[美] Andy Hunt 概览 绪论 再提“实用”关注情境所有人都关注这…