网页搜罗 - VBA搜索参数无法正常工作

时间:2015-12-08 12:52:54

标签: html excel vba excel-vba 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

1 个答案:

答案 0 :(得分:1)

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

例如,要搜索2015年9月9日从上海到北京的火车,请加载以下网址...

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 =上海%28%E4%B8%8A%E6%B5%B7%29
  ArrivalCity =北京%28%E5%8C%97%E4%BA%AC%29
  DepartDate = 2015年12月9日
  DepartureStation =%E4%B8%8A%E6%B5%B7
  到达站=%E5%8C%97%E4%BA%AC

从我自己的测试中,我已经确定上述每个字段都是必需的,或者你得到了“维护”屏幕......

这意味着您还需要知道电台代码。

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

shanghai%28%E4%B8%8A%E6%B5%B7%29