当我通过 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 风格应用程序
在这里 - 请注意,您必须解压缩返回的 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;
也可以尝试这个来添加压缩支持:
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=必需
有几点需要注意。
该网站要求您提供用户代理,否则会返回 500 HTTP 错误。
对livescore.com 的GET 请求会向livescore.us 响应302。您需要处理重定向或直接请求livescore.us
此代码使用 .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();
}
我认为你可以非常肯定他们已经尽一切努力阻止开发人员抓取屏幕。
如果我尝试使用此代码在标准 C# 项目中:
var request = WebRequest.Create("http://www.livescore.com ");
var response = request.GetResponse();
我收到这样的回复:
The remote server returned an error: (403) Forbidden.