it-swarm.com.de

HttpClient-Anfrage wie Browser

Wenn ich die Site www.livescore.com von der HttpClient-Klasse anrufe, erhalte ich immer die Fehlermeldung "500" . Möglicherweise blockiert der Server die Anfrage von HttpClients.

1) Gibt es eine andere Methode, um HTML von der Webseite zu bekommen?

2) Wie kann ich die Header so einstellen, dass HTML-Inhalte abgerufen werden?

Wenn ich Header wie im Browser setze, bekomme ich immer seltsame verschlüsselte Inhalte.

    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) Wie kann ich dieses Problem lösen? Irgendwelche Vorschläge?

Ich verwende Windows 8 Metro Style App in C # und HttpClientClass

25
Norbert Pisz

Los geht's - beachte, dass du das gzip-kodierte Ergebnis dekomprimieren musst, das du zurückerhältst wie promleroy :

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

nennen wie:

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

Könnte dies auch versuchen, um Komprimierungsunterstützung hinzuzufügen: 

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

Dadurch werden auch die Header hinzugefügt. 

Dem gleichen Thread zufolge ist der Support jetzt im Windows Store Framework: http://social.msdn.Microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression -und-caching? prof = erforderlich

21
user3285954

Einige Dinge zu beachten.

  1. Für diese Site müssen Sie einen Benutzeragenten angeben, oder es wird ein 500-HTTP-Fehler zurückgegeben.

  2. Eine GET-Anfrage an livescore.com antwortet mit einem 302 auf livescore.us. Sie müssen die Weiterleitung vornehmen oder Livescore.us direkt anfordern

  3. Sie müssen eine gzip-komprimierte Antwort dekomprimieren

Dieser Code funktioniert mit dem .NET 4-Client-Profil. Ich lasse Sie wissen, ob es für eine Windows Store-App passt.

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

Ich denke, Sie können ziemlich sicher sein, dass sie alles getan haben, um Entwickler vom Bildschirm-Scraping abzuhalten.

Wenn ich es mit einem Standard-C # -Projekt mit diesem Code probiere:

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

Ich bekomme diese Antwort:

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