ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 117220|回复: 274

[原创] vba中使用Selenium

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2018-12-17 23:40 | 显示全部楼层 |阅读模式
本帖最后由 源理 于 2018-12-18 00:03 编辑

前几天在博士刘永富在群里用selenium,才发现原来还有这么一款控制浏览器的神器。后来研究了几天,发现很好用。在这里记录一下selenium的用法及示例。

一、概念
什么是selenium?我的理解就是可以用代码来操控各主流浏览器:IE、Chrome、Firefox、Edge、Opera、PhantomJS。操控是什么意思?就是用vba来帮你们在浏览器中完成点击、输入等操作。是不是很神奇!!!用vba来控制chrome,完成网抓、报表填制、批量审批业务等等。。。。。你可以想到的所有的重复性工作。

二、如何开始
     需要安装两种东西:selenium封装器、浏览器。共享下载地址:https://pan.baidu.com/s/1L95GTY4yZWo5zMtuerZhnA 提取码:so6s
1、selenium封装器
      这个封装器是一个叫florentbr的老外写的开源项目,他把selenium封装成了window下的com库,这样我们就能使用vba来使用他了。不过他只更新到了2016年,所有对应的浏览器驱动不是很新。他最大的贡献就是在于把原来java、c#、python才能玩的东西给大家做成了VBA玩家也能玩的东西了。
在下载好我的共享的文件后如下

01

01
点击SeleniumBasic-2.0.9.0。点下一步安装就行了,仅注意这一步的安装选项:

02

02
最后一个是firefox录制宏的插件,其它的是浏览器,自己行选择
2、浏览器。
     我找了很久才匹配上两种浏览器的版本:Chrome_Google_v49.0.2623.112、Firefox Setup 39.0为什么要匹配呢?》因为selenium控制浏览器需各种浏览器的各种驱动,florentbr已经给封装到了SeleniumBasic-2.0.9.0封装器中,安装时就给安装上了。你可以在安装文件中发现这些驱动器如图:

03

03
安装谷歌V49或是火狐39版本浏览器,我在共享中已分享,点击安装即可

三、在vba中开始第一个Selenium的程序
示例1
打开VBE,工具—引用—点击Selenium Type Library

04

04
然后输入以下VBA代码
Sub 示例1()
    Dim cd As New ChromeDriver
    cd.Start
    cd.Get "https://www.baidu.com"
    cd.TakeScreenshot.ToExcel Range("A1")
    Stop '这里可以看一下打开的网页
    cd.Quit
End Sub
运行效果

05

05
代码解释:第一句是新建一个谷歌的驱动、第二句是打开浏览器、第三句是打开的浏览器截图到range(“A1”)

四、网抓示例
示例2:要抓取的网站excelhome首页目录数据,权当一个入门级示例。当时网站数据如下

06

06
效果

07

07
代码
Sub 示例2()
    Dim cd As New ChromeDriver
    cd.Start
    cd.Get "http://www.excelhome.net/"
    cd.FindElementByClass("menu").FindElementsByTag("a").Text.ToExcel Sheet2.Range("A1"), "excelHome首页目录", True
    cd.Quit
End Sub
代码的解释
第一句:创建了一个驱动
第二句:开启谷歌浏览器
第三句:跳转到excelhome首页
第四句:通过驱动查找样式名为“menu”的第一个元素,然后通过查找到的元素在他的子元素中查找a标签的元素,最后把查找到的所有元素的text通过toExcel方法存入到sheet2的range(“A1”)中去。
其中ToExcel参数说明:第一个参数为目标区域即targetRange;
第二个参数为给此text数据组取一个标题名称;第三个参数为是否清除以前目标区域的数据,我这里是清除。
以上看不懂不要紧,我后面会把重要的帮助文档内容翻译出来以供大家理解和参考。
示例3
抓取Office/Excel 2007/10/03行业应用交流与培训 中的数据。此数据为一个table表的数据,具备典型的抓取特点。

08

08
效果

09

09
代码
Sub 示例3()
    Dim cd As New ChromeDriver
    cd.Start
    cd.Get "http://club.excelhome.net/forum.php"
    Dim wele As WebElement
    Set wele = cd.FindElementByXPath("//h2[a='Office/Excel 2007/10/03行业应用交流与培训']/following::table[1]")
    wele.AsTable.ToExcel Sheet2.Range("C1"), True
    Sheet2.Range("C:D").EntireColumn.AutoFit
    Sheet2.Range("A1:A2").EntireRow.AutoFit
End Sub
代码解释
第一句、第二句、第三句以前解释过,不多说。
第四句:定义一个网页元素类
第五句:通过xpath方式获得2007/10/03行业应用交流与培训' 那个table元素。Xpath用法查找h2标签(条件包含一个a标签,其text为“2007/10/03行业应用交流与培训”),再路径其h2同辈后续的第一个table标签。
第六句:转换为table对象。用toexcel方法 存放到sheet2的range(“c1”)中去。
第七句、第八句、VBA 基本用法不解释。
总结selenium网抓优点:用法简单、应用范围广、适用性强、对于有些登录验证的网抓也可以通过打断点的方式完成登录,然后进入网站进行重复性工作。缺点:需要指定版本的浏览器、需要安装selenium包装器、对于定位元素对于普通VBA用户学习成本较高。
后续会重点对定位元素、框架、cookie进行讲解释。


补充内容 (2019-9-8 21:27):
一直关心浏览器版本较老的问题,解决方案是更新一下驱动。具体可以看一下网友的研究与补充:http://club.excelhome.net/thread-1490815-1-1.html

补充内容 (2019-12-11 21:48):
云盘地址过期,请用下面的:
链接: https://pan.baidu.com/s/1PP0Ppw91wOmlbnP0J8e8wA 提取码: y5hk

补充内容 (2020-7-11 21:42):
百度又封了我的分享,重发一下。不知道怎么了。链接: https://pan.baidu.com/s/1A-OHl_Qb3RHFuQlE8IcJGA 提取码: 353h

评分

38

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-12-17 23:42 | 显示全部楼层
本帖最后由 源理 于 2018-12-19 12:39 编辑

五、填写表单
表单填写个经常做的网络操作,这里写几个例子进行演示说明,有input标签的输入有select标签 的选择、键盘功能键的介绍。

示例5
这里进行注册登录表单的填写
这里仅是做一个表单填写的演示。

效果

2-01

2-01

代码
'excel论坛注册页面表单填写
Sub示例4()
    Dim cd As New ChromeDriver
    cd.Start
    cd.Get "http://club.excelhome.net/member.php?mod=join"
   cd.FindElementById("ehusername").SendKeys "源理"
   cd.FindElementById("ehpassword").SendKeys"12345678QWERTY"
   cd.FindElementById("ehpassword2").SendKeys"12345678QWERTY"
   cd.FindElementById("ehemail").SendKeys "304013782@QQ.com"
   cd.FindElementById("invitecode").SendKeys "SendKeys"
   cd.FindElementById("realname").SendKeys "江志"
   cd.FindElementById("mobile").SendKeys "15166668888"
    Stop '看看网页上是不是填好了数据,
    '当然现在所有注册页都有防我们这种恶意注册的机制,行为验证是我这种技术破不了的
    cd.Quit
EndSub
代码解释
第一、二、三句就不解释了。
第四句:驱动通过ID查到WebElement,当获得到元素后向元素Sendkey(即键入)字符。
后面代码与第四句一样。
这里重点说明一下Sendkey方法。
WebElement.Sendkey( keysOrModifier, keys,)
keysOrModifier:字符串或是功能键。功能键是指ctrl、shift、小键盘+-*数字等等功能键。调用Keys. Fields使用。
Keys:字符串。
示例:sendKeys Keys.Control, "s"   ‘即模拟键盘输入ctrl+s。
Keys. Fields  
2-04.png

示例5

效果

2-02

2-02

代码
Sub 示例5()
    Dim cd As New ChromeDriver
    cd.Start
    cd.Get "http://club.excelhome.net/forum.php"
    Dim keys As New keys
    cd.FindElementById("bdcs-search-form-input").SendKeys("Selenium").SendKeys keys.Enter
    Stop
    cd.Quit
End Sub

代码解释
最重要的是第四句:通过id查找到搜索输入框元素,调用SendKeys方法向其输入“Selenium”,并在返回的输入框元素中发一个回车键

示例6
对下拉列表框进行输入值。选中两个select标签的值,分别双色球、18001。网址: http://kaijiang.500.com/?0_ala_baidu

效果

2-03

2-03

代码:
Sub 示例6()
    Dim cd As New ChromeDriver
    cd.Start
    cd.Get "http://kaijiang.500.com/?0_ala_baidu"
    cd.FindElementById("lotTypeSelect").AsSelect.SelectByText "双色球"
    cd.Wait 1000
    cd.FindElementById("selectLotQuery").AsSelect.SelectByText "18001"
    Stop
    cd.Quit
End Sub

关键代码解释
第四句:通过ID获得彩票类型的select选择框,调用ASSelect方法转换成SelectEelemet类,之后调用SelectEelemet类的SelectByText方法选中双色球选项。
第五句:由于后面的期数框的数据是异步请求,所以需要等一定时间。当然这不是最优的代码,wait方法可以改进。
第六句和第四句意思一样。

小结:感觉填报表还是有很多想整理的如wait方法,元素定位,又感觉不应该放在这里。元素定位在这些例子中都有应用,很重要后面一 一整理出来。

评分

4

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-12-18 06:41 | 显示全部楼层
selenium谁用谁知道好用,网抓神器,感谢分享!

TA的精华主题

TA的得分主题

发表于 2018-12-18 07:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
多谢分享,这个的确感觉是比较便利的神器

TA的精华主题

TA的得分主题

发表于 2018-12-18 08:51 | 显示全部楼层
Mark 这个已收藏,占位置听课。

TA的精华主题

TA的得分主题

发表于 2018-12-18 08:54 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-12-18 09:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
很好,謝謝
一直以來只來控制IE, 登入也很不方便

TA的精华主题

TA的得分主题

发表于 2018-12-18 09:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
其实平时办公的用excel顶多是排排学生的成绩,会计总结年底收入等等,谁知道原来一个简简单单的excel还有这么变态的功能,vba真是太神奇了,太强大了.

TA的精华主题

TA的得分主题

发表于 2018-12-18 14:23 | 显示全部楼层
收藏,要跑步才跟得上新知识

TA的精华主题

TA的得分主题

发表于 2018-12-18 14:59 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-24 08:10 , Processed in 0.053637 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表