web-dev-qa-db-fra.com

Lecture de données d'un site Web à l'aide de C #

J'ai une page Web qui ne contient rien sauf quelques chaînes. Pas d'images, pas de couleur d'arrière-plan ou quoi que ce soit, juste un texte brut qui n'est pas vraiment long.

Je me demande simplement quel est le meilleur moyen (par cela, je veux dire, le plus rapide et le plus efficace) de passer la chaîne dans la page Web afin que je puisse l'utiliser pour autre chose (par exemple, afficher dans une zone de texte)? Je connais WebClient, mais je ne sais pas si ça va faire ce que je veux, et en plus, je ne veux même pas essayer cela même si cela a fonctionné car la dernière fois que j'ai fait cela a pris environ 30 secondes une opération simple.

Toute idée serait appréciée.

23
Iceyoshi

La classe WebClient devrait être plus que capable de gérer les fonctionnalités que vous décrivez, par exemple:

System.Net.WebClient wc = new System.Net.WebClient();
byte[] raw = wc.DownloadData("http://www.yoursite.com/resource/file.htm");

string webData = System.Text.Encoding.UTF8.GetString(raw);

ou (suite à la suggestion de Fredrick dans les commentaires)

System.Net.WebClient wc = new System.Net.WebClient();
string webData = wc.DownloadString("http://www.yoursite.com/resource/file.htm");

Quand vous dites que cela a pris 30 secondes, pouvez-vous développer un peu plus? Il y a plusieurs raisons pour lesquelles cela aurait pu se produire. Serveurs lents, connexions Internet, implémentation louche, etc.

Vous pouvez descendre à un niveau inférieur et implémenter quelque chose comme ceci:

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://www.yoursite.com/resource/file.htm");

using (StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream(), Encoding.UTF8))
{
    streamWriter.Write(requestData);
}

string responseData = string.Empty;
HttpWebResponse httpResponse = (HttpWebResponse)webRequest.GetResponse();
using (StreamReader responseReader = new StreamReader(httpResponse.GetResponseStream()))
{
    responseData = responseReader.ReadToEnd();
}

Cependant, à la fin de la journée, la classe WebClient complète cette fonctionnalité pour vous. Je vous suggère donc d'utiliser WebClient et d'enquêter sur les causes du délai de 30 secondes.

27
MrEyes

Si vous téléchargez du texte, nous vous recommandons d'utiliser WebClient et d'obtenir un lecteur de flux pour le texte:

        WebClient web = new WebClient();
        System.IO.Stream stream = web.OpenRead("http://www.yoursite.com/resource.txt");
        using (System.IO.StreamReader reader = new System.IO.StreamReader(stream))
        {
            String text = reader.ReadToEnd();
        }

Si cela prend beaucoup de temps, il s'agit probablement d'un problème de réseau ou d'un problème sur le serveur Web. Essayez d'ouvrir la ressource dans un navigateur et voyez combien de temps cela prend. . Si la page Web est très grande, vous pouvez envisager de la diffuser en plusieurs morceaux plutôt que de la lire complètement jusqu'à la fin, comme dans cet exemple ..__ Consultez le site http://msdn.Microsoft.com/en-us/library/system.io.stream.read.aspx pour savoir comment lire à partir d'un flux.

5
Phill

Concernant la suggestion. Je vous suggère donc d’utiliser WebClient et d’enquêter sur les causes du délai de 30 secondes.

Parmi les réponses à la question System.Net.WebClient déraisonnablement lent

Essayez de définir Proxy = null;

WebClient wc = new WebClient (); wc.Proxy = null;

Crédit à Alex Burtsev

1
Tester
 WebClient client = new WebClient();
            using (Stream data = client.OpenRead(Text))
            {
                using (StreamReader reader = new StreamReader(data))
                {
                    string content = reader.ReadToEnd();
                    string pattern = @"((https?|ftp|Gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)";
                    MatchCollection matches = Regex.Matches(content,pattern);
                    List<string> urls = new List<string>();
                    foreach (Match match in matches)
                    {
                            urls.Add(match.Value);
                    }

              }
0