Lesen von Daten von einer Website mit C#

Lesezeit: 5 Minuten

Benutzer-Avatar
Iceyoshi

Ich habe eine Webseite, die außer einigen Zeichenfolgen nichts enthält. Keine Bilder, keine Hintergrundfarbe oder ähnliches, nur einfacher Text, der nicht wirklich lang ist.

Ich frage mich nur, was ist der beste (damit meine ich den schnellsten und effizientesten) Weg, um die Zeichenfolge in der Webseite zu übergeben, damit ich sie für etwas anderes verwenden kann (z. B. Anzeige in einem Textfeld)? Ich kenne WebClient, aber ich bin mir nicht sicher, ob es das tut, was ich will, und außerdem möchte ich das nicht einmal ausprobieren, selbst wenn es funktioniert hat, weil es beim letzten Mal ungefähr 30 Sekunden gedauert hat eine einfache Bedienung.

Irgendwelche Ideen würden geschätzt.

  • Die WebClient-Klasse ist hier die natürliche Wahl. Der Webclient sollte keine 30 Sekunden zum Ausführen benötigen (vorausgesetzt, es gibt keine anderen Netzwerkprobleme).

    – Jimmy

    21. Januar 2011 um 11:32 Uhr


  • Ihre Auswahl ist auf WebClient oder WebRequest/WebResponse beschränkt (was WebClient unter den Kulissen verwendet, also wählen Sie einfach WebClient). Warum es langsam ist, hat nichts mit der Implementierung des .NET-HTTP-Stacks zu tun. Es könnten Netzwerkprobleme sein, eine schlechte Implementierung der Website, die Sie abrufen möchten, wodurch es langsam ist, eine Antwort zurückzugeben, … Zum Beispiel das Ausführen eines Webclients auf einer korrekt geschriebenen Website wie z google.com Es dauert einige Millisekunden, um die Antwort abzurufen, die weit unter den 30 Sekunden liegt, die Sie bei Ihrer Website beobachten.

    – Darin Dimitrow

    21. Januar 2011 um 11:34 Uhr


  • Umgehen Sie Ihre mittlere Analyse? Wenn ja, mit welcher Technologie analysieren Sie es? dh welche Art von Textfeld Win-Formulare, eine andere Website?

    – Rauben

    21. Januar 2011 um 11:37 Uhr

Benutzer-Avatar
MrEyes

Die WebClient-Klasse sollte mehr als in der Lage sein, die von Ihnen beschriebene Funktionalität zu verarbeiten, zum Beispiel:

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

oder (weiter zum Vorschlag von Fredrick in den Kommentaren)

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

Wenn Sie sagen, dass es 30 Sekunden gedauert hat, können Sie das etwas weiter ausführen? Es gibt viele Gründe, warum das passiert sein könnte. Langsame Server, Internetverbindungen, zwielichtige Implementierung usw.

Sie könnten eine Ebene tiefer gehen und so etwas implementieren:

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

Am Ende des Tages schließt die WebClient-Klasse diese Funktionalität jedoch für Sie ab. Daher würde ich vorschlagen, dass Sie WebClient verwenden und die Ursachen für die 30-Sekunden-Verzögerung untersuchen.

  • Alternativ verwenden Sie die DownloadString -Methode und entfernen Sie die Byte-Array-Behandlung: string result = wc.DownloadString(...

    – Fredrik Mörk

    21. Januar 2011 um 11:40 Uhr


  • Ich habe mit der WebClient-Klasse eine Schaltfläche codiert, die eine Seite speichert (obwohl eine ziemlich viel Datenverkehr hat) und dann einige Inhalte in einer Datei durch einige der Inhalte der Seite ersetzt. Mit einer Stoppuhr habe ich gemessen, wie lange es dauerte, und es variierte von 10 bis 40 Sekunden. Die Internetverbindung war vielleicht schlecht, aber ich bezweifle, dass das der Hauptgrund war. Leider habe ich den Code für diesen Button nicht mehr, sonst hätte ich ihn gepostet. :\

    – Iceyoshi

    21. Januar 2011 um 11:41 Uhr

  • @Fredrik: +1 für den DownloadString-Vorschlag

    – MrEyes

    21. Januar 2011 um 11:42 Uhr

  • Übrigens, wird die Seite schneller heruntergeladen, wenn sie für einen Browser angezeigt wird? Ist die Webseite auch sicher – in diesem Fall kann die Validierung von Zertifikaten etwa 40 Sekunden dauern, wenn Ihr Computer das Stammzertifikat nicht kontaktieren kann. Meiner Erfahrung nach kann eine DNS-Fehlkonfiguration oft zu einer langsamen Netzwerkantwort führen.

    – Jimmy

    21. Januar 2011 um 11:44 Uhr


  • @Iceyoshi: Wie viele Daten hast du heruntergeladen? Ein paar KB oder ein paar MB? Sind Sie auch sicher, dass die Verzögerung beim WebClient-Aufruf und nicht beim anschließenden Parsen/Ersetzen aufgetreten ist?

    – MrEyes

    21. Januar 2011 um 11:46 Uhr

Wenn Sie Text herunterladen, würde ich empfehlen, den WebClient zu verwenden und einen Streamreader für den Text zu erhalten:

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

Wenn dies lange dauert, liegt wahrscheinlich ein Netzwerkproblem oder ein Problem auf dem Webserver vor. Versuchen Sie, die Ressource in einem Browser zu öffnen, und sehen Sie, wie lange das dauert. Wenn die Webseite sehr groß ist, möchten Sie sie vielleicht in Teilen streamen, anstatt wie in diesem Beispiel ganz bis zum Ende zu lesen. Ansehen http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx um zu sehen, wie man aus einem Stream liest.

Benutzer-Avatar
Tester

In Bezug auf den Vorschlag würde ich vorschlagen, dass Sie WebClient verwenden und die Ursachen für die 30-Sekunden-Verzögerung untersuchen.

Aus den Antworten auf die Frage System.Net.WebClient unangemessen langsam

Versuchen Sie, Proxy = null einzustellen;

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

Gutschrift an Alex Burtsev

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

              }

1031500cookie-checkLesen von Daten von einer Website mit C#

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy