Get data from a site

85 Views Asked by At

I want to get special data from a site but i don't know how.

I need a vb.net source code that help to get this data from web every 5 seconds and split them in a form.

How can I achieve this?

1

There are 1 best solutions below

0
On

It looks like the data on the webpage is compressed, so if you had been trying to get the data via WebClient.DownloadString, or WebClient.DownloadData, System.Text.Encoding.UTF8.GetString, then you would not get a readable string. The string might look like this

?y?] ?u??j?7?s?H4??N???{?vS(????7?N?±A?O?f??E???-?O??q)?m,:K?:?{Ij.??J?Uem??-K?ni=KT???c?'?g??-??]??A???a?>???o???????Ys??>??????5ga??Z[?v??s?F????i?eU?/?+,??!?f?9? t?2;bG???(??Y!??oX??Gm??W???????Z???8????=?y?WU??9??7;z?^??????T??Y?8]bih??|N? ...

You can see that the encoding of the response is compressed with the following

client.ResponseHeaders(HttpResponseHeader.ContentEncoding)
' equals gzip

so doing simply

client.DownloadString(address)

will result in the compressed string. To account for compression, use System.IO.GZipStream to decompress.

This code is complete. All you do is make a new Form, add a new Label, and paste this

Public Class Form1

    Private ReadOnly interval As Integer = 5000
    Private ReadOnly t As New System.Threading.Timer(AddressOf updateLabel, Nothing, -1, -1)
    Private ReadOnly address As String = "http://www.tsetmc.com/tsev2/data/instinfodata.aspx?i=35425587644337450&c=27+"

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        t.Change(0, -1)
    End Sub

    Private Sub updateLabel(state As Object)
        Dim text As String
        Try
            text = getString(address)
            t.Change(interval, -1)
        Catch
            text = "error"
        End Try
        Label1.Invoke(Sub() Label1.Text = text)
    End Sub

    Private Shared Function getString(address As String) As String
        Dim text As String
        Using client As New Net.WebClient()
            Using stream = client.OpenRead(address)
                If client.ResponseHeaders(Net.HttpResponseHeader.ContentEncoding) = "gzip" Then
                    Using responseStream = New IO.Compression.GZipStream(stream, IO.Compression.CompressionMode.Decompress)
                        Using reader = New IO.StreamReader(responseStream)
                            text = reader.ReadToEnd()
                        End Using
                    End Using
                Else
                    Using reader = New IO.StreamReader(stream)
                        text = reader.ReadToEnd()
                    End Using
                End If
            End Using
        End Using
        Return text
    End Function

End Class

The code above allows either compressed or non-compressed responses. If you know it's always compressed, you can just use this

Private Shared Function getString(address As String) As String
    Dim text As String
    Using client As New Net.WebClient()
        Using stream = client.OpenRead(address)
            Using responseStream = New IO.Compression.GZipStream(stream, IO.Compression.CompressionMode.Decompress)
                Using reader = New IO.StreamReader(responseStream)
                    text = reader.ReadToEnd()
                End Using
            End Using
        End Using
    End Using
    Return text
End Function

You should now be getting a readable string

12:29:37,A ,5254,5218,5203,5223,5277,5190,1727,16938744,88393224291,1,20191125,122937;98/9/4 14:31:01,F,308477.15,2703.04 0.88%,11256322598042802,2998595530,15357456521865,388202,F,986363991,12363278355103,190712,F,606761,179231120000,6176,;4@63890@5230@5254@100000@2,4@120000@5228@5255@6500@1,2@40000@5222@5259@221500@6,;65589,406538,760335;10352685,6586059,0,14312016,2626728,573,19,0,456,12;;;0;