像浏览器一样的HttpClient请求

问题描述 投票:0回答:4

当我通过 HttpClient 类调用网站 www.livescore.com 时,我总是收到错误“500”。 可能服务器阻止了来自 HttpClient 的请求。

1)还有其他方法从网页获取html吗?

2)如何设置标题来获取html内容?

当我像在浏览器中一样设置标题时,我总是会得到奇怪的编码内容。

    http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
    http_client.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");

3)我怎样才能解决这个问题?有什么建议吗?

我在 C# 和 HttpClientClass 中使用 Windows 8 Metro 风格应用程序

c# windows-8 http-headers
4个回答
71
投票

在这里 - 请注意,您必须解压缩返回的 gzip 编码结果按照mleroy

private static readonly HttpClient _HttpClient = new();

private static async Task<string> GetResponse(string url, CancellationToken token = default)
{
    using var request = new HttpRequestMessage(HttpMethod.Get, new Uri(url));
    request.Headers.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
    request.Headers.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
    request.Headers.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
    request.Headers.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");

    using var response = await _HttpClient.SendAsync(request, token).ConfigureAwait(false);
    response.EnsureSuccessStatusCode();
    await using var responseStream = await response.Content.ReadAsStreamAsync(token).ConfigureAwait(false);
    await using var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress);
    using var streamReader = new StreamReader(decompressedStream);
    return await streamReader.ReadToEndAsync(token).ConfigureAwait(false);
}

这样称呼:

var response = await GetResponse("http://www.livescore.com/").ConfigureAwait(false); // or var response = GetResponse("http://www.livescore.com/").Result;

26
投票

也可以尝试这个来添加压缩支持:

var compressclient = new HttpClient(new HttpClientHandler() 
{ 
AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip 
}); 

这也会添加标题。

Windows Store 框架中现在支持相同的线程: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression -and-caching?prof=必需


5
投票

有几点需要注意。

  1. 该网站要求您提供用户代理,否则会返回 500 HTTP 错误。

  2. 对livescore.com 的GET 请求会向livescore.us 响应302。您需要处理重定向或直接请求livescore.us

  3. 您需要解压缩 gzip 压缩的响应

此代码使用 .NET 4 客户端配置文件工作,我会让您弄清楚它是否适合 Windows 应用商店应用程序。

var request = (HttpWebRequest)HttpWebRequest.Create("http://www.livescore.com");
request.AllowAutoRedirect = true;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17";

string content;

using (var response = (HttpWebResponse)request.GetResponse())
using (var decompressedStream = new GZipStream(response.GetResponseStream(), CompressionMode.Decompress))
using (var streamReader = new StreamReader(decompressedStream))
{
    content = streamReader.ReadToEnd();
}

1
投票

我认为你可以非常肯定他们已经尽一切努力阻止开发人员抓取屏幕。

如果我尝试使用此代码在标准 C# 项目中:

  var request = WebRequest.Create("http://www.livescore.com ");
  var response = request.GetResponse();

我收到这样的回复:

The remote server returned an error: (403) Forbidden.
© www.soinside.com 2019 - 2024. All rights reserved.