VB.Net使用WebRequest抓取亚马逊页面间歇性乱码问题求解
问题根源
- 没有处理HTTP响应的压缩内容:亚马逊服务端默认会对请求返回
gzip/deflate格式的压缩数据流,你现有代码直接将压缩后的二进制数据按UTF-8文本读取,自然会出现乱码。 - 未设置正常的请求头标识:你的WebRequest没有携带User-Agent等浏览器标准请求头,触发了亚马逊的反爬策略,首次请求会被返回特殊处理的拦截响应(内容异常、移除HEAD标签都属于反爬拦截的特征),短时间内第二次刷新时请求命中了节点临时缓存,才会返回正常内容。
- 硬编码了文本编码为UTF-8,没有从响应头读取实际返回的编码格式,也存在小概率编码不匹配的问题。
修复后的代码
直接替换你test.aspx的内容即可:
<%@ Import Namespace="System" %> <%@ Import Namespace="System.Net" %> <%@ Import Namespace="System.IO" %> <%@ Import Namespace="System.Text" %> <script language="VB" runat="server"> Sub Page_Load(Sender as Object, E as EventArgs) ' 统一设置当前页面输出的编码 Response.ContentType = "text/html; charset=utf-8" Dim q As String Randomize q= (Rnd).ToString() ' 声明HttpWebRequest方便设置专属属性 Dim oRequest As HttpWebRequest = CType(WebRequest.Create("https://www.amazon.com/dp/0132350882/?" & q), HttpWebRequest) ' 开启自动解压缩,自动处理gzip/deflate格式的响应 oRequest.AutomaticDecompression = DecompressionMethods.GZip Or DecompressionMethods.Deflate ' 设置正常的Chrome浏览器UA,绕过基础反爬校验 oRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" ' 补充其他标准请求头,进一步模拟真实浏览器行为 oRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8" oRequest.Headers.Add("Accept-Language", "en-US,en;q=0.5") Dim oResponse As HttpWebResponse = CType(oRequest.GetResponse(), HttpWebResponse) Dim oStream As Stream = oResponse.GetResponseStream() ' 优先从响应头取实际编码,无有效编码时用UTF-8兜底 Dim responseEncoding As Encoding = Encoding.UTF8 If Not String.IsNullOrEmpty(oResponse.CharacterSet) Then Try responseEncoding = Encoding.GetEncoding(oResponse.CharacterSet) Catch End Try End If Dim oStreamReader As New StreamReader(oStream, responseEncoding) Response.Write(oStreamReader.ReadToEnd()) oStreamReader.Close() oResponse.Close() End Sub </script>
额外说明
- 你之前尝试在外层套HTML壳加meta编码标签的方案无法解决问题:首先乱码的根源是服务端返回的压缩流未被解压,和浏览器端的编码声明无关;其次亚马逊返回的本身就是完整的HTML文档,拼接你自己写的外层HTML会导致页面结构错乱。
- 如果你后续需要频繁抓取亚马逊的内容,还需要注意增加请求间隔、使用代理IP池、处理验证码等反爬规避措施,否则即使修改了请求头,还是会被亚马逊的反爬策略拦截。
内容的提问来源于stack exchange,提问作者JimF
相关产品推荐
相关产品推荐

