【问题标题】:How can I decompress GZIP/DEFLATE content with HTTPWebRequest如何使用 HTTPWebRequest 解压缩 GZIP/DEFLATE 内容
【发布时间】:2013-08-14 15:48:27
【问题描述】:

似乎当从 Microsoft HTTPClient(3.5 及之前的包装器)或 HTTPWebResponse(.NET 4.0 及更高版本)读取响应流时,两个实例都开始返回二进制内容。

我们有数百个网络蜘蛛,其中许多使用不同的框架或“一次性”代码。并且他们一一开始为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 时,这是一个工作表示。

【问题讨论】:

  • 投反对票?这在我之前从未发生过......有人可以让我知道我需要在这里做什么才能让这种情况消失,哈哈。

标签: .net httpwebrequest httpclient


【解决方案1】:

当您添加 Accept-Encoding 标头时,您是在告诉 Web 服务器:“请向我发送使用 GZIP 或 DEFLATE 压缩的响应。”

网络服务器尽职尽责地返回这样的响应,您的客户端获取压缩内容。如果您想解压缩该内容,并且您的对象不支持自动解压缩,则必须手动执行此操作。

与其手动添加 Accept-Encoding 标头,不如告诉 .NET 执行此操作并代表您自动解压缩响应。

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

【讨论】:

  • 谢谢,我喜欢使用对象属性而不是字符串输入。我用属性对其进行了测试,它可以工作。 htmlRequest.AutomaticDecompression = (DecompressionMethods.Deflate Or DecompressionMethods.GZip).
【解决方案2】:

正如我在问题中所说:相信它是编码,我编写了一个循环,循环遍历所有可能的编码,包括 UTF8 和 UTF7,甚至是意大利语和其他语言等等。 (139 我认为是)。它将编码名称和 HTML 结果存储在字典中,然后我查看了它,发现它全是垃圾。

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。我研究了框架的变化,但找不到任何解释它的东西。

【讨论】:

    猜你喜欢
    • 2010-12-24
    • 2023-03-30
    • 1970-01-01
    • 2013-05-05
    • 2013-10-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多