You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Web Scraping在控制台正常但API应用失效问题排查

问题描述

需要获取亚马逊搜索页面的HTML内容(例如亚马逊德国站机械键盘搜索页),出现以下不一致现象:

  • 本地运行的.NET控制台应用执行相同代码,能正常返回HTML代码
  • 本地运行的.NET API应用,被浏览器中React应用调用时,返回无效乱码内容(响应状态码始终为200)

代码实现

string url = ProductHttpClient.GetProductSearchUrl(searchTerm);
var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Add("Cookie", "i18n-prefs=EUR;");
var response = await httpClient.SendAsync(request);

无效返回结果示例

\u001f�\b\0\0\0\0\0\0�t��j�@\fE��\ne6�\t��E�Igf�\u000f(��"<�\v{lf�$�||��6P��\u0005�#�Az�B>G�Z���9�#_\u0019�\u0018\u001d+(:��(B?...
问题原因与解决方案

问题原因

  1. Gzip压缩未处理:亚马逊服务器返回的响应启用了Gzip压缩,控制台应用的HttpClient默认可能开启了自动解压,而API应用的HttpClient未配置该功能,导致直接返回压缩后的二进制数据,呈现为乱码。
  2. 请求头差异:控制台应用与API应用的请求头存在区别(比如Accept-Encoding),亚马逊根据请求头返回了压缩内容,但API端未做解压处理。

解决方案

方案1:配置HttpClient自动解压

创建HttpClient时,通过HttpClientHandler启用自动解压Gzip/Deflate压缩内容:

var handler = new HttpClientHandler
{
    AutomaticDecompression = DecompressionMethods.Gzip | DecompressionMethods.Deflate
};
var httpClient = new HttpClient(handler);

方案2:手动解压响应流

若无法修改HttpClient的创建逻辑,可手动读取压缩流并解压:

var response = await httpClient.SendAsync(request);
using var stream = await response.Content.ReadAsStreamAsync();
using var decompressedStream = new GZipStream(stream, CompressionMode.Decompress);
using var reader = new StreamReader(decompressedStream);
var htmlContent = await reader.ReadToEndAsync();

方案3:统一请求头并处理压缩

确保API请求的Accept-Encoding头与控制台应用一致,再处理解压:

request.Headers.Add("Accept-Encoding", "gzip, deflate");
// 后续按方案1或方案2处理解压逻辑

内容的提问来源于stack exchange,提问作者sampa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 06:34:52