2

Webサイトから値を取得する必要があります(変更される可能性があり、サイトを制御できません)。私は現在、機能するコードをいくつか持っています...しかし、実行するのに非常に長い時間がかかります。これを行うには大幅に改善された方法があることを私は知っています、私はそれが何であるかを知りません。

私は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

WatiN以上のHTMLAgilityPackを使用してください。

于 2012-06-27T18:12:16.497 に答える
0

問題がWeb要求からの応答を待つことにある場合、それを解析するために使用する実際のエンジンまたは手法は、単にWebからの各応答を同期的に待つよりも、パフォーマンスとはあまり関係がありません。スクレイピングするページのリストが長い場合は、同時リクエストを非同期で実行することで、より適切に処理できます。しかし、それが起こっているのかは明らかではありません。

CsQuery ( NuGetでも)を試してみてください。jQueryの新しいC#ポートで、必要な処理を実行できます。同期的および非同期的にデータを取得するためのメソッドがあるため、並列Web要求を開始したい場合は、そのまま使用できます。ただし、最も基本的なレベルでは、同期的に実行するためのコードは次のようになります。

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

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

jqueryのように機能します。「CQ」オブジェクトはjQueryオブジェクトと同じです。Contents要素のすべての子を返すjQueryメソッドです。RenderSelectionは、選択セット内のすべての要素の完全なHTMLをレンダリングするCsQueryメソッドです。sometagしたがって、これにより、すべてのブロック内のすべての全文とHTMLが返されます。

また、すべての一般的なセレクタータイプの各ドキュメントにインデックスを付け、HTMLAgilityPackよりもはるかに高速です。

于 2012-06-27T20:29:34.637 に答える