python 的selenium自动操控浏览器教程(2)
人生苦短,我用py
文章目录
- 人生苦短,我用py
- 关于部分网页无法找到元素的问题1
- 方案1
- 方案2
- 关于部分网页无法找到元素的问题2
- 解决方案
- 被网站检查出来我们使用了selenium了怎么办?
- 如何实现前进后退
- 当使用py删除文件时报禁止访问怎么办
- 怎么使用py实现解压文件?
- 怎么打开系统的图片应用向用户展示图片?
- 怎么去下载网络资源?
- 怎么获取当前路径?
- 怎么使用Webderive截图?
- JSON数据的天坑?
- 通用代码分享
- 如何截长图?
关于部分网页无法找到元素的问题1
问题描述
这个问题我想,大概还是基础知识不牢靠的原因
selenium中的寻找元素,只是能寻找到当前页面的一个html中的元素,如果出现嵌套的网页就无法寻找到所嵌套网站中的元素的!!对我说的就是iframe!!!这个自带黑魔法的东西
上图:
出现这种情况是找不到的!
方案1
我们需要先获取iframe中的src也就是嵌套网页的地址,然后再去请求就好了
# 寻找第一层框架入口
s = Driver.find_element(By.ID, "frame_content").get_attribute("src")
# 进入第一层框架入口
Driver.get(s)
方案2
当然我们页可以直接去对iframe执行点击操作,这样更快,更人性化
关于部分网页无法找到元素的问题2
问题描述
这种情况是出现打开新的网页的情况,当我们打开了新的页面时,但是我们WebDriver并不会自动跳转的!他还在原来的页面时,所以我们去寻找新页面中的元素就会找不到了!!
如图所示
解决方案
那怎么样让驱动也去跳转那?
那我们需要获取句柄了(我只会windows平台上的)
注意这是我们获取的时当前驱动的所有句柄,如果有两个页面的话就会有两个句柄的,于是我们取出最后也个句柄,并使用switch_to.window方法使我们的浏览器驱动跳转到我们需要的(及第二个)页面。
# 获取当前句柄,这很重要!!url = Driver.window_handles# 跳转到我们需要的网页Driver.switch_to.window(url[1])
被网站检查出来我们使用了selenium了怎么办?
问题描述
现在自动化工具越来越火了,一些厂商就针对与自动化工具做了限制,如:如果加了无头模式
一些网站的js就会检测出来,使我们的操作失效
解决方法
直接看代码吧,这玩意不好解释
# 创建option对象options = Options()# 设置无头模式即浏览器不弹出,只在后台运行options.add_argument("headless")# 解决部分网站的对于Selenium的js监测机制,# 以下2行options.add_experimental_option('excludeSwitches', ['enable-automation'])options.add_experimental_option('useAutomationExtension', False)# 加载浏览器驱动Webdriver = Service(driverfilename)# 加载驱动和无头driver = webdriver.Edge(service=Webdriver, options=options)# 解决部分网站的对于Selenium的js监测机制,# 以下1行driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})
如何实现前进后退
前进及不用说了,直接请求即可了,但是怎么去实现后退那?
上代码,这么少?哈哈其实坑多着哩!这个后退只能实现一个,也就是说如果连续写多个back()就会失效的!所以说该用driver.current_url去获取网址时就多用,不要去懒省事的
# 回到上一个页面Driver.back()# 获取当前urldriver.current_url
当使用py删除文件时报禁止访问怎么办
不要慌不要慌,这种情况多出现在删除文件夹时这时我们就需要去使用shutil这个模块了,它可以保保证删除文件夹时不出错,但是用它去删除文件时却会出错的,要牢记
import shutil
if os.path.exists(name1):shutil.rmtree(name1)
if os.path.exists(name):os.remove(name)
怎么使用py实现解压文件?
我们使用zipfile模块,去实现首先打开文件 使用extratall()就可以实现解压了
import zipfile# 文件解压with zipfile.ZipFile(name) as zf:zf.extractall()print("解压完成")
注意:解压完成是会自动删除源文件的
怎么打开系统的图片应用向用户展示图片?
注意这里好像只支持win系统
代码
def showimg(path):userPlatform = platform.system() # 获取操作系统if userPlatform == 'Windows': # Macos.startfile(path)else:print("暂且不支持您的操作系统")
效果展示
怎么去下载网络资源?
下载网络资源
dow = requests.get(downloadurl, headers)open("drive.zip", "wb").write(dow.content)
下载网页
使用的是py自带的标准库,不需要去下载第3方库
urllib.request.urlretrieve("URL路径","保存路径")
怎么获取当前路径?
一句
os.getcwd()
怎么使用Webderive截图?
Driver.save_screenshot(path)
JSON数据的天坑?
当我们去使用xhr,窃取响应时,通常会使用post请求,但是请注意,这里post 请求中的参数
1 必须是双引号
2 就算是数字也必须加上引号
3 没有值的话就加空字符串
4 布尔值必须是小写的true/false
请注意第2条,如果不加引号,js会把它按照int32类型处理但是当创出int32的范围时就会请求失败,这就是为什么int类型的数据也要加引号的 原因
1、传统表单post请求(xhr的请求)
import requests
url = “https://tests”
data = {“key”:“value”}
res = requests.post(url=url,data=data)
print(res.text)
2、json类型的post请求
import requests
url = “https://tests”
data = ‘{“key”:“value”}’
#字符串格式
res = requests.post(url=url,data=data)
print(res.text)
**
最后的一些未解决的问题
我们使用selenium获取到的cooike不全怎么办?
怎么根据快捷方式找到源文件的位置?
恳请大佬们解答**
通用代码分享
import platform
import os
import sys
import zipfile
import shutil
import requests
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options
from win32com.client import Dispatch# 初始化Drvier
def init(driverfilename, isHeadless):print("开始浏览器初始化\n")# 创建option对象options = Options()if isHeadless:# 设置无头模式即浏览器不弹出,只在后台运行options.add_argument("headless")# 解决部分网站的对于Selenium的js监测机制,# 以下2行options.add_experimental_option('excludeSwitches', ['enable-automation'])options.add_experimental_option('useAutomationExtension', False)# 加载浏览器驱动Webdriver = Service(driverfilename)# 加载驱动和无头driver = webdriver.Edge(service=Webdriver, options=options)# 解决部分网站的对于Selenium的js监测机制,# 以下1行driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{'source': 'Object.defineProperty(navigator,"webdriver",{get:()=>undefind})'})print("浏览器初始化完成")return driver# 获取当前浏览器的版本
def getversion(filename):parser = Dispatch("Scripting.FileSystemObject")version = parser.GetFileVersion(filename)print("当前Edge浏览器版本为:" + version)return version# 获取浏览器的源路径
def getEdgePath():while True:print("""请输入您的Edge浏览器的源路径(不是快捷方式的路径)方法:1 找到桌面上的Edge浏览器,右击鼠标选择“打开文件位置”2 进入新打开的文件夹之后找到“msedge.exe”文件右击复制文件路径3 将刚刚复制的路径,复制过来即可""")path1 = input("")if path1 != "":return path1else:print("请输入Edge浏览器的源路径")# 打开路径中的文件
def showFile(path):userPlatform = platform.system() # 获取操作系统if userPlatform == 'Windows': # Macos.startfile(path)else:print("暂且不支持您的操作系统")# 获取是否开启后台模式
def isHeadless():while True:isHeadless = input("是(Y)否(N)开启后台模式")if (isHeadless == "Y" or isHeadless == "N"):if isHeadless == "Y":return Trueelse:return Falseelse:print("请输入正确指令")# 浏览器驱动下载
def downloadandZip(downloadurl, headers, name):try:print("正在下载驱动")dow = requests.get(downloadurl, headers)open("drive.zip", "wb").write(dow.content)print("驱动下载完成,正在解压")# 文件解压with zipfile.ZipFile(name) as zf:zf.extractall()print("解压完成")return Trueexcept:print("浏览器驱动下载失败")# 程序终止sys.exit()# 获取下载的浏览器驱动的路径
# 同时:
# 1 删除无关文件
# 2 检测浏览器驱动是否受损
def startDownloadandZipexc(downloadurl, headers):name = "drive.zip"temp1 = "Driver_Notes"downloadandZip(downloadurl, headers, name)# 删除无关文件print("正在删除无关文件")drivername = "msedgedriver.exe"if os.path.exists(temp1):shutil.rmtree(temp1)if os.path.exists(name):os.remove(name)print("无关文件删除成功")if os.path.exists(drivername):return os.getcwd() + "\msedgedriver.exe"else:while True:t = input("浏览器驱动受损或被删除,是(Y)否(N)重新下载")if t == "Y" or t == "N":if t == "Y":# 驱动下载downloadandZip(downloadurl, headers, name)return os.getcwd() + "\msedgedriver.exe"else:print("正在退出")return False# 入口
if __name__ == "__main__":headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400'}print("欢迎使用xxx系统\n")# 获取浏览器的源路径path1 = getEdgePath()# 格式化路径path2 = path1.replace("\\", "//").replace("\"", "")# 获取浏览器版本oldversion = getversion(path2)# 浏览器驱动下载地址downloadurl = "https://msedgedriver.azureedge.net/" + oldversion + "/edgedriver_win64.zip"# 获取浏览器驱动的地址driverfilepath = startDownloadandZipexc(downloadurl, headers)if driverfilepath != False:print("浏览器驱动器路径为:" + driverfilepath + "不必要,请勿删除!!!")# 是否开启无头模式isHeadless = isHeadless()# 初始化DriverDriver = init(driverfilepath, isHeadless)
如何截长图?
效果
不过请注意要实现截长图浏览器必须开启无头模式!!!!
不过请注意要实现截长图浏览器必须开启无头模式!!!!
不过请注意要实现截长图浏览器必须开启无头模式!!!!
driver.get("https://blog.csdn.net/yutu75/article/details/115524985")# 用js获取页面的宽高,如果有其他需要用js的部分也可以用这个方法width = driver.execute_script("return document.documentElement.scrollWidth")height = driver.execute_script("return document.documentElement.scrollHeight")# 获取页面宽度及其宽度print(width, height)# 将浏览器的宽高设置成刚刚获取的宽高driver.set_window_size(width, height)time.sleep(1)# 截图并关掉浏览器driver.get_screenshot_as_file("xx.png")driver.quit()
相关文章:
python 的selenium自动操控浏览器教程(2)
人生苦短,我用py 文章目录人生苦短,我用py关于部分网页无法找到元素的问题1方案1方案2关于部分网页无法找到元素的问题2解决方案被网站检查出来我们使用了selenium了怎么办?如何实现前进后退当使用py删除文件时报禁止访问怎么办怎么使用py实现…...
【Deformable Convolution】可变形卷积记录
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 可变形卷积记录 1. 正文 预印版: Deformable Convolutional Networks v1 Deformable ConvNets v2: More Deformable, Better Results 发表版…...
Oracle-Mysql 函数转换
Oracle-Mysql 函数转换limit <> ROWNUMcast <> TO_NUMBERcast as signedcast as unsignedregexp a_\\d <> REGEXP_LIKEschema() <> SELECT USER FROM DUALinformation_schema.COLUMNS表 <> ALL_TAB_COLUMNS表unix_timestampfrom_unixtime <&g…...
【Kafka】一.认识Kafka
kafka是一个分布式消息队列。由 Scala 开发的高性能跨语言分布式消息队列,单机吞吐量可以到达 10w 级,消息延迟在 ms 级。具有高性能、持久化、多副本备份、横向扩展能力。 生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。 一般在…...
Linux软件管理YUM
目录 yum配置文件 创建仓库 yum查询功能 yum安装与升级功能 yum删除功能 yum仓库产生的问题和解决之道 yum与dnf 网络源 YUM就是通过分析RPM的标头数据后,根据各软件的相关性制作出属性依赖时的解决方案,然后可以自动处理软件的依赖属性问题&…...
【自学MYSQL】MySQL Windows安装
MySQL Windows安装 MySQL Windows下载 首先,我们打开 MySQL 的官网,网址如下: https://dev.mysql.com/downloads/mysql/在官网的主页,我们首先根据我们的操作系统,选择对应的系统,这里我们选择 Windows&…...
Linux c编程之常用技巧
一、说明 在Linux C的实际编程应用中,有很多有用的实践技巧,编程中掌握这些知识,会对编程有事半功倍的效果。 二、常用技巧 2.1 if 变量条件的写法 main.c: #include <stdio.h>int main(int argc, char *argv[]) {int a =...
21- 朴素贝叶斯 (NLP自然语言算法) (算法)
朴素贝叶斯要点 概率图模型算法往往应用于NLP自然语言处理领域。根据文本内容判定 分类 。 概率密度公式: 高斯朴素贝叶斯算法: from sklearn.naive_bayes import GaussianNB model GaussianNB() model.fit(X_train,y_train) 伯努利分布朴素贝叶斯算法 fro…...
设计模式第七讲-外观模式、适配器模式、模板方法模式详解
一. 外观模式 1. 背景 在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。 软件设计也是这样,当一个系统的功能越来越强&…...
flutter-第1章-配置环境
flutter-第1章-配置环境 本文针对Windows系统。 一、安装Android Studio 从Android Studio官网下载最新版本,一直默认安装就行。 安装完成要下载SDK,可能会需要科学上网。 打开AS,随便创建一个新项目。 点击右上角的SDK Manager 找到SDK…...
“消息驱动、事件驱动、流 ”的消息模型
文章目录背景消息驱动 Message-Driven事件驱动 Event-Driven流 Streaming事件规范标准简介: 本文旨在帮助大家对近期消息领域的高频词“消息驱动(Message-Driven),事件驱动(Event-Driven)和流(S…...
量化股票配对交易可以用Python语言实现吗?
量化股票配对交易可以用Python语言实现吗?Python 是一种流行的编程语言,可用于所有类型的领域,包括数据科学。有大量软件包可以帮助您实现目标,许多公司使用 Python 来开发与金融界相关的以数据为中心的应用程序和科学计算。 最重…...
机器学习洞察 | 一文带你“讲透” JAX
在上篇文章中,我们详细分享了 JAX 这一新兴的机器学习模型的发展和优势,本文我们将通过 Amazon SageMaker 示例展示如何部署并使用 JAX。JAX 的工作机制JAX 的完整工作机制可以用下面这幅图详细解释:图片来源:“Intro to JAX” video on YouT…...
OpenFaaS介绍
FaaS 云计算时代出现了大量XaaS形式的概念,从IaaS(Infrastructure as a Service)、PaaS(Platform as a Service)、SaaS(Software as a Service)到容器云引领的CaaS(Containers as a Service),再到火热的微服务架构,它们都在试着将各种软、硬…...
【算法设计与分析】STL容器、递归算法、分治法、蛮力法、回溯法、分支限界法、贪心法、动态规划;各类算法代码汇总
文章目录前言一、STL容器二、递归算法三、分治法四、蛮力法五、回溯法六、分支限界法七、贪心法八、动态规划前言 本篇共为8类算法(STL容器、递归算法、分治法、蛮力法、回溯法、分支限界法、贪心法、动态规划),则各取每类算法中的几例经典示例进行展示。 一、STL容…...
vue初识
第一次接触vue,前端的html,css,jquery,js学习也有段时间了,就照着B站的视频简单看了一些,了解了一些简单的用法,这边做一个记录。 官网 工具:使用VSCode以及Live Server插件(能够实时预览) 第…...
火山引擎入选《2022 爱分析 · DataOps 厂商全景报告》,旗下 DataLeap 产品能力获认可
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 2 月 9 日,国内领先的数字化市场研究与咨询机构爱分析发布了《2022 爱分析DataOps 厂商全景报告》(以下简称报告),报…...
java-spring_bean的生命周期
生命周期:从创建到消亡的完整过程初始化容器 1. 创建对象(内存分配 ) 2. 执行构造方法 3. 执行属性注入(set操作) 4. 执行bean初始化方法 使用bean 执行业务操作 关闭/销毁容器 1.执行bean销毁方法 bean销毁时机 容…...
微服务相关概念
一、谈谈你对微服务的理解,微服务有哪些优缺点?微服务是由Martin Fowler大师提出的。微服务是一种架构风格,通过将大型的单体应用划分为比较小的服务单元,从而降低整个系统的复杂度。优点:1、服务部署更灵活࿱…...
论文解读:(TransA)TransA: An Adaptive Approach for Knowledge Graph Embedding
简介 先前的知识表示方法:TransE、TransH、TransR、TransD、TranSparse等。的损失函数仅单纯的考虑hrh rhr和ttt在某个语义空间的欧氏距离,认为只要欧式距离最小,就认为h和th和th和t的关系为r。显然这种度量指标过于简单,虽然先…...
js将数字转十进制+十六进制(联动el-ui下拉选择框)
十进制与十六进制的整数转化一、十进制转十六进制二、十六进制转十进制三、联动demo一、十进制转十六进制 正则表达式: /^([0-9]||([1-9][0-9]{0,}))$/解析:[0-9]代表个位数,([1-9][0-9]{0,})代表十位及以上 二、十六进制转十进制 正则表达…...
关于RedissonLock的一些所思
关于RedissonClient.getLock() 我们一般的使用Redisson的方式就是: RLock myLock redissonClient.getLock("my_order");//myLock.lock();//myLock.tryLock();就上面的例子里,如果某个线程已经拿到了my_order的锁,那别的线程调用m…...
C++:倒牛奶问题
文章目录题目一、输入二、输出三、思路代码题目 农业,尤其是生产牛奶,是一个竞争激烈的行业。Farmer John发现如果他不在牛奶生产工艺上有所创新,他的乳制品生意可能就会受到重创! 幸运的是,Farmer John想出了一个好主…...
MySQL8.x group_by报错的4种解决方法
在我们使用MySQL的时候总是会遇到各种各样的报错,让人头痛不已。其中有一种报错,sql_modeonly_full_group_by,十分常见,每次都是老长的一串出现,然后带走你所有的好心情,如:LIMIT 0, 1000 Error…...
具有非线性动态行为的多车辆列队行驶问题的基于强化学习的方法
论文地址: Reinforcement Learning Based Approach for Multi-Vehicle Platooning Problem with Nonlinear Dynamic Behavior 摘要 协同智能交通系统领域的最新研究方向之一是车辆编队。研究人员专注于通过传统控制策略以及最先进的深度强化学习 (RL) 方法解决自动…...
TrueNas篇-硬盘直通
硬盘直通 在做硬盘直通之前,在trueNas(或者其他虚拟机)内是检测不到安装的硬盘的。 在pve节点查看硬盘信息 打开pve的shell控制台 输入下面的命令查看硬盘信息: ls -l /dev/disk/by-id/该命令会显示出实际所有的硬盘设备信息,其中ata代…...
手机子品牌的“性能战事”:一场殊途同归的大混战
在智能手机行业进入存量市场后,竞争更加白热化。当各国产手机品牌集体冲高端,旗下子品牌们也正厮杀正酣,显现出刀光剑影。处理器、屏幕、内存、价格等各方面无不互相对标,激烈程度并不亚于高端之争。源于OPPO的中端手机品牌realme…...
dockerfile自定义镜像安装jdk8,nginx,后端jar包和前端静态文件,并启动容器访问
dockerfile自定义镜像安装jdk8,nginx,后端jar包和前端静态文件,并启动容器访问简介centos7系统里面我准备的服务如下:5gsignplay-web静态文件内容如下:nginx.conf配置文件内容如下:Dockerfile内容如下:run.sh启动脚本内容如下:制作镜像并启动访问简介 通过用docker…...
MongoDB 全文检索
MongoDB 全文检索 全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。 这个过程类似于通过字典中的检索字表查字的过…...
JS中声明变量,使用 var、let、const的区别
一、var 的使用 1.1、var 的作用域 1、var可以在全局范围声明或函数/局部范围内声明。当在最外层函数的外部声明var变量时,作用域是全局的。这意味着在最外层函数的外部用var声明的任何变量都可以在windows中使用。 2、当在函数中声明var时,作用域是局…...
wordpress加密页面/自己怎么做网页
在vb.net中利用OleDb的OleDbCommand类操作数据库,有以下这些方法: ExecuteNoQuery() 返回值类型integer,常用来执行增删改操作,返回操作影响的行数 ExecuteReader() 返回一个只读的数据集,常用来作查询操作 ExecuteScalar() 返回值…...
平台网站怎么推广/windows优化大师好吗
解决XP系统访问Win10打印机被拒绝的问题参考文章: (1)解决XP系统访问Win10打印机被拒绝的问题 (2)https://www.cnblogs.com/plain-heart/p/10756979.html 备忘一下。...
备案没有商城可以做商城网站吗/今日中央新闻
boost生成和解析json[转] 原文:《boost生成和解析json》 目录 boost生成和解析json[转] 什么是property_tree? 生成 解析 遍历读取属性 删除节点 修改值 抛出异常 boost json使用过程中需要注意的问题 参考: 《boost::property_tree讲解》《…...
网站优化qq群/全国新冠疫情最新情况
掌握一定的英语知识,具有一定的英语水平是学习每一个专业都必备的学习计算机专业的话,并不会对英语水平作出特别的要求,因此不存在计算机专业对英语水平要求较高的这种担心,基本的英语术语掌握了就可以了。计算机专业的学习&#…...
wordpress主题开发导航制作/石家庄最新新闻事件
最近做OCR的时候,为了方便,使用代码生成所需要的数据,因此,需要使用多种字体文件,记录下遇到的一些问题: 使用的生成器: TextRecognitionDataGenerator 使用python读取.ttf字体文件 # 使用fontT…...
api网站模板/资源搜索引擎
在网上看了几篇AdaBoost的介绍后,感觉网上介绍的都不好,不能够让人完全理解,因此就下载了一个外国人写的代码,总算透彻的理解了AdaBoost,可以向Transfer开进了,现在分享一下代码:主函数代码[pla…...