Żądanie HttpClient jak przeglądarka

Kiedy wywołuję stronę www.livescore.com przez klasę HttpClient zawsze otrzymuję błąd "500". Prawdopodobnie serwer zablokował żądanie od HttpClients.

1)jest jakaś inna metoda, aby uzyskać html ze strony internetowej?

2)Jak mogę ustawić nagłówki, aby uzyskać zawartość html?

Kiedy ustawiam nagłówki jak w przeglądarce, zawsze dostaję zakodowaną zawartość stange.

    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) Jak mogę rozwiązać ten problem? Jakieś sugestie?

Używam aplikacji Windows 8 Metro Style W C # i HttpClientClass

Author: Norbert Pisz, 2013-02-22

4 answers

Proszę bardzo-uwaga musisz zdekompresować kodowany gzip-wynik otrzymasz z powrotem zgodnie :

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);
            }
        }
    }
}

Wywołanie takie jak:

var response = await GetResponse("http://www.livescore.com/").ConfigureAwait(false); // or var response = GetResponse("http://www.livescore.com/").Result;
 52
Author: Jesse C. Slicer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 13:12:03

Może spróbować również dodać obsługę kompresji:

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

To dodaje również nagłówki.

Według tego samego wątku wsparcie jest teraz w Windows Store framework: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression-and-caching?prof=required

 21
Author: user3285954,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-30 10:53:52

Kilka rzeczy do odnotowania.

  1. Ta strona wymaga podania agenta użytkownika lub zwraca błąd HTTP 500.

  2. Wniosek GET do livescore.com odpowiada 302 do livescore.us. musisz obsłużyć przekierowanie lub bezpośrednio zażądać livescore.us

  3. musisz zdekompresować gzip-compressed response

Ten kod działa przy użyciu profilu klienta. NET 4, pozwolę ci dowiedzieć się, czy pasuje do aplikacji Windows Store.

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
Author: siger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 19:05:35

Myślę, że możesz być całkiem pewien, że zrobili wszystko, aby powstrzymać deweloperów od skrobania ekranu.

Jeśli spróbuję ze standardowego projektu C# używając tego kodu:

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

Dostaję taką odpowiedź:

The remote server returned an error: (403) Forbidden.
 0
Author: markoo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 15:13:54