Html Web抓取-VBA搜索参数工作不正常

Html Web抓取-VBA搜索参数工作不正常,html,vba,excel,web-scraping,Html,Vba,Excel,Web Scraping,我正在做一个网页抓取项目,可以从旅游网站上抓取票务信息 我目前遇到一个问题,在我的VBA代码中定义的搜索参数以及后来输入到要执行的网站中的搜索参数不起作用。下面提供了已编写的代码。为了提供一些背景资料,我正在阅读Excel工作簿(例如北京)中的“往返目的地”部分(北京)) 并以网站期望输入的格式(MM-DD-YYYY)定义旅行日期。但是,在运行时,网站似乎无法识别参数,并将我引导到一个页面,上面写着“网站正在维护”.奇怪的是,当我手动输入参数时,网站会识别并提供票务信息 我是否遗漏了什么?我是否

我正在做一个网页抓取项目,可以从旅游网站上抓取票务信息

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

我是否遗漏了什么?我是否必须更新“出发城市”、“到达城市”和“出发日期”之外的其他值?

' 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
我还注意到,当我在多个城市中循环时,站点会搜索与先前定义相同的参数(即,如果搜索上海->北京,它会生成我先前搜索过的天津->北京)。是否有办法通过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中设置值并绕过初始页面

例如,要搜索2015年9月12日从上海开往北京的列车,请加载以下URL

当故障看起来像这样时


出发城市=上海%28%E4%B8%8A%E6%B5%B7%29
到达率=北京%28%E5%8C%97%E4%BA%AC%29
出发日期=12-9-2015
出发站=%E4%B8%8A%E6%B5%B7
到达站=%E5%8C%97%E4%BA%AC

根据我自己的测试,我已经确定上面的每个字段都是必需的,或者您将获得“维护”屏幕

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

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


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

查看所提供url的源代码,在搜索按钮下方有隐藏的输入字段。请尝试使用这些字段。从源代码中…
So而不是“.document.getElementsByName”(“DepartureCity”)(0).Value=sFrom“您建议我使用”.document.getElementsByName(“DepartureCityPinyin”)(0)。Value=sFrom“是的,或者尝试设置两者…只是尝试了一下,但不起作用。同样的问题会出现,它会导致我看到一个页面,上面写着“维护中的页面…请稍后再试”,但一旦我手动输入参数,它就会工作,并给我票务信息。似乎你必须从下拉列表中选择…不完全确定这里发生了什么。困惑。希望这有帮助,你可以手动执行搜索以确定你需要的车站代码…WhiteHat-它似乎不起作用。当我更换DePartureCounty在URL中直接搜索它仍然会恢复到以前在主屏幕中正确搜索过的搜索结果。我想我明白了,每个城市都有自己独特的一组特殊字符