Получить данные с сайта
Я хочу получить специальные данные с сайта, но не знаю как.
Мне нужен исходный код vb.net, который помогает получать эти данные из Интернета каждые 5 секунд и разделять их в форме.
Как я могу этого добиться?
1 ответ
Похоже, что данные на веб-странице сжаты, поэтому, если вы пытались получить данные через WebClient.DownloadString
, или WebClient.DownloadData
, System.Text.Encoding.UTF8.GetString
, тогда вы не получите читаемую строку. Строка может выглядеть так
? 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? ...
Вы можете видеть, что кодировка ответа сжимается следующим образом
client.ResponseHeaders(HttpResponseHeader.ContentEncoding)
' equals gzip
так просто
client.DownloadString(address)
приведет к сжатой строке. Чтобы учесть сжатие, используйтеSystem.IO.GZipStream
декомпрессировать.
Этот код готов. Все, что вам нужно сделать, это создать новую форму, добавить новую метку и вставить ее.
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
Приведенный выше код допускает сжатые или несжатые ответы. Если вы знаете, что он всегда сжимается, вы можете просто использовать это
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
Теперь вы должны получить читаемую строку
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 @522800 @ 525, @2@40000@5222@5259@221500@6,;65589,406538,760335;10352685,6586059,0,14312016,2626728,573,19,0,456,12;;;0;