2011-01-10 16 views
2

Ich frage mich, ob mir jemand hier eine Anleitung geben könnte. Ich möchte in der Lage sein, jedes Bild auf einer Webseite programmatisch so schnell wie möglich zu erhalten. Das ist, was ich zur Zeit mache: (beachten Sie, dass klar ist ein WebBrowser-Steuerelement)Bilder schnell von einer Webseite holen

if (clear.ReadyState == WebBrowserReadyState.Complete) 
{ 
    doc = (IHTMLDocument2)clear.Document.DomDocument; 
    sobj = doc.selection; 
    body = doc.body as HTMLBody; 
    sobj.clear(); 
    range = body.createControlRange() as IHTMLControlRange; 
    for (int j = 0; j < clear.Document.Images.Count; j++) 
    { 
     img = (IHTMLControlElement)clear.Document.Images[j].DomElement; 
     HtmlElement ele = clear.Document.Images[j]; 
     string test = ele.OuterHtml; 
     string test2 = ele.InnerHtml; 

     range.add(img); 
     range.select(); 
     range.execCommand("Copy", false, null); 
     Image image = Clipboard.GetImage(); 
     if (image != null) 
     { 
      temp = new Bitmap(image); 
      Clipboard.Clear(); 
      ......Rest of code ........... 
     } 
    } 
} 

Allerdings finde ich dies für eine Menge von Bildern langsam sein kann, und zusätzlich hijacks es meine Zwischenablage. Ich habe mich gefragt, ob es einen besseren Weg gibt?

+1

Anstatt zu kopieren und einzufügen, warum greifen Sie nicht einfach die URL und laden Sie das Bild direkt herunter?Dies wäre auch viel weniger ressourcenintensiv, wenn Sie 'HttpWebRequest' und' HttpWebResponse' anstelle eines Browser-Steuerelements verwenden. –

+0

Aber wird nicht ein HttpWebRequest/Response erstellen, scannen und dann jedes Bild einzeln abrufen dauert länger als das Holen der Webseite als ein Ganzes mit den Bildern und durchscannen? Ich bin nicht wirklich mit Ressourcen beschäftigt, nur mit der Geschwindigkeit – Megatron

+0

Siehe Antwort ... ein bisschen lang für Kommentare! –

Antwort

1

Ich empfehle die Verwendung HttpWebRequest und HttpWebResponse. In Ihrem Kommentar haben Sie nach Effizienz/Geschwindigkeit gefragt.

Vom Standpunkt der Daten werdenHttpWebRequest wird im schlimmsten Fall das gleiche wie mit einem Browser-Steuerung, aber mit ziemlicher Sicherheit viel besser mit übertragen. Wenn Sie (oder ein Browser) eine Anfrage an einen Webserver stellen, erhalten Sie zunächst nur das Markup für die Seite selbst. Dieses Markup kann Bildverweise, Objekte wie Flash und Ressourcen (wie Skripte und CSS-Dateien) enthalten, auf die verwiesen wird, die jedoch nicht in der eigentlichen Seite enthalten sind. Ein Webbrowser wird dann fortfahren, um alle zugehörigen Ressourcen anzufordern, die zum Rendern der Seite benötigt werden, aber unter Verwendung von HttpWebRequest können Sie nur die Dinge anfordern, die Sie tatsächlich wollen (die Bilder).

Vom Standpunkt der Ressourcen oder Rechenleistung erforderlich Einheiten von einer Seite zu extrahieren, es ist kein Vergleich: eine broswer Steuerung mit weit mehr Ressourcen wird als ein HttpWebResponse scannen. Das Scannen einiger Daten mit C# -Code ist extrem schnell. Das Rendern einer Webseite umfasst JavaScript, Grafik-Rendering, CSS-Parsing, Layout, Caching und so weiter. Es ist eigentlich eine ziemlich intensive Operation. Mit einem Browser unter programmgesteuerter Steuerung wird dies schnell offensichtlich: Ich bezweifle, dass Sie pro Sekunde mehr als eine Seite verarbeiten könnten.

Auf der anderen Seite könnte ein C# -Programm, das direkt mit einem Webserver arbeitet (ohne Rendering-Engine), wahrscheinlich Dutzende, wenn nicht Hunderte von Seiten pro Sekunde verarbeiten. Für alle praktischen Zwecke wären Sie wirklich nur durch die Antwortzeit des Servers und Ihrer Internetverbindung beschränkt.

0

Hier gibt es mehrere Ansätze.

Wenn es eine einmalige Sache ist, navigieren Sie einfach zur Website und wählen Sie Datei> Seite speichern unter ... und lassen Sie den Browser alle Bilder lokal für Sie speichern.

Wenn es eine wiederkehrende Sache ist, gibt es viele verschiedene Möglichkeiten.

  1. kaufen Sie ein Programm, das dies tut. Ich bin mir sicher, dass es Hunderte von Implementierungen gibt.

  2. Verwenden Sie das HTML-Agility-Pack, um die Seite zu erfassen und eine Liste aller gewünschten Bilder zu erstellen. Drehe dann einen Thread für jedes Bild, das heruntergeladen und gespeichert wird. Sie können die Anzahl der Threads abhängig von verschiedenen Faktoren wie der Bandbreite Ihrer Website (und der Sites) und der lokalen Festplattengeschwindigkeit begrenzen. Beachten Sie, dass bei einigen Websites die Anzahl der gleichzeitigen Anfragen pro Verbindung, die sie verarbeiten, willkürlich begrenzt ist. Abhängig von der Site könnte dies so wenig wie 3 sein.

Dies ist keineswegs beweiskräftig. Es gibt viele andere Möglichkeiten. Ich würde es wahrscheinlich nicht über ein WebBrowser-Steuerelement tun. Dieser Code sieht brüchig aus.

Verwandte Themen