freiberuflicher Software Entwickler C#, vb.Net, vba, UWP, WPF, WinForms, SQL Server, Access, Excel, ASP.Net Core MVC Telefon: 07022/9319004   Kontakt
#

 

 

Diese C# Code Seite zeigt, wie man in Windows Forms (kurz: Winforms ) einen Roboter als Anwendung schreibt, welcher Internet Seiten untersucht und Daten von Internetseiten sammelt.

Hierbei kann man prinzipiell mit zwei Weisen die Daten sammeln,

 

1.)   Mit WebBrowser Control

Hierbei wird ein Browser ferngesteuert und die Information aus dem Browser als Control entnommen

 

2.)   Mit WebRequest und WebResponse

Hierbei werden nur die Webadressen abgefragt und der HTML Text der Webseite wird ausgewertet.

 

Warum Winforms?

Als Platform verwende ich hier Windows Forms mit dem Microsoft .Net Framework, weil Winforms hier am stabilsten läuft. In WPF kann man bis heute noch keine scripterrors unterdrücken und in UWP Universal Windows Platform ist der Funktionsumfang noch weiter reduziert.

Schliesslich handelt dieses Programm mehr als Maschine und bedarf nur begrenzt einer optisch ansprechenden Windows-Oberfläche.

 

Einstieg:

Man erstellt unter Visual Studio eine Windows Classic Desktop Anwendung.

Dann fügt in das Forms1 Formular einen Start-Button, eine Textbox für die URL und eines oder mehrere Ausgabe-Felder als Textbox mit Multiline=true ein.

 

HTML Auswerten mit HtmlAgilityPack

Dann fügt man für die Auswertung von HTML Informationen das HTMLAgiltiyPack hinzu. Hierzu unter Referenzen mit Add Referenze einen zusätzlichen Verweis auf dasHTMLAgilityPack erstellen.

 

 

Um die Funktionen des HtmlAgilityPacks zu verwenden muss man diese im Head Bereich der Code seite einfügen

//< add using >

using html =HtmlAgilityPack;

//</ add using >

Oder

using HtmlAgilityPack;

 

 

Mit C# die Webseite lesen

 

HTMLSeite lesen

Zunächts ermittelt man den kompletten HTML Text einer Webseite.

 

Hierzu erstellt man ein WebRequest und HttpWebResponse Objekt.

WebRequest objRequest = WebRequest.Create(sURL);

HttpWebResponse objResponse = (HttpWebResponse) objRequest.GetResponse();

 

Dann liest man die Webseite in ein lokales HtmlDocument

Stream objDataStream = objResponse.GetResponseStream();

StreamReader TextReader = new StreamReader(objDataStream);

 

string sHTML = TextReader.ReadToEnd();

_doc = new html.HtmlDocument();

_doc.LoadHtml(sHTML);

 

 

C# Methode zum Lesen des HTML Textes als Seite

private void fl_Test()

        {

            //----------------< fl_Test() >----------------

            string sURL = tbxURL.Text;

 

            WebRequest objRequest = WebRequest.Create(sURL);

            HttpWebResponse objResponse = (HttpWebResponse) objRequest.GetResponse();

 

           

            //< Webseite auslesen >

            Stream objDataStream = objResponse.GetResponseStream();

            StreamReader TextReader = new StreamReader(objDataStream);

           

            //< get HTMLdocument >

            string sHTML = TextReader.ReadToEnd();

            _doc = new html.HtmlDocument();

            _doc.LoadHtml(sHTML);

            //</ get HTMLdocument >

 

 

            //< Abschluss >

            TextReader.Close();

            objDataStream.Close();

            objResponse.Close();

            //</ Abschluss >

 

            //< auswerten >

 

            get_Results();

            //----------------</ fl_Test() >----------------

        }

 

 

 

Auswerten

Code zum Auswerten einzelner HTML Elemente des HMTL Dokuments

Mit .SelectNodes(xPath) ermittelt man alle Elemente, welche einen bestimmten HTMLType und möglichst auch Name oder CSS Klassenbezeichnung haben

Danach kann man alle Nodes der Sammlung durchlaufen und einzeln auswerten

            HtmlNodeCollection nodes = _doc.DocumentNode.SelectNodes("//h2[@class='text-module-begin']");

 

 

            foreach (HtmlNode n in nodes)

            {

                HtmlNode a = n.SelectSingleNode("a");

               

                string sTitel = a.InnerText;

                string sURL = a.GetAttributeValue("href","");

 

                sys_Add_Result(sTitel);

            }

 

Gesuchte HTML Elemente

Im gezeigten Beispiel sollen alle HTML Elemente gesammelt warden, welche die Links und Titel der Ebay Anzeigen enthalten.

Wenn man die Webseite mit Alt-F12 untersucht, dann findet man die die HTML Struktur der Webseite wieder. Hierunter erkennt man in diesem Beispiel, dass alle Ergebnisse als <h2 class=text-module-begin>..</h2> definiert sind und innerhalb dieser HTML-Node befindet sich ein <a href=…> Link mit der Titel und URL Bezeichnung.

 

Mit dem Ausführen des C# Codes auf der Form wird alle Links der Webseite geladen und in diesem Fall einfach in die Textbox ausgegeben

 

 

 

Als Video Tutorial

 

 

 

Kompletter C# Code

using HtmlAgilityPack;

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Net;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

//< add using >

using html =HtmlAgilityPack;

//</ add using >

 

namespace webrobot_ebayKleinanzeigen

{

    public partial class frmWebRoboter : Form

    {

        //----------< global>----------

        html.HtmlDocument _doc;

        //----------</ global>----------

 

 

        #region Form

        //-------------------< region: Forms >---------- --------

        public frmWebRoboter()

        {

            InitializeComponent();

        }

        //-------------------</ region: Forms >---------- --------

        #endregion /Form

 

        #region Buttons

        //-------------------< region: Buttons >---------- --------

        private void btnRead_Click(object sender, EventArgs e)

        {

            fl_Test();

        }

        //-------------------</ region: Buttons >---------- --------

        #endregion

 

        #region Methods

        //-------------------< region: Methods >------------------

        private void fl_Test()

        {

            //----------------< fl_Test() >----------------

            string sURL = tbxURL.Text;

 

            sys_Add_Log("Get Website");

            WebRequest objRequest = WebRequest.Create(sURL);

            HttpWebResponse objResponse = (HttpWebResponse) objRequest.GetResponse();

 

            sys_Add_Log("/Get Website");

            sys_Add_Log("Text auslesen");

           

            //< Webseite auslesen >

            Stream objDataStream = objResponse.GetResponseStream();

            //</ Webseite auslesen >

 

            //< Text auslesen >

            StreamReader TextReader = new StreamReader(objDataStream);

            //</ Text auslesen >

           

            //< get HTMLdocument >

            string sHTML = TextReader.ReadToEnd();

            _doc = new html.HtmlDocument();

            _doc.LoadHtml(sHTML);

            //</ get HTMLdocument >

 

            sys_Add_Log("/Text auslesen");

 

 

 

            //< anzeigen >

            tbxHTML.Text = sHTML;

            //</ anzeigen >

 

            sys_Add_Log("/anzeigen");

 

 

            //< Abschluss >

            TextReader.Close();

            objDataStream.Close();

            objResponse.Close();

            //</ Abschluss >

 

            //< auswerten >

 

            get_Results();

            //----------------</ fl_Test() >----------------

        }

 

       

 

        #region Auswerten

        private void get_Results()

        {

            //-------------------< get_Results() >-------------------

            HtmlNodeCollection nodes = _doc.DocumentNode.SelectNodes("//h2[@class='text-module-begin']");

 

 

            foreach (HtmlNode n in nodes)

            {

                HtmlNode a = n.SelectSingleNode("a");

               

                string sTitel = a.InnerText;

                string sURL = a.GetAttributeValue("href","");

 

                sys_Add_Result(sTitel);

            }

 

            //-------------------</ get_Results() >-------------------

        }

        #endregion

 

 

        //-------------------</ region: Methods >------------------

        #endregion

 

 

        #region System

        //-------------------</ region: System Methods >------------------

        private void sys_Add_Log(string parText = "")

        {

            //----------------------< sys_Add_Log() >----------------------

            string sText = tbxLog.Text;

            sText = DateTime.Now.ToLongTimeString() + " " + parText + Environment.NewLine + sText;

            //< automatisch kuerzen >

            if (sText.Length > 10000)

            { sText = sText.Substring(1, 10000); }

            //</ automatisch kuerzen >

            tbxLog.Text = sText;

            //----------------------</ sys_Add_Log() >----------------------

        }

 

        private void sys_Add_Result(string parText = "")

        {

            //----------------------< sys_Add_Log() >----------------------

            string sText = tbxResult.Text;

            sText = DateTime.Now.ToLongTimeString() + " " + parText + Environment.NewLine + sText;

            //< automatisch kuerzen >

            if (sText.Length > 10000)

            { sText = sText.Substring(1, 10000); }

            //</ automatisch kuerzen >

            tbxResult.Text = sText;

            //----------------------</ sys_Add_Log() >----------------------

        }

        //-------------------</ region: System Methods >------------------

        #endregion

    }

}

 

 

Mobile
»
Winforms Webbrowser: HTMLDocument.load Illegal characters in path
»
Winforms Webbrowser: HTMLDocument.load Illegal characters in path
»
HTMLDocument Error: -2147352571

.

Jobs, Projekte, Angebote für Freiberufler, Selbstständig an Raimund.Popp@Microsoft-Programmierer.de