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.