Frage

Ich muss einen Prozess automatisieren, der eine Website betrifft, die ein Anmeldeformular verwendet.Ich muss einige Daten auf den Seiten erfassen, die auf die Anmeldeseite folgen.

Ich weiß, wie man normale Seiten per Screenscraping durchsucht, aber nicht die, die sich hinter einer sicheren Website befinden.

  1. Kann dies mit der .NET WebClient-Klasse durchgeführt werden?
    • Wie würde ich mich automatisch anmelden?
    • Wie bleibe ich für die anderen Seiten angemeldet?
War es hilfreich?

Lösung

Eine Möglichkeit wäre die Automatisierung eines Browsers – Sie haben WebClient erwähnt, ich vermute also, dass Sie sich auf WebClient in .NET beziehen.

Zwei Hauptpunkte:

  • Es gibt nichts Besonderes an https im Zusammenhang mit WebClient – ​​es funktioniert einfach
  • Cookies werden in der Regel zur Authentifizierung verwendet – Sie müssen sie erfassen und wiedergeben

Hier sind die Schritte, denen ich folgen würde:

  1. Holen Sie sich das Anmeldeformular und erfassen Sie das Cookie in der Antwort.
  2. Suchen Sie mit Xpath und HtmlAgilityPack nach den Feldnamen und Werten „Eingabetyp=versteckt“.
  3. POST an die Aktion des Anmeldeformulars mit Benutzername, Passwort und ausgeblendeten Feldwerten im Anfragetext.Fügen Sie das Cookie in die Anforderungsheader ein.Erfassen Sie erneut das Cookie in der Antwort.
  4. ERHALTEN Sie erneut die gewünschten Seiten mit dem Cookie in den Anforderungsheadern.

In Schritt 2 erwähne ich eine etwas komplizierte Methode zur Automatisierung des Logins.Normalerweise können Sie mit Benutzername und Passwort direkt zur bekannten Anmeldeformularaktion posten, ohne das ursprüngliche Formular abzurufen oder die ausgeblendeten Felder weiterzuleiten.Einige Websites verfügen in ihren Formularen über eine Formularvalidierung (anders als die Feldvalidierung), weshalb diese Methode nicht funktioniert.

HtmlAgilityPack ist eine .NET-Bibliothek, die es Ihnen ermöglicht, fehlerhaftes HTML in ein XmlDocument umzuwandeln, damit Sie XPath darüber verwenden können.Ziemlich nützlich.

Schließlich kann es vorkommen, dass das Formular vor dem Absenden auf ein Client-Skript angewiesen ist, um die Formularwerte zu ändern.Möglicherweise müssen Sie dieses Verhalten simulieren.

Die Verwendung eines Tools zum Anzeigen des HTTP-Verkehrs für diese Art von Arbeit ist äußerst hilfreich – ich empfehle es ieHttpHeaders, Geiger, oder FireBug (Registerkarte „Netz“).

Andere Tipps

Sie können Benutzereingaben einfach simulieren.Sie können ein Formular auf der Webseite Ihres Programms einreichen, indem Sie eine Post\Get-Anfrage an eine Website senden.
Ein typisches Anmeldeformular sieht so aus:

<form name="loginForm" method="post" Action="target_page.html">
   <input type="Text" name="Username">
   <input type="Password" name="Password">
</form>

Sie können eine Post-Anfrage an die Website senden und dabei Werte für die Felder „Benutzername“ und „Passwort“ angeben.Was passiert, nachdem Sie Ihre Anfrage gesendet haben, hängt weitgehend von der Website ab. Normalerweise werden Sie zu einer bestimmten Seite weitergeleitet.Ihre Autorisierungsinformationen werden im Sitzungs-Cookie gespeichert.Wenn Sie also einen Scrape-Client verwenden, der Websitzungen aufrechterhalten kann und Cookies versteht, können Sie auf geschützte Seiten zugreifen.

Aus Ihrer Frage geht nicht klar hervor, welche Sprache/welches Framework Sie verwenden werden.Zum Beispiel gibt es ein in Perl geschriebenes Framework für Screen Scraping (einschließlich Login-Funktionalität) - WWW::Mechanisieren

Beachten Sie, dass es zu Problemen kommen kann, wenn die Website, auf der Sie sich anmelden möchten, Java-Skripte oder eine Art CAPTCHA verwendet.

Können Sie bitte klarstellen?Ist die WebClient-Klasse, von der Sie sprechen, die in HTTPUnit/Java?

Wenn ja, sollte Ihre Sitzung automatisch gespeichert werden.

Aus Ihrer Frage geht nicht klar hervor, auf welche WebClient-Klasse (oder Sprache) Sie sich beziehen.

Wenn Sie über eine Java Runtime verfügen, können Sie die Apache HttpClient-Klasse verwenden.Hier ist ein Beispiel, das ich mit Groovy geschrieben habe und das über SSL auf die köstliche API zugreift:

   def client = new HttpClient()

   def credentials = new UsernamePasswordCredentials( "username", "password" )
   def authScope = new AuthScope("api.del.icio.us", 443, AuthScope.ANY_REALM)
   client.getState().setCredentials( authScope, credentials )

   def url = "https://api.del.icio.us/v1/posts/get"

   def method = new PostMethod( url )
   method.addParameter( "tag", tag )
   client.executeMethod( method )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top