Vb.net 从网站上抓取数据
嗨,我有一个网站,我想从中获取数据,我可以从网站上刮取所有的文本,但我想要的是一个特定的数据位。 我想从中获取数据的示例网站是 首先,我必须选择航线,然后获得并选择月份,然后是航行可用的天数,一旦选择了可用时间 现在我所拥有的一切都在下面Vb.net 从网站上抓取数据,vb.net,visual-studio-2013,screen-scraping,Vb.net,Visual Studio 2013,Screen Scraping,嗨,我有一个网站,我想从中获取数据,我可以从网站上刮取所有的文本,但我想要的是一个特定的数据位。 我想从中获取数据的示例网站是 首先,我必须选择航线,然后获得并选择月份,然后是航行可用的天数,一旦选择了可用时间 现在我所拥有的一切都在下面 Imports System.Net Imports System.IO Imports System.Text.RegularExpressions Public Class Form1 Private Sub scrapeButton_Click(
Imports System.Net
Imports System.IO
Imports System.Text.RegularExpressions
Public Class Form1
Private Sub scrapeButton_Click(sender As Object, e As EventArgs) Handles scrapeButton.Click
If (Not linkURL.Text = Nothing) Then
linkURL.Text = linkURL.Text.ToLower()
If (linkURL.Text.StartsWith("https://") Or linkURL.Text.StartsWith("http://")) Then
If (Not linkURL.Text.StartsWith("https://www.") And Not linkURL.Text.StartsWith("http://www.")) Then
If Not (linkURL.Text.StartsWith("www.")) Then
If (linkURL.Text.StartsWith("http://")) Then
linkURL.Text = "http://www." & linkURL.Text.Substring(7, linkURL.Text.Length - 7)
Else
linkURL.Text = "https://www." & linkURL.Text.Substring(8, linkURL.Text.Length - 8)
End If
End If
End If
ElseIf (linkURL.Text.StartsWith("www.")) Then
linkURL.Text = "http://" & linkURL.Text
Else
linkURL.Text = "http://www." & linkURL.Text
End If
End If
Dim req As WebRequest = WebRequest.Create(linkURL.Text)
Dim res As HttpWebResponse = req.GetResponse()
Dim src As String = New StreamReader(res.GetResponseStream()).ReadToEnd()
srcBox.Text = src
end sub
end class
我不知道如何与网站互动来选择路线,然后从中提取信息,
任何帮助都将不胜感激。在查看该网站后,它似乎正在进行ajax调用以检索您要查找的信息。如果您运行Fiddler或Chrome的网络探查器,您可以看到它在后台进行GET调用。选择路线时,它会进行ajax调用,然后使用json数据填充日期和出发时间选择选项 因此,一种可能的方法是重新创建初始ajax调用,并解析返回的json数据,以构建后续调用以获取其余数据。这样,您就不必担心与html页面或其元素的交互 编辑 下面是一个使用ajax调用的示例。打电话给Dogetroutateta。它有一个表示返回的JSON对象的类。但是有一个问题……最后一行在尝试反序列化json数据时抛出了一个错误。我不知道为什么,也许你能弄明白
Imports System.Runtime.Serialization.Json
Imports System.Runtime.Serialization
Imports System.IO
Imports System.Text
Module Module1
<DataContract()> _
Public Class RouteData
Implements IExtensibleDataObject
' To implement the IExtensibleDataObject interface, you must also
' implement the ExtensionData property.
Private extensionDataObjectValue As ExtensionDataObject
Public Property ExtensionData() As ExtensionDataObject _
Implements IExtensibleDataObject.ExtensionData
Get
Return extensionDataObjectValue
End Get
Set(value As ExtensionDataObject)
extensionDataObjectValue = value
End Set
End Property
<DataMember(Name:="Departure")> _
Public Departure As String '{ get; set; }
<DataMember(Name:="Arrival")> _
Public Arrival As String '{ get; set; }
<DataMember(Name:="SameDay")> _
Public SameDay As Boolean '{ get; set; }
<DataMember(Name:="Route")> _
Public Route As String '{ get; set; }
End Class
Public Sub doGetRouteData()
Dim webRequest = System.Net.HttpWebRequest.Create("http://www.irishferries.com/Service/BookingInformation.svc/SailingTimes/HHDDUB/2014-5-20?version=22")
webRequest.Method = "GET"
webRequest.ContentType = "application/json"
Dim responseReader As StreamReader = New StreamReader(webRequest.GetResponse().GetResponseStream())
Dim responseData As String = responseReader.ReadToEnd()
responseReader.Close()
webRequest.GetResponse().Close()
Dim ser As New DataContractJsonSerializer(GetType(RouteData))
Dim ByteConverter As New UnicodeEncoding()
Dim newRouteData As New List(Of RouteData)
Dim stream = New MemoryStream(ByteConverter.GetBytes(responseData))
newRouteData = CType(ser.ReadObject(stream), List(Of RouteData)) '<= throws an error here, haven't figured out why
End Sub
End Module
导入System.Runtime.Serialization.Json
导入System.Runtime.Serialization
导入System.IO
导入系统文本
模块1
_
公共类路由数据
实现IExtensibleDataObject
'要实现IExtensibleDataObject接口,还必须
'实现ExtensionData属性。
作为ExtensionDataObject的私有extensionDataObjectValue
公共属性ExtensionData()作为ExtensionDataObject_
实现IExtensibleDataObject.ExtensionData
得到
返回extensionDataObjectValue
结束
设置(值为ExtensionDataObject)
extensionDataObjectValue=value
端集
端属性
_
作为字符串{get;set;}的公共离开
_
作为字符串{get;set;}的公共到达
_
公共SameDay作为布尔值“{get;set;}”
_
公共路由作为字符串“{get;set;}”
末级
公共子数据集()
Dim webRequest=System.Net.HttpWebRequest.Create(“http://www.irishferries.com/Service/BookingInformation.svc/SailingTimes/HHDDUB/2014-5-20?version=22")
webRequest.Method=“GET”
webRequest.ContentType=“应用程序/json”
Dim responseReader As StreamReader=新的StreamReader(webRequest.GetResponse().GetResponseStream())
Dim responseData As String=responseReader.ReadToEnd()
responseReader.Close()
webRequest.GetResponse().Close()
Dim ser作为新的DataContractJsonSerializer(GetType(RouteData))
Dim字节转换器作为新的Unicode编码()
将新路由数据标注为新列表(路由数据的)
Dim stream=新内存流(ByteConverter.GetBytes(responseData))
newRouteData=CType(ser.ReadObject(stream),List(Of RouteData))'感谢您的回复,您能给我展示一些代码,重新创建第一个ajax调用并返回json数据吗?我以前从未使用过这两种方法,所以我不知道从哪里开始。我更新了上面的答案。这应该足以让你开始。