使用HttpWebRequest下载SEC Edgar网站内容出现乱码问题求助
问题原因分析
1. 响应内容未处理压缩
sec.gov服务器大概率返回了gzip/deflate格式的压缩内容,浏览器会自动完成解压,但HttpWebRequest默认不会自动处理压缩,直接读取流就会出现乱码。
2. 字符编码匹配错误
即使完成解压,若代码未使用网站对应的字符编码(比如网站用UTF-8,你用了系统默认编码),也会导致内容解析乱码。
解决思路
处理压缩响应:
- 先在请求头声明支持压缩:
request.Headers.Add("Accept-Encoding", "gzip, deflate") - 获取响应后根据编码类型解压:
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse) Dim responseStream As Stream If response.ContentEncoding.Equals("gzip", StringComparison.OrdinalIgnoreCase) Then responseStream = New GZipStream(response.GetResponseStream(), CompressionMode.Decompress) ElseIf response.ContentEncoding.Equals("deflate", StringComparison.OrdinalIgnoreCase) Then responseStream = New DeflateStream(response.GetResponseStream(), CompressionMode.Decompress) Else responseStream = response.GetResponseStream() End If
- 先在请求头声明支持压缩:
匹配正确字符编码:
从响应的Content-Type头提取编码信息,用对应编码读取内容:Dim charset As String = "" Dim contentType As String = response.ContentType If contentType.Contains("charset=") Then charset = contentType.Split("charset="c)(1).Trim() End If Dim encoding As Encoding = If(String.IsNullOrEmpty(charset), Encoding.UTF8, Encoding.GetEncoding(charset)) Dim reader As New StreamReader(responseStream, encoding) Dim content As String = reader.ReadToEnd()校验请求头一致性:
重新核对Firefox抓取的请求头,确保User-Agent、Accept等关键字段完全一致。sec.gov对请求头校验较严格,必须使用合法的浏览器类UA,不能用.NET默认的UA标识。
内容的提问来源于stack exchange,提问作者someotherguy
相关产品推荐
相关产品推荐

