.net 如何使用HTTPWebRequest解压GZIP/DEFLATE内容
从Microsoft HTTPClient(3.5及之前版本中的包装器)或HTTPWebResponse(.NET 4.0及更高版本)读取响应流时,两个实例都开始返回二进制内容 我们有数百个web爬行器,许多使用不同的框架或“一次性”代码。他们一个接一个地开始为HTML返回垃圾。我想这是我们正在接触和重建DLL的。这让我觉得框架发生了变化 这是我的主要方法:.net 如何使用HTTPWebRequest解压GZIP/DEFLATE内容,.net,httpwebrequest,httpclient,.net,Httpwebrequest,Httpclient,从Microsoft HTTPClient(3.5及之前版本中的包装器)或HTTPWebResponse(.NET 4.0及更高版本)读取响应流时,两个实例都开始返回二进制内容 我们有数百个web爬行器,许多使用不同的框架或“一次性”代码。他们一个接一个地开始为HTML返回垃圾。我想这是我们正在接触和重建DLL的。这让我觉得框架发生了变化 这是我的主要方法: Public Function PostPage(ByVal URL As String, ByVal enc As Encoding)
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。正如我在问题中所说:我相信这是编码,所以写了一个循环,循环所有可能的编码,包括UTF8和UTF7,甚至是意大利语和其他语言以及所有东西。(我想是的)。它将编码名称和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。我研究了对框架的更改,但找不到任何解释。当您添加接受编码头时,您告诉web服务器:“请向我发送一个使用GZIP或DEFLATE压缩的响应。” Web服务器尽职尽责地返回这样的响应,您的客户机将获得压缩内容。如果要解压缩该内容,如果对象不支持自动解压缩,则必须手动进行解压缩 与其手动添加Accept Encoding标头,不如告诉.NET这样做,并代表您自动解压缩响应
htmlRequest.AutomaticDecompression=DecompressionMethods.Deflate | DecompressionMethods.GZip代码>否决票?这在我身上从未发生过。。。有人能告诉我我需要做什么来消除这种情况吗,哈哈。谢谢,我喜欢使用对象属性而不是字符串输入。我测试了它的性能,它工作正常htmlRequest.AutomaticDecompression=(DecompressionMethods.Deflate或DecompressionMethods.GZip)
。