Laden...

Mit WebClient eine Webseite mit Suchbegriff aufrufen und Ergebnis sehen

Erstellt von HessischerBub vor einem Jahr Letzter Beitrag vor einem Jahr 922 Views
H
HessischerBub Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr
Mit WebClient eine Webseite mit Suchbegriff aufrufen und Ergebnis sehen

Ich versuche eine Webseite mit Hilfe von .NET Framework (Classic) abzufragen um das Ergebnis auswerten zu können.

Ausgesucht habe ich mir: WebClient aus dem Namensraum System.Net, .NET Framework Classic

Aufruf der Webseite klappt, aber wie kann ich da jetzt eine Suchstring abfragen? Leider bin ich was HTML angeht Anfänger.

Finanzsanktionsliste 2022

Mit Parameter wird da nicht gehen, es erfolgt keine Übergabe in der URL in Form von "?", oder?

Ich sehe im Quelltext:

<form action="?" method="post">

Und das hier wird die Schaltfläche sein (value="meinsuchbegriff" habe ich eingegeben).


<div id="divCommandBar">
<div id="divCommands">
  <div><input type="button" value="&#8962;" title="Home/Startseite [H]" style="font-size:95%" onClick="window.location.replace('?')" accesskey="H"></div>
  <div>
    <input type="text" name="txtSearch" title="Textfeld für Suchbegriffe [T]" placeholder="Suchbegriffe" value="meinsuchbegriff" autofocus onFocus="this.select()" accesskey="T">
    <input type="submit" name="cmdSearch" value="&#128269;" title="Suchen [S]" accesskey="S">
  </div>
  <div with="*"><span id="message">0 Treffer</span></div>
</div>
</div>

Wie bekomme ich da mit WebClient ein Suchbegriff gepostet(?) und das Ergebnis dann als String (oder einer Auflistung oder wie auch immer) zurück?

T
2.224 Beiträge seit 2008
vor einem Jahr

Dafür nimmst du am besten den HttpClient, der WebClient ist Obsolete
Steht auch im Hinweis dazu.

WebClient Klasse (System.Net)

Ansonsten musst du die Seite per Post mit den Suchbegriff aufrufen.
Laut dem form Tag geht die Action nach ?
Den Response müsstest du dann selbst parsen.

Besser wäre es aber dort nach einer Api z.B. Rest/Soap basiert.
Sonst könntest du Gefahr laufen, das du die Seite auf eine Art nutzt, die nicht erwünscht ist.

Nachtrag:
Im Browser sieht man dann, dass du txtSearch mit dem Begriff senden musst.
In den Entwickler Tools bei Firefox kann man dies auch gut sehen 😉

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.842 Beiträge seit 2008
vor einem Jahr

Besser wäre es aber dort nach einer Api z.B. Rest/Soap basiert.
Sonst könntest du Gefahr laufen, das du die Seite auf eine Art nutzt, die nicht erwünscht ist.

Herzlich Willkommen in der Welt von Behörden.

In den Entwickler Tools bei Firefox kann man dies auch gut sehen 😉

In den DevTools erkennt man auch, dass man dem oder der Entwicklerin richtig auf die Finger hauen sollte.
Die Seite verletzt im Endeffekt eigene Behörden-Vorgaben und -Gesetze.

Punkt 1: es ist eine Behördenwebseite, es gibt keine Cookie-Hinweise - die Seite schreibt aber in Cookies (die Session ID und der aktuelle Suchbegriff!).
=> Daher wohl DSGVO Verletzung, wofür sich aber natürlich niemand interessieren wird.

Punkt 2:
Es handelt sich um eine prinzipiell einfache Post-Anfrage, jedoch als x-www-form-urlencoded.
Die beiden Suchparameter müssen sein:

  • txtSearch mit dem Suchbegriff
  • cmdSearch mit der Emoji Lupe 🔍 als Value (wtf!)

Die Lupe ist auch das, was offenbar den Suchmodus der Seite aktiviert und man dann die Ergebnisse bekommt.
Prinzipiell also alles mit einer Handvoll Code mit HttpClient umsetzbar - man muss nur erstmal dank DevTools und Postman verstehen wie die Seite funktioniert (richtig dumm, anders nicht betitelbar).

HessischerBub, wenn Du sowas also tun willst: DevTools erlernen.
Absolutes muss bei sowas. Chrome DevTools - Chrome Developers
https://developer.chrome.com/docs/devtools/network/

H
HessischerBub Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Hallo,

zuerst Danke, hat mir sehr geholfen.

In sämtlichen C# Fachbücher die ich durchforste habt kommt das Thema Webabfrage nicht vor.


           WebClient wc = new WebClient();

            string URI = "https://www.finanz-sanktionsliste.de/fisalis/";

            string parametertxtSearch = textBoxSuchbegriff.Text;
            string parametercmdSearch = "🔍"; //"&#128269;"
            string myParameters = "txtSearch=" + parametertxtSearch + "&" + "cmdSearch=" + parametercmdSearch;

            wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            wc.Encoding = Encoding.UTF8;
            string ausgabe = wc.UploadString(URI, myParameters);

            textBoxAusgabe.Text = ausgabe;

Wenn ich den Inhalt der Textbox in eine Datei speichere und diese dann mit Firefox ansehe sehe ich ein Erfolg.

Kann mir jemand ein Stichwort nennen wie ich das Parsen könnte? Ausgabe so ist wie es der Browser anzeigt, also mit Zeilenumbruch. Gibt es da eine Lösung mit C#/.NET Framework die einem bei HTML hilft?

Es kommt ja bei der Abfrage "xx% Wer auf der Sanktionsliste steht" und dann Dokumente aufgeführt, wobei ich mich auf die Zeilen mit "xx% ....." konzentieren würde.

M
368 Beiträge seit 2006
vor einem Jahr

C# .. Webabfrage

Alternativ könnte man hierfür eine Skriptsprache wie Python (i.V. mit z.B. Beautiful Soup) verwenden.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

16.842 Beiträge seit 2008
vor einem Jahr

In sämtlichen C# Fachbücher die ich durchforste habt kommt das Thema Webabfrage nicht vor.

In den meisten, eher fast allen C# Büchern, auch für Anfänger, wird das im Thema API Kommunikation bzw. Networking Grundlagen behandelt.
Findet man auch binnen Sekunden: Google Suche nach "c# book httpclient"
Wenn Du nach "Webanfrage" suchst - nunja. Das ist halt auch nicht der typische technische Begriff dafür.

Aber dazu braucht man nicht mal ein Buch, weil das gesamte Thema in den Microsoft Docs behandelt wird - inkl. vollständigen Beispielen
Verwenden von IHttpClientFactory zur Implementierung robuster HTTP-Anforderungen
HttpClient Klasse (System.Net.Http)

Auch haben wir Dir den Hinweis (+Begründung) gegeben, dass WebClient das falsche Mittel ist - trotzdem nimmst es.
Daher nochmal - etwas deutlicher formuliert, damit das evtl. klarer wird, dass das kein Spaß war: WebClient is nen uralter Scheiss. Lass das sein, nimm den HttpClient wie er seit >10 Jahren empfohlen wird.
HttpClient.PostAsync Methode (System.Net.Http)
Gar nicht erst angewöhnen.

PS: Der Code sieht irgendwie wie ne typische StackOverflow (oder ähnliches) Copy-Paste Sache aus... könnte wetten wenn man danach sucht findet man das 😉

Kann mir jemand ein Stichwort nennen wie ich das Parsen könnte? Google Suche nach "c# parse html" bringt Dich binnen Sekunden auf AngleSharp oder HtmlAgilityPack.

H
HessischerBub Themenstarter:in
3 Beiträge seit 2022
vor einem Jahr

Hallo,

die Bücher die ich habe nach "HttpClient" durchsucht:

C# 2012 Das Entwicklerbuch: 3 Treffer, davon zwei als Beispiel für asynchrone Programmierung
Rheinwerk C# 6 mit Visual Studio 2015: 0 Treffer
Visual C# 2012 Grundlagen und Profiwissen: 0 Treffer bei über 2000 Seiten.

Im letzten Buch sind es auch 0 Treffer für "WebClient".

Bisher wollte ich mir asynchrone Programmierung ersparen und ist in meinem Anwendungsfall auch uninteressant, ohne Ergebnis der Webabfrage geht es ohnehin nichts was parallel erledigt werden könnte, deshalb dann WebClient anstatt HttpClient.

Mittlerweile habe ich das mit dem WebClient in einer abgeleiteten Klasse mit Timeout hinbekommen. Ja, gefunden bei StackOverflow. Aber da ist nichts mit 1:1 Übernehmen.

Meine Lösung (zumindest der erste Ansatz) habe ich gepostet wenn jemand genau das selbe Problem mit der FiSaLis hat und das Thema über Google findet.

Wochenende gucke ich mir das mit HttpClient an und werde dann rudimentär auch wegen asyn nachlesen müssen.

Was das Parsen angeht: Sicherlich hätte ich loslegen können, sicherlich wäre ich auch auf eine Lösung gekommen. Nur ob es da was einfacheres gibt ist das Problem. Über " Beautiful Soup" und dem Wikipedia-Artikel darüber kam ich auf das Stichwort "Web Scraping". Und das war gut um weiterzuforschen und nicht komplett das Rad neu erfinden zu wollen.

16.842 Beiträge seit 2008
vor einem Jahr

Du nimmst zum Lernen Bücher, die 10+ Jahre alt sind? Warum denn das?
Aber wie gesagt: das braucht man nicht mal wirklich. Es gibt die Docs dazu.

Bücher haben eigentlich auch gar nicht den Anspruch Dir eine konkrete Klasse zu erklären, sondern Konzepte.
Für eine Klassen-Erklärung gibt es: Docs 🙂 In jeder Sprache ist das so.

Bisher wollte ich mir asynchrone Programmierung ersparen und ist in meinem Anwendungsfall auch uninteressant, ohne Ergebnis der Webabfrage geht es ohnehin nichts was parallel erledigt werden könnte, deshalb dann WebClient anstatt HttpClient.

Du machst offenbar eine UI Anwendung; hier bist Du gezwungen mit einem solchen Verfahren zu arbeiten, ansonsten blockiert Deine UI.
Das ist ein Grundverhalten von Betriebssystemen und Apps (oder Du arbeitest mit Threads, was noch umständlicher ist).
[FAQ] Warum blockiert mein GUI?

Oder Du lässt es weg und Dir ist egal, dass die UI einfriert.

Web Scraping

ist ein Verfahren, kein Tool oder Lib. Das hilft Dir also bei einer technischen Umsetzung mit Code nur bedingt.
Willst Du Libs, um das nicht selbst coden zu müssen:

AngleSharp oder HtmlAgilityPack.

Ich sag Dir die Dinge ja nicht zum Spaß, oder um Dir unnötig Arbeit zu machen...

16.842 Beiträge seit 2008
vor einem Jahr

Ach, und was ich vergessen hab 🙂

Bisher wollte ich mir asynchrone Programmierung ersparen und ist in meinem Anwendungsfall auch uninteressant, ohne Ergebnis der Webabfrage geht es ohnehin nichts was parallel erledigt werden könnte, deshalb dann WebClient anstatt HttpClient.

Hier scheint ein massives Missverständnis zu existieren: parallele Programmierung hat nichts mit asynchroner Programmierung zutun - zwei völlig verschiedene Konzepte.
Parallele Programmierung hat die CPU im Fokus, etwas parallel zu verarbeiten. Asynchrone Programmierung ist I/O-fokussiert - nicht CPU - es geht also vor allem um Verbindungen zu anderen Systemen (wie bei Dir über HTTP) bzw. eben für Dinge "deren Ausführungsdauer" man nicht kennt und Ressourcen nicht blockieren will.

Beide Konzepte können zwar sehr gut und werden sehr oft kombiniert - müssen aber nicht und haben wie gesagt einen völlig anderen Zweck.
Beispiel: eine sehr lang andauernde mathematische Berechnung kann man parallel umsetzen, um Systemressourcen besser zu verwenden und diese asynchron Ausführen, damit die UI während der Berechnung nicht hängen bleibt.

Und ja: ich kann den HttpClient auch synchron anwenden - wird aber nicht empfohlen.


// nicht benutzen, ausser man will mit aller Gewalt die Nachteile von synchroner Programmierung hier.
string data = _myHttpClient.PostAsync(..).GetAwaiter().GetResult();

HttpClient bietet das per default nicht an - weil man das halt für I/O einfach nicht tun soll.
Es gibt 0,0 Gründe den WebClient zu verwenden.

Wenn Du aber der Meinung bist, dass Du es besser weißt oder einfach den WebClient aus Prinzip nutzen willst: mach das 🙂

T
2.224 Beiträge seit 2008
vor einem Jahr

Beim Thema Bücher kann ich dir folgenden Schinken empfehlen.

C# und .NET 6 vom Hanser Verlag

Ist mit .NET 6.0 sehr aktuell und hat auch zu dem Thema Asynchrone Programmierung ein eigenes Kapitel samt Threads, Tasks und co. 🙂
Auch mit WPF samt DataBinding, was hier auch immer wieder falsch angefangen wird.
Dürfte ein besseres Lehrbuch sein als die 10 Jahre alten Schinken, von denen ich auch einige hier habe.

Alleine durch den Umbruch von .NET Framework zu .NET Core hin zu .NET 5 liegen schon Welten zwischen den Büchern und dem aktuellen Stand.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.