VBA - 点击提交按钮后从网站获取HTML的问题

时间:2016-03-06 03:17:30

标签: html vba web-scraping

我正在尝试从网页的某个部分中删除数据。要进入该部分,我需要填写验证码安全代码并点击一个按钮,但这没关系,因为安全代码实际上是在页面的html中编写的。因此,我正在创建一个IE对象,将其驱动到网页,获取验证码安全代码,将其写入正确的框,点击提交按钮,然后获取html文档,以便我可以从中删除数据。

尽管如此,我正按照我提到的顺序执行这些步骤,似乎在我通过验证码验证之后,获取的html文档不是来自页面的文件,而是来自验证码验证之前的页面。

有谁知道我必须做些什么才能获得正确的html文档,并且能够废弃我真正想要的数据?谢谢。

接下来是子程序的代码:

'Getting National fuel prices from ANP
Sub subANPNationalFuelPrices()
'Creating variables for the URL and the HTML files
Dim urlANP As String: urlANP = "http://www.anp.gov.br/preco/prc/Resumo_Semanal_Index.asp"
Dim htmlANP1 As HTMLDocument

'Creating the IE object
Dim IE As InternetExplorer
Set IE = New InternetExplorer
IE.Visible = True

'Making sure that the webpage is fully load
IE.navigate (urlANP)
Do While IE.readyState <> READYSTATE_COMPLETE
Application.StatusBar = "Getting your data"
DoEvents
Loop

Set htmlANP1 = IE.document

'Getting the Captcha Password
Dim strCaptchaPassword As String
Dim colMyCollection As IHTMLElementCollection
Set colMyCollection = htmlANP1.getElementById("divQuadro").all

Dim objLabel As IHTMLElement

For Each objLabel In colMyCollection
strCaptchaPassword = strCaptchaPassword & objLabel.innerText
Next objLabel

'Getting the input box object and getting it the correct password
Dim objInputBox As IHTMLElement
Set objInputBox = htmlANP1.getElementById("txtValor")
objInputBox.Value = strCaptchaPassword

'Getting the submit button object and clicking it
Dim objInputButton As IHTMLElement
Set objInputButton = htmlANP1.getElementById("image1")
objInputButton.Click

'Getting the true rich data HTML
Set htmlANP1 = IE.document

'Extracting the data from the html document
Dim rngValues As range: Set rngValues = Sheet1.range("B17")
Dim strValues(35) As String
Dim dblValues(35) As Double

Dim objElement1 As IHTMLElement
Set objElement1 = htmlANP1.getElementsByTagName("TABLE")(1)

Dim colCollection1 As IHTMLElementCollection
Set colCollection1 = objElement1.all

Dim intTempCount As Integer
Dim objTempElement As IHTMLElement

intTempCount = 32

For Each objTempElement In colCollection1
Sheet1.Cells(intTempCount, 3) = objTempElement.tagName
Sheet1.Cells(intTempCount, 4) = objTempElement.innerText
intTempCount = intTempCount + 1
Next objTempElement
End sub

2 个答案:

答案 0 :(得分:0)

点击验证码上的按钮后,您无需等待新网页加载。要么再次检查IE的就绪状态,要么在此处结束代码,启动一个计时器,在X秒内再次启动代码,然后检查IE和Document的就绪状态。

答案 1 :(得分:0)

我在使用iFrame的系统上进行抓取,因此使用IE.Readystate并不是非常可靠。通常我必须等待另一个元素“存在”,但使用IsObject(元素)也不是很可靠。我必须做的是在我的主代码中使用一个调用函数的循环,所以如果我正在等待加载的东西,我知道在页面加载后,有一个ID为“UserName”的元素,然后我这样做..

...

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="select_type">
</select>

...

Do Until IsErr(doc, "UserName") = False: Loop

我可以做一个循环语句,一直试图调试它,但这将是一个错误处理的噩梦所以如果你使用一个单独的函数进行打印,它可以在错误后退出函数,然后循环重新启动该功能,它将永远执行此操作,直到存在下一个元素。