1

Microsoft HTTPClient (3.5 以前のラッパー) または HTTPWebResponse (.NET 4.0 以降) から応答ストリームを読み取ると、両方のインスタンスがバイナリ コンテンツを返し始めているようです。

何百もの Web スパイダーがあり、その多くは異なるフレームワークまたは「1 回限りの」コードを使用しています。そして、それらは 1 つずつ HTML のジャンクを返し始めます。私たちが触れてDLLを再構築しているものだと思います。これにより、フレームワークで何かが変わったと思います。

これが私の主な方法です:

Public Function PostPage(ByVal URL As String, ByVal enc As Encoding) As String
    Try
        ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateCertificate)
        Dim htmlRequest As HttpWebRequest = DirectCast(WebRequest.Create(URL), HttpWebRequest)
        htmlRequest.Headers.Add("Accept-Encoding", "gzip, deflate")
        Dim htmlResponse As HttpWebResponse = DirectCast(htmlRequest.GetResponse(), HttpWebResponse)
        Return New System.IO.StreamReader(htmlResponse.GetResponseStream(), enc).ReadToEnd()
    Catch ex As Exception
        Console.WriteLine("Error: " & ex.Message)
    End Try
    Return ""
End Function

これは非常に基本的なもので、何が起こっているのかわかりません。すべてのタイプのエンコーディング (エンコーディングを指定しないことを含む) はバイナリを返します。http://www.google.comこれは、URL として入力したときに何が壊れているかを示す作業表現です。

4

2 に答える 2

2

Accept-Encoding ヘッダーを追加するときは、Web サーバーに「GZIP または DEFLATE を使用して圧縮された応答を送信してください」と伝えていることになります。

Web サーバーはそのような応答を忠実に返し、クライアントは圧縮されたコンテンツを取得します。そのコンテンツを解凍する場合、オブジェクトが自動解凍をサポートしていない場合は手動で行う必要があります。

Accept-Encoding ヘッダーを手動で追加するのではなく、.NET にそれを行い、ユーザーに代わって応答を自動的に解凍するように指示します。

htmlRequest.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;

于 2013-08-15T18:29:16.623 に答える
0

質問で言ったように、エンコーディングだと信じて、UTF8とUTF7、さらにはイタリア語やその他の言語など、すべての可能なエンコーディングをループするループを作成しました。(139だったと思います)。Encoding Name と HTML Result を Dictionary に保存しました。

Sub LearnEncoding(ByVal MyURL As String)
    Dim dctResults As New Dictionary(Of String, String)
    For Each objEncoding In System.Text.Encoding.GetEncodings
        If dctResults.ContainsKey(objEncoding.DisplayName) = False Then
            Dim MySpider As New clsWebSpider
            dctResults.Add(objEncoding.DisplayName, MySpider.PostPage(MyURL, objEncoding.GetEncoding))
        End If
    Next
End Sub

多くの調査とテストの後、問題は次の場所にあることがわかりました。

Accept-Encoding: gzip, deflate

何!?!?

これは既定で MSHTTPClient に含まれており、ブラウザの要求から Fiddler のヘッダーを確認するときに当然存在します。もちろん、ブラウザはジャンクを気にせず、何でもデコードできるようです。私はデコーダを書きません。

そのため、MSHTTPClient を使用する多くのスパイダーでは、DefaultHeaders.AcceptEncoding.Clear() を呼び出し、HttpWebRequests では、AcceptEncoding の設定行を削除しました。それらはすべて、適切な HTML を再び返します。フレームワークの変更を調査しましたが、それを説明するものは見つかりませんでした。

于 2013-08-14T15:48:47.963 に答える