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数据吗?我以前从未使用过这两种方法,所以我不知道从哪里开始。我更新了上面的答案。这应该足以让你开始。