HttpClient Request like browser

前端 未结 4 922
自闭症患者
自闭症患者 2020-12-04 14:59

When I calling site www.livescore.com by HttpClient class I always getting error \"500\". Probably server blocked request from HttpClients.

1)There is any other meth

相关标签:
4条回答
  • 2020-12-04 15:09

    I think you can be pretty certain that they have done everything to stop developers from screen-scraping.

    If I try from a standard C# project using this code :

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

    I get this response:

    The remote server returned an error: (403) Forbidden.
    
    0 讨论(0)
  • 2020-12-04 15:15

    Could try this as well to add compression support:

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

    This adds the headers too.

    According to the same thread support is now in Windows Store framework: http://social.msdn.microsoft.com/Forums/windowsapps/en-US/429bb65c-5f6b-42e0-840b-1f1ea3626a42/httpclient-data-compression-and-caching?prof=required

    0 讨论(0)
  • 2020-12-04 15:23

    Here you go - note you have to decompress the gzip encoded-result you get back as per mleroy:

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

    call such like:

    var response = await GetResponse("http://www.livescore.com/").ConfigureAwait(false); // or var response = GetResponse("http://www.livescore.com/").Result;
    
    0 讨论(0)
  • 2020-12-04 15:23

    Several things to take note of.

    1. That site requires you to provide a user agent, or it returns a 500 HTTP error.

    2. A GET request to livescore.com responds with a 302 to livescore.us. You need to handle the redirection or directly request livescore.us

    3. You need to decompress a gzip-compressed response

    This code works using the .NET 4 Client Profile, I'll let you figure out if it fits a Windows Store app.

    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();
    }
    
    0 讨论(0)
提交回复
热议问题