2015-12-08 59 views
2

我正在从事一项网络抓取工程,该工程将从旅游网站上刮取票务信息。网页抓取 - VBA搜索参数无法正常工作

我目前遇到一个问题,即在我的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 
+0

看着所提供的的来源,也有隐藏的输入框正下方的搜索按钮。尝试使用这些。来源...'' – WhiteHat

+0

所以不是'.document。getElementsByName(“DepartureCity”)(0).Value = sFrom'您推荐我使用'.document.getElementsByName(“DepartureCityPinyin”)(0).Value = sFrom'而不是? – Jeff

+0

是的,或尝试设置两个... – WhiteHat

回答

1

望着这有点接近,该网站使用GET请求来执行搜索。
因此,不需要加载页面,填充字段,然后单击按钮。
您可以直接在URL中设置值并绕过初始页面。

例如,要搜索列车从上海去北京2015年12月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 = 12-9- 2015年
DepartureStation =%E4%B8%8A%E6%B5%B7
ArrivalStation =%E5%8C%97%E4%BA%AC

从我自己的测试,我已经确定,每个的上述领域是必需的或你得到“维修”屏幕...

这意味着你需要知道站代码以及。

另外,你必须在名字提供特殊字符...

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

+0

希望这会有所帮助,您可以手动执行搜索以确定您需要的站点代码... – WhiteHat

+0

WhiteHat - 它似乎不起作用。当我直接在URL中替换DepartureCity时,它仍会恢复到在主屏幕中正确搜索到的先前搜索结果。 – Jeff

+0

我想我明白了,每个城市都有自己独特的一套特殊字符 – Jeff