C # 'da HTML kaynağını nasıl indirebilirim


109

C # 'da bir web adresi verilen HTML kaynağını nasıl alabilirim?

Yanıtlar:


185

Dosyaları WebClient sınıfıyla indirebilirsiniz :

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

Unutulmaması gerekenler: Daha fazla kontrole ihtiyaç duyulursa, HttpWebRequest sınıfına bakın (örneğin, kimlik doğrulamasını belirtebilme).
Richard

1
Evet, HttpWebRequest size daha fazla kontrol sağlar, ancak client.UploadData (uriString, "POST", postParamsByteArray) kullanarak WebClient ile POST istekleri de yapabilirsiniz;
CMS

1
Bu konuda WebException'ı yakalamak mantıklı olmaz mı? Belki bu varsayılmıştır. Bu yöntemle başka herhangi bir istisna veya hata yakalanması gerekiyor mu?
John Washam

4
@JohnWasham - evet, burada istisnaları yakalamak akıllıca olacaktır. Neyse ki çoğu StackOverflow katılımcısı, örnek kodu olabildiğince açık ve öz tutar. Örnek kodu "gerçek hayata" daha yakın hale getirmek sadece gürültü katacaktır.
Chris Rogers

Karşılaştığım sorun, sayfa kaynağını indirdiğimde ve veri aldığımda, o web sitesi benim sayfa kaynağımın dışındaki bir dilde olduğundan, bu değerleri
almıyor

40

temelde:

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

En yeni, en yeni, güncel cevap
Bu gönderi gerçekten eski (cevapladığımda 7 yaşında), bu yüzden diğer cevaplardan hiçbiri yeni ve önerilen yolu, yani HttpClientsınıf olanı kullanmadı .


HttpClientyeni API olarak kabul edilir ve eskilerinin yerini almalıdır ( WebClientve 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;
   }
}

HttpClientSınıfın nasıl kullanılacağı hakkında daha fazla bilgi için (özellikle eşzamansız durumlarda), bu soruya başvurabilirsiniz.


NOT 1: Async / await kullanmak istiyorsanız

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

NOT 2: C # 8 özelliklerini kullanıyorsanız

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

4
Öneri: zaman uyumsuz yöntemleri bekleyin.
Maarten

@Maarten aşağıdaki bağlantı bunun async / await stackoverflow.com/questions/33020657/…
Hakan Fıstık

17

Şununla elde edebilirsiniz:

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

Kısa ve güzel! Joe Albahari'nin örneğini okuduktan sonra önerinizi buldum. LINQPad> Yardım> Yenilikler ve Önbellek'i arayın.
Colin

7
var html = new System.Net.WebClient (). DownloadString (siteUrl); // müşterinizi yenilemeniz gerekiyor!
user1328350

9
O mu ? DisposeWebClient
JD

11

@cms yöntemi MS web sitesinde önerilen daha yeni yöntemdir, ancak çözmem gereken zor bir sorun vardı, her iki yöntem de burada yayınlandı, şimdi herkes için çözümü gönderiyorum!

sorun: bunun gibi bir url kullanırsanız: www.somesite.it/?p=1500bazı durumlarda dahili bir sunucu hatası (500) alırsınız, ancak web tarayıcısında bu www.somesite.it/?p=1500mükemmel çalışır.

çözüm: parametreleri taşımalısınız, çalışma kodu:

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

burada resmi belgeler

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.