先简单介绍一下selenium吧。
你可以通过selenium来控制你的浏览器,可以实现文本填入、点击、双击、鼠标滚动、网站信息爬取、可以代替人工做一些大量且重复的工作。
浅说一下应用场景吧:
比如抢火车票、自动点赞、网站信息爬取、游戏脚本、期待的商品信息更新、催我更新等等~
怎么样,是不是有些迫不及待了。
本博客会尽量写得比较详细,是对新手十分友好的,如果你觉得能帮助到你,麻烦点赞收藏加关注一下吧。废话不多说,开整!
首先第一步——安装驱动:
我们要从官网下载驱动,比如你使用的的谷歌浏览器,那么你就要使用谷歌浏览器的驱动,找到对应版本,下载解压,复制路径,调用,实例化......
很多人都被这一步吓到了从而连第一步都没有迈开(我也经历过)
别担心。我发现一个特别有用的库,一个库就可以省掉以上一堆操作,详见我另外一篇博客:selenium的基本操作——入门篇(环境配置)_晋升阁的博客-CSDN博客
假如你是谷歌浏览器,这里以百度为例:
先用上诉方法使用驱动,将驱动实例化为“driver”
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
就这三行代码就可以使用自动化驱动啦,是不是很简单
接下来开始学习一些基本操作,比如点击、文本输入、键盘键入,文本获取等。但是学习基本操作有个前提,就是你得告诉你的程序你要点击哪里,文本输入到哪里,获取哪里的文本。
定位的方法有很多种,我将教大家一种通用的定位方法——xpath定位,详见我的另一篇博客:
selenium的几种常用定位方式——基础篇(快速上手)_晋升阁的博客-CSDN博客
为了方便理解,以下统一使用xpath定位
| 方法 | 作用 |
|---|---|
| text | 文本内容 |
| size | 属性值的大小 |
| send_keys() | 文本输入 |
| clear() | 清除文本信息 |
| click() | 点击 |
| get_attribute() | 获取属性值 |
可以点击按钮、文本、超链接等,只需定位准确即可。假设我的xpath路径为“//td/tr/a”
只需在定位的后面加上.click() 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').click()
表示我要点击xpath路径为"//td/tr/a"的位置(可以是按钮、文本、超链接等)
将你想输入的文本信息填入你的定位处,假设我想填入‘hello’,我的xpath路径为“//td/tr/a”
只需在定位的后面加上.send_keys(""),括号内填入“hello” 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').send_keys("hello")
假设输入框中有文本信息“hello”,我的xpath路径为“//td/tr/a”,可以通过.clear()方法来清除
只需在定位的后面加上.clear() 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').clear()
假设网站中有一段文字,我们可以定位到这段文字使用.text 方法来获取这段文本信息,我的xpath路径为“//td/tr/a”
只需在定位的后面加上.text 即可,如下所示:
driver.find_element_by_xpath('//td/tr/a').text
不过此时我们仍获取不到任何东西,我们需要定义变量来实例化这段代码并且打印出来才能直观地看到我们获取的文本。很简单,如下所示:
response = driver.find_element_by_xpath('//td/tr/a').text
print = (response)
学到这一步,恭喜你,你已经能爬取绝大部分的网站信息了!!
get_attribute(‘textContent’)#获取元素标签的内容(文本信息)
get_attribute('innerHTML')#获取元素内的全部HTML
get_attribute('outerHTML')#获取包含选中元素的HTML
driver.find_element_by_xpath('//td/tr/a').click()#点击
driver.find_element_by_xpath('//td/tr/a').text#获取文本信息
driver.find_element_by_xpath('//td/tr/a').send_keys("hello")#将文本信息输入输入框
driver.find_element_by_xpath('//td/tr/a').clear()#清除输入框中的文本信息
get_attribute(‘textContent’)#获取元素标签的内容(文本信息)
get_attribute('innerHTML')#获取元素内的全部HTML
get_attribute('outerHTML')#获取包含选中元素的HTML
有界面启动和无界面启动
这行我只讲无界面启动,因为通常都是有界面启动(包括我后面教都是有界面启动),无界面启动很少用的上,但是知道的人不多。
start_option = webdriver.ChromeOptions()
start_option.add_argument('--headless')
start_option.add_argument('--disable-gpu')
driver = webdriver.Chrome(options=start_option)
start_option = webdriver.ChromeOptions()
start_option.headless = True
browser = webdriver.Chrome(options=start_option)
无界面启动的优点是省去了一些杂乱的启动画面,相当于在后台运行操作你的浏览器。缺点是不利于编译和维护等,只适用于独立下载的浏览器驱动
前言:当我们打开一个网页时,有些元素并不是一次性加载全的,如果这个时候让程序去找你给的xpath位置就会报错,那么我们可以让程序等待一会,等待元素全部加载完成我们再去对其进行操作
强制等待需要的是一个python的内置库,不需要下载,直接调用即可。
我们可以直接调用time内置库下的sleep方法,如下所示:
import time #将python的内置库“time”导入进来
time.sleep(1) #使程序沉睡1秒
但是这样强制性等待过于死板,显然不符合我们高效的需求,于是selenium里面提供了两种等待方式来解决所需元素还未加载出来的问题
隐式等待将告诉Web驱动程序在它报错之前等待一定的时间。默认设置为0。一旦我们设置了时间,Web驱动程序将在抛出异常之前等待该时间。设置隐式等待可以用selenium的implicitly_wait()方法
假设需要等待的时长为10秒,如下所示:
driver.implicitly_wait(10)
隐式等待是全局生效的,隐式等待值的设置对 WebDriver 的整个生命周期有效,所以只要设置一次即可,不需要像time.sleep() 在每个地方都进行设置。
显示等待会查找是否有name名为“kw”的元素,判断是否有name名为“kw”的元素。若是有,则执行下一步;若是没有,则等待0.5秒继续查找,直到超过了设置的最大时长然后报错。如下所示:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.baidu.com/?tn=49055317_28_hao_pg'
driver.get(url)
try:
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME, 'kw')))
print('yes')
finally:
print('no')
driver.quit()
显示等待类似于if语句,我个人不太喜好使用显示等待,感觉不如if语句来得实在。
import time #将python的内置库“time”导入进来
time.sleep(1) #使程序沉睡1秒
driver.implicitly_wait(10)#隐式等待,有完整生命周期,故只需设置一次
#显示等待,可用if代替
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.baidu.com/?tn=49055317_28_hao_pg'
driver.get(url)
try:
element = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.NAME, 'kw')))
print('yes')
finally:
print('no')
driver.quit()
好啦,以上就是本期博客全部内容。这些已经可以完成selenium的大部分操作了,有兴趣的小伙伴还可以尝试去爬取网站信息哦,之后我还会写多窗口切换、内嵌iframe网站控制、网络爬虫等等。
喜欢我的内容的麻烦点赞关注加收藏哦~谢谢~
?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear
Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"
我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption
我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?