总的问题是这样的:因为我需要在两个城市来回跑,但是机票价格不断变化,就想通过.NET的HttpClient对携程网的网页进行访问,定时为每几小时一次,然后在后台进行一下分析,当某个机票价格贴近预期的最低价的时候通知我。
我用的VB.NET,但是C#应该更广泛,如果哪位大神可以帮忙回答用C#就可以。
代码如下,我先写了一个类
Imports System.IO
Imports System.Net.Http
Public Class MySpider
Dim callback As CallBackSub
Public Sub CallBackTo(ByVal callclass As CallBackSub)
callback = callclass
End Sub
Public Shared Async Sub GetPage(ByVal url As String, ByVal callclass As CallBackSub)
Dim MyHttpClient As New HttpClient()
Dim str As String = Await GetStringFromUrl(url)
Dim callback0 As CallBackSub = callclass
callback0.Invoke(str)
End Sub
Private Shared Async Function GetStringFromUrl(ByVal Url As String) As Task(Of String)
Using client As HttpClient = New HttpClient()
Try
Dim response As HttpResponseMessage = Await client.GetAsync(Url)
response.EnsureSuccessStatusCode()
Dim responseBody As String = Await response.Content.ReadAsStringAsync()
Return responseBody
Catch e As HttpRequestException
Console.WriteLine(vbLf & "Exception Caught!")
Console.WriteLine("Message :{0} ", e.Message)
Return Nothing
End Try
End Using
End Function
End Class
这个类中的GetStringFromUrl是微软给的例程,然后我用了一个委托来把获取的字符串传递给Form窗体。(我的.NET仅仅勉强入门,正准备task和线程这些,就姑且用委托了,如果有正确的处理方法还麻烦告诉一下)
窗体代码就不贴出来了,就是一个textbox用来接收委托传过去的数据,然后一个button控制getpage
然后问题就在于,我发现我取出response中的数据后,根本找不到机票价格
然后我在浏览器中把网页保存了之后,发现里面有很多js和css文件,我就想是不是有些数据是通过js动态获取的。
最后我试了Windows窗体控件WebBroswer,在赋值了URL之后,仅仅这一句代码就得到了我想要的机票价格数据
TextBox1.Text = WebBrowser1.Document.All(1).InnerText
虽然问题可以说暂时解决,但是我还是觉得,HttpClient作为微软推荐使用的一个类,应该不会处理不了这种动态获取数据的情况,就想请教下各位使用.NET得前辈,是否可以用HttpClient类处理这个问题呢?
如果能给出代码我会感激不尽,如果给一个资料的链接也一样很感谢!