使用Excel VBA和Selenium
公众号-IT赶路人,专注分享与IT相关的知识!关注我,成就最好的自己!
什么是使用Selenium的数据抓取?
Selenium可以归类为自动化工具,它便于从HTML网页中抓取信息,以便利用Google Chrome执行网络抓取。
在本教程中,将学习:
- 什么是使用Selenium的数据抓取?
- 如何在使用Selenium进行数据抓取之前准备Excel宏?
- 如何使用VBA打开Google Chrome?
- 如何用VBA在Google Chrome中打开网站?
- 如何使用VBA从网站上抓取信息?
如何在使用Selenium进行数据抓取之前准备Excel宏?
在进入EXCEL中的数据抓取过程之前,必须对EXCEL宏文件执行某些前提条件。
这些先决条件如下:-
步骤1)打开基于Excel的宏,访问EXCEL的开发人员选项。
步骤2)选择开发人员功能区下的Visual Basic选项。
步骤3)插入新模块。
步骤4)初始化一个新子例程,并将其命名为test2。
Sub test2()
End sub
以下是本单元的成绩:
步骤5)访问Tool页签下的Reference选项,引用Selenium类型库。下面的库将引用到该模块,因为它有助于打开Google Chrome并促进宏脚本的开发。
现在,Excel文件已准备好与Internet Explorer交互。下一步将是合并一个宏脚本,该脚本将促进HTML中的数据抓取。
如何使用VBA打开Google Chrome?
下面是使用VBA打开Google Chrome步骤
步骤1)声明并初始化子例程中的变量,如下所示
Sub test2()
Dim driver as new webdriver
Dim rowc, cc, columnC as integer
步骤2)要使用Selenium和VBA打开Google Chrome,编写驱动程序。启动“Chrome”,然后按F5键。
以下是代码。
Sub test2()
Dim driver as new webdriver
Dim rowc, cc, columnC as integer
Driver.start "Chrome"
Application.Wait Now+Timevalue("00:00:20")
End sub
该模块的结果如下:-
如何用VBA在Google Chrome中打开网站?
一旦能够使用VBA访问google Chrome,下一步就是加入使用VBA访问网站的功能。这得益于GET函数,其中URL必须在属性中作为双引号传递。
按照显示的步骤执行以下步骤
模块将如下所示:
按F5键执行宏。
以下网页将在Google Chrome中打开,如图所示
Sub test2()
Dim driver as new webdriver
Dim rowc, cc, columnC as integer
Driver.start "Chrome"
Driver.get "http://itxiaonv.com/"
Application.Wait Now+Timevalue("00:00:20")
End sub
现在,EXCEL宏已准备好执行抓取任务。下一步将显示如何通过应用Selenium和VBA来提取信息。
如何使用VBA从网站上抓取信息?
假设日内交易者想要每天访问网站上的数据。日内交易者每次按下点击按钮,应该会自动将市场数据拉到EXCEL中。
从上面的网站上,有必要检查元素并观察数据是如何构造的。通过按Ctrl+Shift+I访问以下HTML源代码
<table class="datatable">
<thead>
<th>Company</th>
<th>Group</th>
<th>Pre Close (Rs)</th>
<th>Current Price (Rs)</th>
<th>% Change</th>
</tr>
源代码如下:-
可以看到,数据被组织成单个HTML表。因此,为了从HTML表中提取整个数据,需要设计宏来提取标题信息,如图所示执行以下任务:
步骤1)制定一个作为集合遍历HTML头信息的for循环。为此,我们利用 FindElementByClass() 和FindElementByTag()方法执行任务,如图所示
VBA模块将如下所示:
Sub test2()
Dim driver As New WebDriver
Dim rowc, cc, columnC As Integer
rowc = 2
Application.ScreenUpdating = False
driver.Start "chrome"
driver.Get "http://itxiaonv.com/"
For Each th In driver.FindElementByClass("dataTable").FindElementByTag("thead").FindElementsByTag("tr")
cc = 1
For Each t In th.FindElementsByTag("th")
Sheet2.Cells(1, cc).Value = t.Text
cc = cc + 1
Next t
Next th
步骤2)接下来,Selenium驱动程序将使用类似的方法定位表数据,如上所述。必须编写以下代码:-
Sub test2()
Dim driver As New WebDriver
Dim rowc, cc, columnC As Integer
rowc = 2
Application.ScreenUpdating = False
driver.Start "chrome"
driver.Get"http://itxiaonv.com/"
For Each th In driver.FindElementByClass("dataTable").FindElementByTag("thead").FindElementsByTag("tr")
cc = 1
For Each t In th.FindElementsByTag("th")
Sheet2.Cells(1, cc).Value = t.Text
cc = cc + 1
Next t
Next th
For Each tr In driver.FindElementByClass("dataTable").FindElementByTag("tbody").FindElementsByTag("tr")
columnC = 1
For Each td In tr.FindElementsByTag("td")
Sheet2.Cells(rowc, columnC).Value = td.Text
columnC = columnC + 1
Next td
rowc = rowc + 1
Next tr
Application.Wait Now + TimeValue("00:00:20")
End Sub
VBA模块将如下所示:-
EXCEL可以通过EXCEL表的Range属性初始化,也可以通过EXCEL表的直通单元格属性初始化。为了进一步降低复杂性,text属性帮助获取放置在HTML标记下的文本信息。
Sub test2()
Dim driver As New WebDriver
Dim rowc, cc, columnC As Integer
rowc = 2
Application.ScreenUpdating = False
driver.Start "chrome"
driver.Get"http://itxiaonv.com/"
For Each th In driver.FindElementByClass("dataTable").FindElementByTag("thead").FindElementsByTag("tr")
cc = 1
For Each t In th.FindElementsByTag("th")
Sheet2.Cells(1, cc).Value = t.Text
cc = cc + 1
Next t
Next th
For Each tr In driver.FindElementByClass("dataTable").FindElementByTag("tbody").FindElementsByTag("tr")
columnC = 1
For Each td In tr.FindElementsByTag("td")
Sheet2.Cells(rowc, columnC).Value = td.Text