web-dev-qa-db-ja.com

ブラウザのようなHttpClientリクエスト

HttpClientクラスによってサイトwww.livescore.comを呼び出すと、常にエラー「500」が発生します。おそらくサーバーがHttpClientsからの要求をブロックしました。

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スタイルアプリを使用しています

25
Norbert Pisz

ここで、gzipでエンコードされた結果を解凍する必要があることに注意してください persmleroy

private static readonly HttpClient _HttpClient = new HttpClient();

private static async Task<string> GetResponse(string url)
{
    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).ConfigureAwait(false))
        {
            response.EnsureSuccessStatusCode();
            using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
            using (var decompressedStream = new GZipStream(responseStream, CompressionMode.Decompress))
            using (var streamReader = new StreamReader(decompressedStream))
            {
                return await streamReader.ReadToEndAsync().ConfigureAwait(false);
            }
        }
    }
}

次のような呼び出し:

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

これを試して圧縮サポートを追加することもできます:

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

これにより、ヘッダーも追加されます。

同じスレッドによると、Windowsストアフレームワークのサポートは次のとおりです。 1f1ea3626a42/httpclient-data-compression-and-caching?prof = required

21
user3285954

注意すべきいくつかの点。

  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();
}
3
siger

開発者が画面をスクレイピングするのを阻止するために、彼らがすべてを行ったことをかなり確信で​​きると思います。

このコードを使用して標準のC#プロジェクトから試す場合:

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

私はこの応答を受け取ります:

The remote server returned an error: (403) Forbidden.
0
markoo