Como posso baixar código HTML em C #


109

Como posso obter o código-fonte HTML dado um endereço da web em c #?

Respostas:


185

Você pode baixar arquivos com a classe WebClient :

using System.Net;

using (WebClient client = new WebClient ()) // WebClient class inherits IDisposable
{
    client.DownloadFile("http://yoursite.com/page.html", @"C:\localfile.html");

    // Or you can get the file content without saving it
    string htmlCode = client.DownloadString("http://yoursite.com/page.html");
}

Deve notar: se mais controle for necessário, olhe para a classe HttpWebRequest (por exemplo, ser capaz de especificar a autenticação).
Richard,

1
Sim, HttpWebRequest oferece mais controle, embora você possa fazer solicitações POST com WebClient, usando client.UploadData (uriString, "POST", postParamsByteArray);
CMS

1
Não seria prudente pegar o WebException em torno disso? Talvez isso tenha sido assumido. Quaisquer outras exceções ou erros precisam ser detectados com este método?
John Washam

4
@JohnWasham - sim, seria prudente detectar exceções aqui. Felizmente, entretanto, a maioria dos entrevistados do StackOverflow mantém o código de exemplo o mais claro e conciso possível. Tornar o código de exemplo mais próximo da "vida real" apenas adicionaria ruído.
Chris Rogers

O problema que enfrento é que, quando faço o download da origem da página e obtenho dados, se esse site estiver em outro idioma diferente da minha origem da página, não recebo esses valores
Rush.2707

40

basicamente:

using System.Net;
using System.Net.Http;  // in LINQPad, also add a reference to System.Net.Http.dll

WebRequest req = HttpWebRequest.Create("http://google.com");
req.Method = "GET";

string source;
using (StreamReader reader = new StreamReader(req.GetResponse().GetResponseStream()))
{
    source = reader.ReadToEnd();
}

Console.WriteLine(source);

20

A resposta mais recente, mais recente, atualizada
Este post é muito antigo (tinha 7 anos quando respondi), então nenhuma das outras respostas usou a forma nova e recomendada, que é a HttpClientaula.


HttpClienté considerada a nova API e deve substituir as antigas ( WebCliente WebRequest)

string url = "page url";
HttpClient client = new HttpClient();
using (HttpResponseMessage response = client.GetAsync(url).Result)
{
   using (HttpContent content = response.Content)
   {
      string result = content.ReadAsStringAsync().Result;
   }
}

para obter mais informações sobre como usar a HttpClientclasse (especialmente em casos assíncronos), você pode consultar esta pergunta


4
Sugestão: aguarde os métodos assíncronos.
Maarten,

@Maarten, o link a seguir mostra como usar isso com async /
await

17

Você pode obtê-lo com:

var html = new System.Net.WebClient().DownloadString(siteUrl)

Curto e grosso! Encontrei sua sugestão depois de ler o exemplo de Joe Albahari. LINQPad> Ajuda> Novidades e pesquise Cache.
Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // precisa renovar seu cliente!
user1328350

9
Isso é Disposeo WebClient?
JD

11

O modo @cms é o mais recente, sugerido no site da MS, mas tive um problema difícil de resolver, com os dois métodos postados aqui, agora posto a solução para todos!

problema: se você usar uma url como esta: www.somesite.it/?p=1500em alguns casos você obtém um erro interno do servidor (500), embora no navegador da web www.somesite.it/?p=1500funcione perfeitamente.

solução: você tem que mover os parâmetros, o código de trabalho é:

using System.Net;
//...
using (WebClient client = new WebClient ()) 
{
    client.QueryString.Add("p", "1500"); //add parameters
    string htmlCode = client.DownloadString("www.somesite.it");
    //...
}

aqui documentação oficial

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.