html - 网页抓取 - VBA 搜索参数无法正常工作

标签 html vba excel web-scraping

我正在从事一个网络抓取项目,该项目将从旅游网站上抓取票务信息。

我目前遇到一个问题,即在我的 VBA 代码中定义的搜索参数以及稍后输入到要执行的网站中的搜索参数不起作用。下面提供了已编写的代码。为了提供一些背景知识,我正在从我的 Excel 工作簿(例如北京(北京))中读取往返目的地,并以与网站希望输入的格式相同的格式 (MM-DD-YYYY) 定义旅行日期. 然而,在运行时,该网站似乎无法识别这些参数并将我引导到一个页面,上面写着“正在维护”。奇怪的是,当我手动输入参数时,该网站会识别它并提供票务信息。

我是不是漏掉了什么?我是否必须更新“DepartureCity”、“ArrivalCity”和“DepartDate”之外的其他值?

我还注意到,当我遍历多个城市时,该站点会搜索与之前定义的参数相同的参数(即,如果搜索上海 -> 北京,则会产生我之前搜索过的天津 -> 北京)。 有没有办法通过 VBA 自动删除搜索历史/缓存?

' save from and to destinations under a defined string
sFrom = Range("C3").Value
sTo = Range("C4").Value

' "i" to track the # of days out as defined by the user
For i = 0 To cntDays
    dtRange = Date + i

    ' establish date to pull train ticketing information on
    If Len(Day(dtRange)) = 1 Then
        sDay = "0" & Day(dtRange)
    Else:
        sDay = Day(dtRange)
    End If

    If Len(Month(dtRange)) = 1 Then
        sMonth = "0" & Month(dtRange)
    Else:
        sMonth = Month(dtRange)
    End If

    sDate = sMonth & "-" & sDay & "-" & Year(dtRange)

    ' instantiate the oIE object
    Set oIE = CreateObject("InternetExplorer.Application")

    ' open Ctrip travel portal
    sURL = "http://english.ctrip.com/trains/#ctm_ref=nb_tn_top"
    With oIE
        .navigate sURL
        .Visible = True

        Do Until (.readyState = 4 And Not .Busy)
           DoEvents
        Loop

        ' search for particular entry
        .document.getElementsByName("DepartureCity")(0).Value = sFrom
        .document.getElementsByName("ArrivalCity")(0).Value = sTo
        .document.getElementsByName("DepartDate")(0).Value = sDate

        MsgBox sFrom
        MsgBox sTo
        MsgBox sDate

        Set ElementCol = .document.getElementsByTagName("button")
            For Each btnInput In ElementCol
                If btnInput.innerText = "Search" Then
                    btnInput.Click
                    Exit For
                End If
            Next btnInput

        ' ensure page has been fully loaded
        Do Until (.readyState = 4 And Not .Busy)
           DoEvents
        Loop

最佳答案

仔细观察一下,该站点使用 GET 请求来执行搜索。
因此,无需加载页面、填充字段和单击按钮。
您可以直接在 URL 中设置值并绕过初始页面。

例如,要搜索 12-9-2015 从上海到北京的火车,请加载以下 URL...

http://english.ctrip.com/trains/List/Index?DepartureCity=shanghai%28%E4%B8%8A%E6%B5%B7%29&ArrivalCity=beijing%28%E5%8C%97%E4%BA%AC%29&DepartDate=12-9-2015&DepartureStation=%E4%B8%8A%E6%B5%B7&ArrivalStation=%E5%8C%97%E4%BA%AC

分解后是这样的……

http://english.ctrip.com/trains/List/Index?
DepartureCity=shanghai%28%E4%B8%8A%E6%B5%B7%29
ArrivalCity=beijing%28%E5%8C%97%E4%BA%AC%29
DepartDate=12-9-2015
DepartureStation=%E4%B8%8A%E6%B5%B7
ArrivalStation=%E5%8C%97%E4%BA%AC

根据我自己的测试,我确定以上每个字段都是必需的,否则您会看到“维护”屏幕...

这意味着您还需要知道车站代码。

此外,您必须在名称中提供特殊字符...

上海%28%E4%B8%8A%E6%B5%B7%29

关于html - 网页抓取 - VBA 搜索参数无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34156412/

相关文章:

vba - 为什么我不能在 VBA 中使用 "Any"作为名称?

excel - Vba 循环遍历数组

c# - 在 C# 中选择性粘贴 vsto Excel

c# - 如何在 c# 中单击按钮时显示 iframe,并在显示另一个网格或 iframe 时使其不可见?

asp.net - 两个 asp 元素之间的 1px 线间隙?

vba - 在 MS Outlook 中,报告所有未收到回复的已发送邮件

.net - 将 Microsoft Excel 与我的应用程序连接是否合法?

excel - VBA - 使用列变量设置范围

html - HTML 和 CSS 中带有底线的图书索引布局样式

javascript - 在删除之前使用 JavaScript 进行提示不起作用