【问题标题】:Excel VBA / HTML Clicking next page from dropdownExcel VBA / HTML 从下拉列表中单击下一页
【发布时间】:2016-05-31 09:07:39
【问题描述】:

我正在使用 Excel 和 VBA 编写我的第一个数据抓取工具。我被困在试图转到网站的下一页。源代码如下:

<li><a href="#" onclick="changePage(2); return false;">Page 2 of 24</a></li>

这是我拥有但似乎不起作用的 VBA 代码:

For Each l In ie.Document.getElementsByTagName("a")
    If l.href = "#" And l.onclick = "changePage(2); return false;" Then
        l.Item(2).Click
        Exit For
    End If
Next l

当我运行代码时,我没有收到任何错误,但它似乎没有转到第 2 页。请记住,第 2 页之后还有更多页面。我的想法是用变量替换“2”稍后将该变量增加一。但我需要先让它工作。

感谢任何可以提供帮助的人。

【问题讨论】:

  • 只是检查,但您是否尝试过 Navigate 或 Navigate2 而不是 Click 方法?我迫不及待想明天试试这个!
  • 不,我不熟悉导航。你有一个例子吗?我以前用 VBA 编程过,但这是我第一次尝试通过 VBA 唤起 Web 点击/事件。
  • 这里是关于 Navigate 方法的文档,稍后我会尝试找到一些示例代码:msdn.microsoft.com/en-us/library/aa752093.aspx
  • 瑞克,谢谢。我将研究导航方法。假设我可以使用它,你认为给定 html 代码我的条件语句正确吗?如果你能提供一些很有帮助的例子。
  • 它看起来可以工作。我需要更多的示例代码,但我会看看我是否可以把它放在一起。基于其他一些代码,请参阅使用 XMLHTTP 而不是浏览器控件的示例:github.com/rickhenderson/Web-Scraping-With-VBA/blob/master/… 以及其他 StackOverFlow 问题:stackoverflow.com/questions/26128056/…

标签: javascript html excel web-scraping vba


【解决方案1】:

[编辑:我现在有一个解决方案,代码已被替换。 -RDH]

首先我想提一下,如果以这种方式检索到的数据用于商业目的或非个人用途,则违反了 Kelley Blue Book (kbb.com) 服务条款的两个部分。

仅供参考:收集、更新和维护数据(如 BlueBook 或 MLS)的网站非常重视他们的数据,他们不喜欢人们抓取这些数据。我正在和我的一位老同学交谈,她拥有计算机科学学位,现在是一名房地产经纪人,我向她提到能够从 MLS 中刮取住房数据是多么酷,她几乎对我大发雷霆.只是说:人们为创建这些数据而获得报酬,人们使用这些数据谋生。 'Nuff 说。 我能够通过在我自己的服务器上创建一个与您正在寻找的格式相同的网页来运行问题代码,因为自从我在加拿大以来,我得到了不同版本的 bluebook.com 网站。我被重定向到 kbb.com。

+++真正的问题+++

问题是带有#符号的href实际上是带有#的完整URL,当您检查onClick事件时,它实际上包含完整的函数声明,因此您只需搜索部分字符串。

' A good idea to declare the proper datatypes
' because IHTMLElement has the click event but IHTMLAnchorElements don't
Dim l As IHTMLElement
Dim htmlanchors As IHTMLElementCollection
' ...

Set htmlanchors = ie.Document.getElementsByTagName("a")

' Look through all the anchor tags on the page
    For Each l In htmlanchors
       ' Check to see the Href contains a # and the onclick event has specific code
        If InStr(l.href, "#") And InStr(l.onclick, "changePage(3); return false;") Then
            ' Click the current anchor link
            l.Click
            Exit For
        End If
Next l

【讨论】:

  • 我会尝试让它工作并从多个页面检索信息。
  • Rick - 我的代码适用于我的 Excel 版本和美国版的 Bluebook。我似乎唯一不能做的就是让它点击第 2 页(共 7 页)、第 3 页(共 7 页)等。
  • 换句话说,我的问题不在于搜索。我的问题在于页面更改。
  • 对于冗长的答案感到抱歉,但我至少需要一些工作,因为我们看到不同的网站。由于代码 l.onclick 没有大写,因此 VBA 可能无法识别它,因此它要么是错误的方法,要么是错误的对象类型。您是否尝试过单击“调试”>“编译”以查看是否会引发任何其他错误?
  • RIck - 只需进行很小的更改,您的代码就可以正常工作。我需要在 Set htmlanchors = ie.Document.getElementsByTagName("a") 中添加“ie”。现在我只需要查找每个实例的最后一页并遍历它们。我将答案标记为有用。我不确定这是否与标记正确相同。非常感谢您的所有帮助。
【解决方案2】:

你试过了吗

.FireEvent ("onclick")
Or
.FireEvent ("onmouseover")
.FireEvent ("onmousedown")
.FireEvent("onmouseup")

代替.click?有时 JavaScript 操作不会响应 .click

【讨论】:

  • 我没有尝试过这种方法,但我一回到家就会尝试。
【解决方案3】:

Rick – 下面是我的完整代码。我基本上是在尝试抓取 www.the bluebook.com。

Sub ScrapeData()

Dim ie As InternetExplorer
Dim ele As Object
Dim RowCount As Long
Dim myWebsite As String, mySearch1 As String, mySearch2 As String, mySearch3 As String
Dim Document As HTMLDocument

myWebsite = Range("Website").Value
mySearch1 = Range("search1").Value
mySearch2 = Range("search2").Value
mySearch3 = Range("search3").Value

Set mySheet = Sheets("Sheet1")
Range("A6").Value = "Company"
Range("B6").Value = "Address"
Range("C6").Value = "Contact"

RowCount = 7
Set ie = New InternetExplorer
ie.Visible = True
With ie
.Visible = True
.navigate (myWebsite)

Do While .Busy Or .readyState <> 4
    DoEvents
Loop

ie.Document.getElementById("search").Value = mySearch1
ie.Document.getElementById("selRegion").Value = mySearch2
ie.Document.getElementsByClassName("searchBtn")(0).Click

Do While .Busy Or _
    .readyState <> 4
    DoEvents
Loop

For Each ele In .Document.all
    Select Case ele.className
    Case "result_title"
    RowCount = RowCount + 1
    Case "cname"
    mySheet.Range("A" & RowCount) = ele.innerText
    Case "addy_wrapper"
    mySheet.Range("B" & RowCount) = ele.innerText
    End Select
Next ele
End With

'THIS IS THE CODE THAT IS NOT WORKING
For Each l In ie.Document.getElementsByTagName("a")
    If l.href = "#" And l.onclick = "changePage(3); return false;" Then
        l.Item(3).Click
        Exit For
    End If
Next l

Set ie = Nothing
End Sub

【讨论】:

  • 我明天会尝试检查一下,但是我 5 岁的孩子生病了,所以我不会有太多的计算机时间。看起来不错的代码,而您只是缺少一些小东西。老实说,我不做网络抓取,但我觉得在获取页面文本后剩下的只是字符串操作,但我确信这已经过度简化了。
  • Rick - 正如我之前所说,感谢您提供任何帮助。但绝对要先照顾好那个 5yo。我的东西可以等到他好起来。谢谢。
  • 我现在要花一个小时在上面,但明天我可能会浪费我的一天。当我无法解决 VBA 问题时,我讨厌它。虽然这很可能是一个 DOM 问题。您是否必须登录该站点才能检索数据?我可以为 search1、search2 和 search3 使用哪些值?
  • 无需登录。我只使用了search1(公司)和search2(地区)。出于测试目的,我一直在设置 Search1="Building Maintenance Contractors", Search2="New Jersey-North"。结果应该给你 7 页。我一直无法超越第 1 页。
  • 我相信我正在获得一个不同的网站,因为我在加拿大。我被重定向到 kbb.com 并且 HTML 元素完全不同。当我看到您的上一篇文章时,我正要发布部分解决方案。例如,当我只在屏幕底部的主搜索框中使用 Search1 时,我只得到 2 辆福特卡车。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多