Frage

Wenn es keine Webservice API zur Verfügung, Ihre einzige Option sein könnte Scrape to Screen, aber wie wollen Sie tun es in c #?

Wie denken Sie, es zu tun?

War es hilfreich?

Lösung

Matt und Paul Antworten sind richtig. „Screen Scraping“ durch den HTML-Code von einer Website Parsen ist in der Regel eine schlechte Idee, weil:

  1. Parsing HTML kann schwierig , vor allem wenn es fehlerhaft ist. Wenn Sie eine sehr sind Schaben, sehr einfache Seite, dann könnte regulären Ausdrücken arbeiten. Andernfalls verwenden Sie einen Parsing Rahmen wie die HTML Agility-Pack.

  2. Websites sind ein bewegliches Ziel . Sie werden Ihr Code jedes Mal, wenn die Quell-Website ändert ihre Markup-Struktur zu aktualisieren.

  3. Screen Scraping spielt nicht gut mit Javascript . Wenn die Ziel-Website ist jede Art von dynamischer Skript mit der Webseite zu manipulieren Sie gehen eine sehr harte Zeit es Schaben haben. Es ist einfach, die HTTP-Antwort zu packen, es viel schwieriger ist, was der Browser-Displays in Reaktion auf clientseitige Skript in dieser Antwort enthalten ist, zu kratzen.

Wenn Screen Scraping die einzige Option ist, sind hier einige Schlüssel zum Erfolg:

  1. Machen Sie es so einfach wie möglich die Muster, die Sie für aussehen zu ändern. Wenn möglich, speichern Sie die Muster als Textdateien oder in einer Ressourcendatei irgendwo. Machen es sehr einfach für andere Entwickler (oder sich in 3 Monaten) zu verstehen, was Markup Sie erwarten, zu finden.

  2. Validieren Sie die Eingabe und sinnvolle Ausnahmen werfen . In Ihrem Parsing-Code, kümmern uns Ihre Ausnahmen sehr nützlich zu machen. Die Zielstelle wird Änderung auf Sie, und wenn das passiert Sie Ihre Fehlermeldungen möchte Ihnen sagen, nicht nur, welcher Teil des Codes ist fehlgeschlagen, aber Warum es ist fehlgeschlagen. Erwähnen Sie sowohl das Muster Sie suchen und den Text Sie vergleichen gegen.

  3. schreiben viele automatisierte Tests . Sie wollen es sehr einfach zu sein, Ihre Schaber in einem zerstörungsfrei zu laufen, weil Sie wird eine Menge iterative Entwicklung tun die Muster richtig zu machen. Automatisieren wie viele Tests, wie Sie können, ist es auf lange Sicht auszahlen wird.

  4. Betrachten wir ein Browser-Automatisierungs-Tool wie Watin . Wenn Sie komplexe Interaktionen mit der Ziel-Website benötigen könnte es einfacher sein, Ihre Schaber aus der Sicht des Browsers zu schreiben selbst, anstatt mit den HTTP-Anfragen und Antworten von Hand mucken.

Wie bei wie Screen Scrape in C #, können Sie entweder Watin verwenden können (siehe oben) und schaben das resultierende Dokument seines DOM verwenden, oder Sie können die WebClient Klasse verwenden [siehe MSDN oder Google] an der rohen HTTP-Antwort, einschließlich den HTML-Inhalte zu bekommen, und dann eine Art von textbasierten Analyse verwenden, um die gewünschten Daten zu extrahieren.

Andere Tipps

Verwenden Sie Html Agility Pack-. Es behandelt schlecht und ungültige HTML. Damit können Sie mit XPath-Abfrage, so dass es sehr einfach für die Daten, die Sie auf das Bild. NICHT einen Parser von Hand schreiben und NICHT reguläre Ausdrücke verwenden, es ist einfach zu ungeschickt.

Der Begriff Sie suchen ist eigentlich genannt Screen Scraping.

Eine Sache, die Sie über Schaben Web-Sites zu berücksichtigen ist, dass sie außerhalb Ihrer Kontrolle sind und häufig und erheblich verändern. Wenn Sie mit Kratzen der Tatsache der Veränderung gehen Sie sollten Ihre Gesamtstrategie trennen. Z.B. Sie müssen Ihren Code früher oder später aktualisieren, mit einem behandeln „sich bewegendes Ziel.“

Hier sind ein paar # links C für den Anfang:

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

Hier sind Probe C # -Code, die Ihnen helfen

Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
    //Create Request Object
    HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    //Set Request Method
    objRequest.Method = WebRequestMethods.Http.Get;
    //Get response from requested url
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    //Read response in stream reader
    StreamReader reader = new StreamReader(objResponse.GetResponseStream());
    string tmp = reader.ReadToEnd();
    objResponse.Close();
    //Set response data to container
    this.pnlScreen.GroupingText = tmp;
}

Nur eine Sache zu beachten, ein paar Leute, die Website als XML erwähnten nach unten ziehen und dann mithilfe von XPath durch die Knoten zu durchlaufen. Es ist wahrscheinlich wichtig, sicherzustellen, dass Sie mit einer Website arbeiten, die in XHTML entwickelt wurden, um sicherzustellen, dass die HTML ein gut aufgebautes XML-Dokument darstellen.

Aus praktischer Sicht (ich habe Dutzende von „Web-interactive“ Apps im Laufe der Jahre geschrieben), habe ich schließlich ließ sich auf Watin kombiniert mit CSQuery .

bietet Watin die Grundlagen des Browser Automatisierung (mit Tasten usw. interagieren), während CSQuery Sie jQuery Stil Syntax verwenden kann den Seiteninhalt zu analysieren.

Ich verwenden Selen für eine Weile (auch für die automatisierte Testen von Websites entwickelt) mit IE und FireFox, aber fand es zu Abstürzen anfällig sein, wenn für die Langzeit Schaben verwendet. Alle meine aktuellen Produktionssysteme sind Watin + CSQuery und zuverlässige Abschaben von mehreren Websites auf einer täglichen Basis.

Hinweis: Ich weiß, Watin hat eine Zeit lang nicht aktualisiert worden, aber "wenn es nicht kaputt ist, verwenden Sie es!":)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top