Steven_Lenny
Steven_Lenny
2019-01-29 21:55

当网页采用js动态获取数据时,HttpClient应如何获取数据?

40
  • c#
  • html5
  • asp.net
  • json

总的问题是这样的:因为我需要在两个城市来回跑,但是机票价格不断变化,就想通过.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类处理这个问题呢?

如果能给出代码我会感激不尽,如果给一个资料的链接也一样很感谢!

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

2条回答

为你推荐