2

我需要从网站检索一个值(可能会有所不同,我无法控制该网站)。我目前有一些有效的代码......但需要很长时间才能运行。我知道有一种大大改进的方法可以做到这一点,我只是不知道那是什么。

我已经考虑过几种替代方法,例如 Regex 和 HTMLAgilityPack(看起来很复杂,而且可能有点矫枉过正?),但如果没有尝试每种方法,我不确定哪种方法最有效。我相信还有更多的可能性。

问题甚至可能与我如何检索页面而不是我如何处理它有关。

    Dim GETURL As WebRequest
    GETURL = WebRequest.Create("http://www.example.com")
    Dim objStream As Stream = GETURL.GetResponse.GetResponseStream()

    Dim objReader As New StreamReader(objStream)
    Dim sLine As String = ""
    Dim a As Integer = 0
    Dim result As String = ""
    Do While Not sLine Is Nothing
        a += 1
        sLine = objReader.ReadLine
        If Not sLine Is Nothing Then
            result += sLine
        End If
    Loop

    Dim startTag as string ="<some html tag>"
    Dim endTag as string ="<closing tag>"
    Dim firstIndex As Integer = result.IndexOf(startTag) + startTag.Length
    result = result.Substring(firstIndex, result.Length - firstIndex)
    Dim RequiredVal As String = result.Substring(0, result.IndexOf(endTag))

请注意,我确实意识到这段代码是多么低效,但与其尝试加载不同的排列(并且可能仍然有相当低效的代码),我想我会先征求一些专家的建议 :-)

更新:

由于我没有得到任何回应(也许我的问题有点太模糊了?)我一直在努力提高自己的效率。通过使用 WebCient.DownloadString(),我设法将运行时间减少了约 50%。这很好,但我怀疑我可以改进从页面中提取数据。请参阅下面的更新代码:

    Dim client As New WebClient()
    Dim result As String = client.DownloadString("http://www.example.com")

    Dim startTag as string ="<some html tag>"
    Dim endTag as string ="<closing tag>"
    Dim firstIndex As Integer = result.IndexOf(startTag) + startTag.Length
    result = result.Substring(firstIndex, result.Length - firstIndex)
    Dim RequiredVal As String = result.Substring(0, result.IndexOf(endTag))

任何建议将不胜感激。

4

2 回答 2

0

如果您的问题是等待来自 Web 请求的响应,那么您用来解析它的实际引擎或技术可能与性能的关系要小得多,而不是简单地同步等待来自 Web 的每个响应。如果您要抓取的页面列表很长,那么您可以通过异步运行同时请求来做得更好。目前尚不清楚这是怎么回事。

试试CsQuery——也在NuGet上——一个新的 C# jQuery 端口,它应该可以满足你的需求。它具有同步和异步抓取数据的方法,因此如果您确实想启动并行 Web 请求,它可以开箱即用。不过,在最基本的层面上,代码将是这样同步执行的:

CQ doc = CQ.CreateFromUrl("http://www.jquery.com");

string allStuffInsideTag = doc["sometag"].Contents().RenderSelection();

它像 jquery 一样工作。“CQ”对象与 jQuery 对象相同。Contents是返回元素所有子元素的 jQuery 方法;RenderSelection是一个 CsQuery 方法,它呈现选择集中每个元素的完整 HTML。sometag所以这将返回每个块内所有内容的全文和 html 。

它还为所有常见的选择器类型索引每个文档,并且比 HTML Agility Pack 快得多。

于 2012-06-27T20:29:34.637 回答
0

使用WatiN或更好的HTML Agility Pack

于 2012-06-27T18:12:16.497 回答