Schreiben einen Web-Roboter in delphi


In diesem Artikel veranschaulicht David Bolton einen einfachen Web-Roboter erstellen, der das mehrere parallele Suchvorgänge auf eine Suchmaschine und jede Website in den Ergebnissen besucht und downloads dieser Seite.
In diesem Artikel veranschaulicht David Bolton einen einfachen Web-Roboter erstellen, der mehrere parallele Suchvorgänge auf einer Suchmaschine führt dann jeder Website in den Ergebnissen besucht und downloads dieser Seite. Es verwendet die ActiveX-Komponenten von Internet Explorer 4 oder 5.
Vorbehalt-wie ursprünglich geschriebenen Code mit Altavista funktionieren würde, aber das hat wahrscheinlich geändert, ein Dutzend Mal dies so wahrscheinlich, als Ihre Chance, Bicyling, Mt. Everest zu arbeiten! Copernicus (als www.copernic.com) ist ein genial (und kostenlos) Suche Motor Sucher und sie Upgrades für bestimmte Motoren regelmäßig ausstellen. Wenn Sie ein Schreiben, mit Copernicus spielen möchten. Ich bewerte es 11 von 10. (Nein ich habe keine Finanicial oder sonst Verbindung zu ihnen-ich bin nur ein sehr sehr zufriedener Kunde).
Obwohl es exotisch klingt, ist ein Bot (auch bekannt als eine Spinne, intelligent Agent Web Robot, Crawler, Roboter und So weiter) einfach ein Programm, das eine Reihe von Web-Sites besucht. Die bekanntesten Bots sind natürlich die Spinnen, die von verschiedenen Suchmaschinen zu den Katalog neu eingesetzt. Werfen Sie einen Blick auf das Web und finden Sie viele Hinweise und Informationen. Es gibt sogar ein Buch zu diesem Thema, veröffentlicht von Microsoft Press: Programmieren von Bots, Spinnen und intelligente Agenten in Visual C++ von David Pallmann (ISBN 0-7356-0565-3). Es lohnt sich immer, wenn Sie schriftlich von Bots interessiert sind und die keine waten durch C++-Code.
Wenn Sie einen Bot erstellen, sollten Sie sich bewusst sein, dass Material Ihr Bot sammelt von Websites, die sie besucht, können gut damit urheberrechtlich geschützt werden darauf achten, wie Sie es verwenden. Eine andere Sache zu beachten ist dies: Wenn Ihr Bot wiederholt eine Website besucht, könnte es der Website-Besitzer, stören, besonders wenn sie bezahlten Werbung tragen. Für eine ähnliche Reaktion nur erwähnen Sie Video-Recorder, die Anzeigen automatisch zu überspringen oder Tivo Werbung Menschen. Natürlich, wenn Ihr Bot eine bestimmte Website hammer und ruft bemerkt, könnten Sie feststellen, dass Ihre IP-Adresse Zugriff auf diese Site (die gefürchtete 403!) nicht mehr möglich ist. In diesem Fall ist ein Dialup-Konto, wo der ISP Ihnen eine dynamische IP-Adresse gibt, wahrscheinlich eine viel bessere Idee. Ich werde den Robot Exclusion Standard später in Bezug auf dies erläutern.
Das Hauptproblem mit rollenden eigene Bot ist nicht es ist, wie schnell ist Ihre Internet-Verbindung dem Code schreiben. Für ernsthafte Krabbeln, benötigen Sie eine dauerhafte Verbindung, keine Einwahl!
Programmierbare durchsuchen
Microsoft hat Leben viel einfacher gemacht Surfen Objekte in Internet Explorer (IE) ab Version 4 für Bot Schöpfer (und Schöpfer des Virus, Trojaner Autoren!) ihre übliche Praxis, einschließlich ein paar ActiveX. Eigentlich ist dieser Ansatz wiederverwendbare 'Motor' zu bewundern, wenn nur es war nicht so sehr missbraucht! Wenn Sie diese benutzen, kümmern sie 99 Prozent der schwierige Sachen wie Internetzugang, Firewalls und an den Seiten HTML download per HTTP. IE hat viel Funktionalität erbaut, und vieles davon ist zugänglich. IE 3 hatte einige Objekte in ihm, aber ich bin mir nicht sicher, ob dies in gleicher Weise verwendbar sind.
Wenn Sie ein glühender IE-Hasser sind, nehmen Sie Herz! Sie müssen nicht Ihre Prinzipien verraten oder überspringen Sie in diesem Artikel. Wenn Sie IE Objekte verwenden, sehen Sie eigentlich nie IE-es ist voll in Windows integriert.
WebBrowser ist der Name des ActiveX-Objekts von IE. Mit Delphi 3 Wenn Sie IE auf Ihrem PC installiert haben, müssen Sie den Typ Bibliothek Einheit-gehe zu Import-ActiveX-Steuerelemente in Delphi, wählen Sie Microsoft Internet Controls erstellen und installieren klicken. Sie sollten jetzt sehen, TWebBrowser_V1, TWebBrowser und TShellFolderViewOC auf der Registerkarte ActiveX-Komponente-Palette auf. Wir werden TWebBrowser verwendet. Delphi 4 stellt ein Problem dar, die aufgrund von Änderungen im Umgang mit ActiveX zwischen Delphi-Versionen 3 und 4. Ein Programm, das unter Delphi 3 lief generiert eine EOLESysError unter Delphi 4: 'CoInitialize nicht genannt.' Die Typbibliothek Pascal-Quellcode für das Steuerelement ist jetzt doppelt so groß wie in Delphi 5, als es in Delphi 3 war. Haben Sie Delphi 4, empfehlen Ihnen entweder Upgrade auf Delphi 5 ich oder jemanden finden, der es hat und sehen, ob die Delphi 5-shdocvw.pas für Sie arbeitet. Alle IE-Objekt Funktionen in der Datei 'Shdocvw.dll' enthalten ist.
Wenn Sie Delphi 5 oder 6 haben, brauchen Sie nicht, dies zu tun. TWebBrowser ersetzt die ältere THTML-Komponente und ist die letzte Komponente auf der Registerkarte Internet. Erhalten Sie auch eine Demo mit diesem in den Ordner Demos/Coolstuff, und die Hilfe-Datei hat ein paar Sachen auf TWebBrowser, aber merkwürdigerweise hat noch keine Borland die TWebBrowser_V1-Komponente hinzugefügt, auch wenn es in der Quelldatei. Wenn Sie mehr über die Verwendung von TWebBrowser oder TWebBrowser_V1 erfahren möchten, gehen Sie auf www.microsoft.com und suchen Sie oder erhalten Sie Delphi 5 für die Hilfedatei zu!
TWebBrowser ist eine sehr einfache Komponente, mit zu arbeiten. Etwa die Hälfte der Eigenschaften kann ignoriert werden, wie für die sichtbare IE-Schnittstelle zu steuern, das auf dem Bildschirm Aussehen des IE-wie Symbolleisten oder im Vollbildmodus anzeigen. Die Visible-Eigenschaft bestimmt, ob wir das Browserfenster oder nicht sehen können. In der endgültigen Anwendung der Benutzer sehen es nie, aber es kann nützlich für das Debuggen.
Die einfachste Art der Verwendung der WebBrowser wird durch Aufrufen der Navigate(URL)-Methode, dann das OnNavigateComplete2-Ereignis behandeln und verwenden die Document-Eigenschaft auf die heruntergeladene Seite zugreifen. Zwar gibt es zwei weitere Veranstaltungen-OnDocumentComplete und OnDownloadComplete-das sollte helfen, festzustellen, ob eine Webseite erfolgreich heruntergeladen wurde, ich fand es einfacher, alles aus dem OnNavigateComplete2 zu verarbeiten. Diese einzige Trigger, wenn der Browser erfolgreich an die angegebene URL verschoben hat; Allerdings ist es durch mehrere Frames verwechselt, so hat einige besondere Vorsicht getroffen werden, wie Sie sehen werden.
WebBrowser bietet Ihnen mehrere Eigenschaften, die die Extraktion der Daten vereinfachen. Diese Eigenschaften umfassen Links, Anker, Applets, Formen, Bilder, Stylesheets und ein paar mehr. Das einzige Problem, insbesondere wenn Frames verwendet werden, ist die Spreu vom Weizen-was sortieren Verknüpfungen gültig sind, und die möglicherweise anzeigen oder anderen Dienstleistungen? In diesem Fall ist der einzige Weg, es zu tun, den HTML-Code zu scannen und relevante Informationen zu extrahieren. Wie jede Seite heruntergeladen wird, kann es direkt zugegriffen werden.
Bilder

Wie Ihr wisst vielleicht, indizieren nicht viele Suchmaschinen Bilder. Ein HTML-Dokument kann von einem oder mehreren Bildern bestehen. Welcher Frame das Zeug hält, was, das Sie wollen? Es ist normalerweise der erste (und oft einzige) Seite. Die einzig zuverlässige Möglichkeit ist zu Fuß durch die einzelnen Seiten auf der Suche nach Text und dann suchen dies für Zeichenfolgen, die Ergebnisse zu identifizieren. Ein viel größeres Problem ist, das mehrere Auslösen der verschiedenen DocumentComplete DocumentComplete und NavigationComplete Ereignisse. Viel Debuggen, Fluchen und Haarentfernung aufgetreten ist, bevor ich merkte, was geschah. Ignorieren Sie DocumentComplete. Verwenden Sie stattdessen entweder DocumentComplete oder NavigationComplete. Ich habe einige weitere Versuche und fand, dass der beste Weg zu benützen und prüfen, ob ein Dokument mit VarIsEmpty(fwebbrowser.document) bereit war. Dann erhalten Sie den Frame aus dem Browser Dokument: = fWebBrowser.Document, die Anzahl der Frames und Index durch sie. Frame 0 verwendet die script.top, während andere Frames Frames verwenden. Item(Index). Beachten Sie die grundlegende Art Arrayindizierung. Aus dem Rahmen der document.body zu überprüfen, und den eigentlichen Text daraus zu extrahieren. Beachten Sie, dass die CreateTextRange einer Ausnahme anrichtet, wenn kein, wie in einem Banner Objekt-daher Text die Try-außer zu fangen. An dieser Stelle haben wir den kompletten HTML-Code, und alles, was wir als nächstes zu tun ist, die Ergebnisse und die Navigationslinks von ihm bekommen.
HTML-Scannen
Als ich dies ein Test war, habe ich die Word-Optionen auf AltaVista. Die Seite, die zurückgegeben wurde enthalten 85 Verbindungen entsprechend den WebBrowser-Links (document.links.Items(Index)-Eigenschaft wird verwendet). Von diesen nur 10 Ergebnisse und eine Reihe von anzeigen, Bannern und Sachen wie die sowie die Navigationslinks. Das Layout unterscheidet sich für jede Suchmaschine Ergebnis und Bewertungsobjekt HTML wäre eine gute Idee für einen zukünftigen Artikel machen. Ich habe mit AltaVista, stecken, wie andere Suchmaschinen Dinge auf ihre eigene Weise Layout. Halten Sie den Code kurz, ich habe zwei Text-Zeichenfolgen-'AltaVista gefunden' und 'Seiten'-die Start und Stop des Ergebnis-Sprünge zu markieren. Alle URLs (suchen Sie nach 'Href ='), die zwischen diesen zwei Zeichenfolgen auftreten und enthält nicht den Text definiert ignorieren Text (wie 'jump.altavista') benutzt werden.
Programmstruktur
Alles konzentriert sich auf drei Komponenten: TSearchEngine, TFetchResult und TResultHandler. Eine Liste der TSearchEngines wird beim Programmstart mit jedem Objekt, das Informationen erforderlich, um diese Engine und eine Instanz des WebBrowser-Objekts verwenden konstruiert. Die Suchzeichenfolge an diese Liste und jede Komponente übergeben wird, dann beginnt eine Abfrage mit einer eigenen Engine. Ergebnis Verbindungen werden an eine zentrale Liste zurückgegeben, während man vorsichtig, um die Serialisierung des Zugriffs auf diese Liste durch eine einfache Wache-Variable (Fbusy), zwei Liste Ergänzungen zur gleichen Zeit auftreten zu verhindern. Gäbe es nur eine Operation durchgeführt, dies könnte vermieden werden, aber ich habe eine Liste Suche auch und dies braucht Zeit, sodass die Wache-Variable verwendet werden muss.
Für eine typische Suchmaschinen wie AltaVista, wird die Abfrage verarbeitet durch ein Cgi-bin Skript namens Abfrage mit verschiedenen Parametern hinzugefügt etwas davon für die Suche Zeichenfolge 'Suchtext' (Anführungszeichen eingeschlossen): Pg = Q & kl = de & Q = % 22search Text % 22 & Stq = 20, wofür ich Verständnis habe als Pg = Q (es ist eine Abfrage), kl = En (Sprache ist Englisch) und Stq = 20 (Ergebnisse beginnen mit dem 20. Ergebnis).
Die Klasse TSearchEngine hat Methoden PostQuestion, ExtractResultLinks und NavigateNextResultPage und legt die WebBrowser-Ereignishandler entsprechend zu handeln. Die meiste Zeit der Anwendung verbringt Nichtstun mehr als warten auf den WebBrowser-Ereignisse auslösen. Ich habe einen einfachen Mechanismus enthalten, so dass Benutzer dieser Klasse bestimmen können, was geschieht, und es in der Lage ist, um zu verfolgen was es tun soll.
Für jeden Treffer-Link gefunden ist eine TFetchResult-Komponente erstellt und hinzugefügt, um eine Liste der Abrufe. Jede Instanz dieser Klasse hat einen eigenen WebBrowser Komponente und Event Handlercode. Ich habe eine Liste um verfolgen alle Abrufe zu vereinfachen. Ich benutze ein Zeitlimit (Standard 240 Sekunden), und alle 30 Sekunden die gesamte Liste der Abrufe gescannt und geprüft für Timeouts. Ein global Timer ist leichter auf Windows-Ressourcen als ein Timer für jedes Objekt. Wie es auch schwierig ist, genau zu bestimmen, wann eine Seite vollständig heruntergeladen wurde, bietet dieses Timeout einen aufgeräumter Weg es zu tun.
Wenn ein Abruf erfolgreich ist, sind die HTML-Inhalt des Dokuments heraus eine Ergebnisordner gespeichert. Ich habe nicht die Grafiken enthalten, um den Code kürzer zu halten. Der Dateiname wird von der Framename abgeleitet, nach dem Entfernen der unzulässige Zeichen.
Parallelität
In gewisser Weise ist dies einer Multithreadanwendung mit einer gewissen Parallelität, zwar gibt es keine Threads explizit verwendet. Jeder WebBrowser-Komponente wird verwendet, unabhängig voneinander, eine in jeder TSearchEngine und eine in jeder TFetchResult. Es scheint keine obere Grenze für die Anzahl der parallelen suchen, obwohl die allgemeine Geschwindigkeit selbstverständlich unterliegen die Bandbreite der Internetanbindung.
Wenn Sie ein Produkt schreiben würden, würde Sie wahrscheinlich eine Config-Datei erstellen, mit irgendeiner Weise des Definierens des Abfrageformats für jedes Modul, das damit umgehen kann, sowie die Ergebnis-Links extrahieren. Jede Suchmaschine liefert Ergebnisse in verschiedenen Formaten und möglicherweise auch das Format ändern, wann immer sie mögen.
Es gibt auch die hohe Wahrscheinlichkeit, dass zwei oder mehr Suchbegriffe werden die gleiche URL erzielen. Ich mich um, die durch Durchsuchen der Liste der aktuellen Abrufe. Ich schlage eine andere Liste verwendet werden, wie dies nur aktuelle Abrufe hält. Vor dem Abrufen der Ergebnisse von einem bestimmten URL, erfolgt eine schnelle Suche von dieser Liste, um sicherzustellen, dass die URL bereits abgerufen wurde noch nicht. Wenn es nicht hat, ist die URL zur Liste hinzugefügt und der Abruf wird fortgesetzt.
Wie immer bei Suchmaschinen müssen Sie Ihr Suchtext mehrere Millionen Ergebnisse sorgfältig zu wählen. Ein Grenzwert hartcodierte wie 100 für jede TSearchEngine festgelegt ist.
Ein letzter Punkt: seien Sie vorsichtig mit der Verwendung von Application.ProcessMessages, bei Verwendung der WebBrowser. Ich habe es vermieden werden, außer wo Abrufe werden hinzugefügt, welche Wartezeiten wenn die ResultProcessor besetzt ist. Ich weiß nicht, ob es ist die Art und Weise Ereignisse gesendet werden, aber ich fand, dass eine Bezeichnung festgelegt und Anwendung. ProcessMessages könnte das gleiche Ereignis wieder passieren zwingen. Dies geschah mehr im Debugger, aber wenn man ungewöhnliches Verhalten, kommentieren sie heraus.
Vorbehalt
Ich denke, dieser Code ist etwas rauh und bereit, aber es funktioniert sehr gut. Möglicherweise sind die am wenigsten zufriedenstellende Methoden erkennen, welcher Frame Text hat. Ich fand es schwer zu trainieren, anders als mit Ausnahme abfangen, wenn Sie es im Debugger ausführen erwarten Sie also ein paar Gefangene Ausnahmen. Es ist auch kein sehr poliert Anwendung-es könnte zum Beispiel eine bessere Benutzeroberfläche. Aber es tut, was ich bestimmt-It führt mehrere parallele suchen und downloads zur gleichen Zeit.
Roboter Willkommen nicht
Entstanden ist ein Standard namens Robot Exclusion Standard, welche Websites können Bäume an, die von Spinnen nicht indiziert werden sollte nicht, weil die Seiten ändern sich häufig oder ausführbare Dateien oder nicht-Text-Dateien enthalten sollte.
Ich habe gelesen, dass die neuesten Schätzungen gehen davon aus, dass in Existenz gibt es mehr als 800 Millionen Web-Seiten und die meisten von den Suchmaschinen indexiert sind, weniger als die Hälfte unter ihnen. Die größten Suchmaschinen haben nur Indizes für 150 Millionen Seiten. Also alles, was das 'Rauschen' beschränkt, willkommen ist, und eine Möglichkeit dies zu tun durch diese Norm wird. Vergeben Sie einfach eine Textdatei robots.txt im Stammverzeichnis-z. B. der www.altavista.com/robots.txt-like Folgendes:

Benutzer-Agent: *
Abweisen: cgi-bin

Dies besagt, dass alle Web-Robots in cgi-bin aussehen sollte nicht. Natürlich Ihre Roboter müssen nicht beachten dieser-It ist vor allem für Web-Spider, bedeutete aber es ist schlechte Manieren zu ignorieren und es macht Sinn, zusammen mit ihm zu gehen, es sei denn, Sie wirklich brauchen, um zu sehen, was da ist.
Wie, wissen Sie Fragen sich vielleicht, Website Menschen wann ein Roboter, die sie besucht hat? Ganz einfach-es ist der UserAgent-Name im Header an den Web-Server übergeben. Dies ist am häufigsten Mozilla, aber es könnte sein Scooter (AltaVista-Spinne) oder andere. Mozilla (für 'Mosaik-Killer') war der Arbeitstitel für Netscape und IE hat es auch. Es wäre möglich, dies in der fünfte Parameter der TWebBrowser Navigate-Methode zu ändern, die zusätzliche Header enthält. Oder Sie konnten Ihre eigene HTTP-Schnittstelle statt mit IE zu schreiben, und geben Sie dann einen Namen. Da tun wir sehr beliebt bei den Suchmaschinen möglicherweise nicht, ist es wahrscheinlich am besten hinter der Anonymität eines Mozilla-Browsers zu tun! Darüber hinaus sollten Sie eine 10-Sekunden-Verzögerung zwischen springen Seiten hinzufügen. Auf diese Weise wird es zumindest aussehen, als ob es einem menschlichen Operator und kein Programm ist.









Schreiben einen Web-Roboter in delphi


Schreiben einen Web-Roboter in delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


In diesem Artikel veranschaulicht David Bolton einen einfachen Web-Roboter erstellen, der das mehrere parallele Suchvorgänge auf eine Suchmaschine und jede Website in den Ergebnissen besucht und downloads dieser Seite.
In diesem Artikel veranschaulicht David Bolton einen einfachen Web-Roboter erstellen, der mehrere parallele Suchvorgänge auf einer Suchmaschine führt dann jeder Website in den Ergebnissen besucht und downloads dieser Seite. Es verwendet die ActiveX-Komponenten von Internet Explorer 4 oder 5.
Vorbehalt-wie ursprünglich geschriebenen Code mit Altavista funktionieren würde, aber das hat wahrscheinlich geändert, ein Dutzend Mal dies so wahrscheinlich, als Ihre Chance, Bicyling, Mt. Everest zu arbeiten! Copernicus (als www.copernic.com) ist ein genial (und kostenlos) Suche Motor Sucher und sie Upgrades für bestimmte Motoren regelmäßig ausstellen. Wenn Sie ein Schreiben, mit Copernicus spielen möchten. Ich bewerte es 11 von 10. (Nein ich habe keine Finanicial oder sonst Verbindung zu ihnen-ich bin nur ein sehr sehr zufriedener Kunde).
Obwohl es exotisch klingt, ist ein Bot (auch bekannt als eine Spinne, intelligent Agent Web Robot, Crawler, Roboter und So weiter) einfach ein Programm, das eine Reihe von Web-Sites besucht. Die bekanntesten Bots sind natürlich die Spinnen, die von verschiedenen Suchmaschinen zu den Katalog neu eingesetzt. Werfen Sie einen Blick auf das Web und finden Sie viele Hinweise und Informationen. Es gibt sogar ein Buch zu diesem Thema, veröffentlicht von Microsoft Press: Programmieren von Bots, Spinnen und intelligente Agenten in Visual C++ von David Pallmann (ISBN 0-7356-0565-3). Es lohnt sich immer, wenn Sie schriftlich von Bots interessiert sind und die keine waten durch C++-Code.
Wenn Sie einen Bot erstellen, sollten Sie sich bewusst sein, dass Material Ihr Bot sammelt von Websites, die sie besucht, können gut damit urheberrechtlich geschützt werden darauf achten, wie Sie es verwenden. Eine andere Sache zu beachten ist dies: Wenn Ihr Bot wiederholt eine Website besucht, könnte es der Website-Besitzer, stören, besonders wenn sie bezahlten Werbung tragen. Für eine ähnliche Reaktion nur erwähnen Sie Video-Recorder, die Anzeigen automatisch zu überspringen oder Tivo Werbung Menschen. Natürlich, wenn Ihr Bot eine bestimmte Website hammer und ruft bemerkt, könnten Sie feststellen, dass Ihre IP-Adresse Zugriff auf diese Site (die gefürchtete 403!) nicht mehr möglich ist. In diesem Fall ist ein Dialup-Konto, wo der ISP Ihnen eine dynamische IP-Adresse gibt, wahrscheinlich eine viel bessere Idee. Ich werde den Robot Exclusion Standard später in Bezug auf dies erläutern.
Das Hauptproblem mit rollenden eigene Bot ist nicht es ist, wie schnell ist Ihre Internet-Verbindung dem Code schreiben. Für ernsthafte Krabbeln, benötigen Sie eine dauerhafte Verbindung, keine Einwahl!
Programmierbare durchsuchen
Microsoft hat Leben viel einfacher gemacht Surfen Objekte in Internet Explorer (IE) ab Version 4 für Bot Schöpfer (und Schöpfer des Virus, Trojaner Autoren!) ihre übliche Praxis, einschließlich ein paar ActiveX. Eigentlich ist dieser Ansatz wiederverwendbare 'Motor' zu bewundern, wenn nur es war nicht so sehr missbraucht! Wenn Sie diese benutzen, kümmern sie 99 Prozent der schwierige Sachen wie Internetzugang, Firewalls und an den Seiten HTML download per HTTP. IE hat viel Funktionalität erbaut, und vieles davon ist zugänglich. IE 3 hatte einige Objekte in ihm, aber ich bin mir nicht sicher, ob dies in gleicher Weise verwendbar sind.
Wenn Sie ein glühender IE-Hasser sind, nehmen Sie Herz! Sie müssen nicht Ihre Prinzipien verraten oder überspringen Sie in diesem Artikel. Wenn Sie IE Objekte verwenden, sehen Sie eigentlich nie IE-es ist voll in Windows integriert.
WebBrowser ist der Name des ActiveX-Objekts von IE. Mit Delphi 3 Wenn Sie IE auf Ihrem PC installiert haben, müssen Sie den Typ Bibliothek Einheit-gehe zu Import-ActiveX-Steuerelemente in Delphi, wählen Sie Microsoft Internet Controls erstellen und installieren klicken. Sie sollten jetzt sehen, TWebBrowser_V1, TWebBrowser und TShellFolderViewOC auf der Registerkarte ActiveX-Komponente-Palette auf. Wir werden TWebBrowser verwendet. Delphi 4 stellt ein Problem dar, die aufgrund von Änderungen im Umgang mit ActiveX zwischen Delphi-Versionen 3 und 4. Ein Programm, das unter Delphi 3 lief generiert eine EOLESysError unter Delphi 4: 'CoInitialize nicht genannt.' Die Typbibliothek Pascal-Quellcode für das Steuerelement ist jetzt doppelt so groß wie in Delphi 5, als es in Delphi 3 war. Haben Sie Delphi 4, empfehlen Ihnen entweder Upgrade auf Delphi 5 ich oder jemanden finden, der es hat und sehen, ob die Delphi 5-shdocvw.pas für Sie arbeitet. Alle IE-Objekt Funktionen in der Datei 'Shdocvw.dll' enthalten ist.
Wenn Sie Delphi 5 oder 6 haben, brauchen Sie nicht, dies zu tun. TWebBrowser ersetzt die ältere THTML-Komponente und ist die letzte Komponente auf der Registerkarte Internet. Erhalten Sie auch eine Demo mit diesem in den Ordner Demos/Coolstuff, und die Hilfe-Datei hat ein paar Sachen auf TWebBrowser, aber merkwürdigerweise hat noch keine Borland die TWebBrowser_V1-Komponente hinzugefügt, auch wenn es in der Quelldatei. Wenn Sie mehr über die Verwendung von TWebBrowser oder TWebBrowser_V1 erfahren möchten, gehen Sie auf www.microsoft.com und suchen Sie oder erhalten Sie Delphi 5 für die Hilfedatei zu!
TWebBrowser ist eine sehr einfache Komponente, mit zu arbeiten. Etwa die Hälfte der Eigenschaften kann ignoriert werden, wie für die sichtbare IE-Schnittstelle zu steuern, das auf dem Bildschirm Aussehen des IE-wie Symbolleisten oder im Vollbildmodus anzeigen. Die Visible-Eigenschaft bestimmt, ob wir das Browserfenster oder nicht sehen können. In der endgültigen Anwendung der Benutzer sehen es nie, aber es kann nützlich für das Debuggen.
Die einfachste Art der Verwendung der WebBrowser wird durch Aufrufen der Navigate(URL)-Methode, dann das OnNavigateComplete2-Ereignis behandeln und verwenden die Document-Eigenschaft auf die heruntergeladene Seite zugreifen. Zwar gibt es zwei weitere Veranstaltungen-OnDocumentComplete und OnDownloadComplete-das sollte helfen, festzustellen, ob eine Webseite erfolgreich heruntergeladen wurde, ich fand es einfacher, alles aus dem OnNavigateComplete2 zu verarbeiten. Diese einzige Trigger, wenn der Browser erfolgreich an die angegebene URL verschoben hat; Allerdings ist es durch mehrere Frames verwechselt, so hat einige besondere Vorsicht getroffen werden, wie Sie sehen werden.
WebBrowser bietet Ihnen mehrere Eigenschaften, die die Extraktion der Daten vereinfachen. Diese Eigenschaften umfassen Links, Anker, Applets, Formen, Bilder, Stylesheets und ein paar mehr. Das einzige Problem, insbesondere wenn Frames verwendet werden, ist die Spreu vom Weizen-was sortieren Verknüpfungen gültig sind, und die möglicherweise anzeigen oder anderen Dienstleistungen? In diesem Fall ist der einzige Weg, es zu tun, den HTML-Code zu scannen und relevante Informationen zu extrahieren. Wie jede Seite heruntergeladen wird, kann es direkt zugegriffen werden.
Bilder

Wie Ihr wisst vielleicht, indizieren nicht viele Suchmaschinen Bilder. Ein HTML-Dokument kann von einem oder mehreren Bildern bestehen. Welcher Frame das Zeug hält, was, das Sie wollen? Es ist normalerweise der erste (und oft einzige) Seite. Die einzig zuverlässige Möglichkeit ist zu Fuß durch die einzelnen Seiten auf der Suche nach Text und dann suchen dies für Zeichenfolgen, die Ergebnisse zu identifizieren. Ein viel größeres Problem ist, das mehrere Auslösen der verschiedenen DocumentComplete DocumentComplete und NavigationComplete Ereignisse. Viel Debuggen, Fluchen und Haarentfernung aufgetreten ist, bevor ich merkte, was geschah. Ignorieren Sie DocumentComplete. Verwenden Sie stattdessen entweder DocumentComplete oder NavigationComplete. Ich habe einige weitere Versuche und fand, dass der beste Weg zu benützen und prüfen, ob ein Dokument mit VarIsEmpty(fwebbrowser.document) bereit war. Dann erhalten Sie den Frame aus dem Browser Dokument: = fWebBrowser.Document, die Anzahl der Frames und Index durch sie. Frame 0 verwendet die script.top, während andere Frames Frames verwenden. Item(Index). Beachten Sie die grundlegende Art Arrayindizierung. Aus dem Rahmen der document.body zu überprüfen, und den eigentlichen Text daraus zu extrahieren. Beachten Sie, dass die CreateTextRange einer Ausnahme anrichtet, wenn kein, wie in einem Banner Objekt-daher Text die Try-außer zu fangen. An dieser Stelle haben wir den kompletten HTML-Code, und alles, was wir als nächstes zu tun ist, die Ergebnisse und die Navigationslinks von ihm bekommen.
HTML-Scannen
Als ich dies ein Test war, habe ich die Word-Optionen auf AltaVista. Die Seite, die zurückgegeben wurde enthalten 85 Verbindungen entsprechend den WebBrowser-Links (document.links.Items(Index)-Eigenschaft wird verwendet). Von diesen nur 10 Ergebnisse und eine Reihe von anzeigen, Bannern und Sachen wie die sowie die Navigationslinks. Das Layout unterscheidet sich für jede Suchmaschine Ergebnis und Bewertungsobjekt HTML wäre eine gute Idee für einen zukünftigen Artikel machen. Ich habe mit AltaVista, stecken, wie andere Suchmaschinen Dinge auf ihre eigene Weise Layout. Halten Sie den Code kurz, ich habe zwei Text-Zeichenfolgen-'AltaVista gefunden' und 'Seiten'-die Start und Stop des Ergebnis-Sprünge zu markieren. Alle URLs (suchen Sie nach 'Href ='), die zwischen diesen zwei Zeichenfolgen auftreten und enthält nicht den Text definiert ignorieren Text (wie 'jump.altavista') benutzt werden.
Programmstruktur
Alles konzentriert sich auf drei Komponenten: TSearchEngine, TFetchResult und TResultHandler. Eine Liste der TSearchEngines wird beim Programmstart mit jedem Objekt, das Informationen erforderlich, um diese Engine und eine Instanz des WebBrowser-Objekts verwenden konstruiert. Die Suchzeichenfolge an diese Liste und jede Komponente übergeben wird, dann beginnt eine Abfrage mit einer eigenen Engine. Ergebnis Verbindungen werden an eine zentrale Liste zurückgegeben, während man vorsichtig, um die Serialisierung des Zugriffs auf diese Liste durch eine einfache Wache-Variable (Fbusy), zwei Liste Ergänzungen zur gleichen Zeit auftreten zu verhindern. Gäbe es nur eine Operation durchgeführt, dies könnte vermieden werden, aber ich habe eine Liste Suche auch und dies braucht Zeit, sodass die Wache-Variable verwendet werden muss.
Für eine typische Suchmaschinen wie AltaVista, wird die Abfrage verarbeitet durch ein Cgi-bin Skript namens Abfrage mit verschiedenen Parametern hinzugefügt etwas davon für die Suche Zeichenfolge 'Suchtext' (Anführungszeichen eingeschlossen): Pg = Q & kl = de & Q = % 22search Text % 22 & Stq = 20, wofür ich Verständnis habe als Pg = Q (es ist eine Abfrage), kl = En (Sprache ist Englisch) und Stq = 20 (Ergebnisse beginnen mit dem 20. Ergebnis).
Die Klasse TSearchEngine hat Methoden PostQuestion, ExtractResultLinks und NavigateNextResultPage und legt die WebBrowser-Ereignishandler entsprechend zu handeln. Die meiste Zeit der Anwendung verbringt Nichtstun mehr als warten auf den WebBrowser-Ereignisse auslösen. Ich habe einen einfachen Mechanismus enthalten, so dass Benutzer dieser Klasse bestimmen können, was geschieht, und es in der Lage ist, um zu verfolgen was es tun soll.
Für jeden Treffer-Link gefunden ist eine TFetchResult-Komponente erstellt und hinzugefügt, um eine Liste der Abrufe. Jede Instanz dieser Klasse hat einen eigenen WebBrowser Komponente und Event Handlercode. Ich habe eine Liste um verfolgen alle Abrufe zu vereinfachen. Ich benutze ein Zeitlimit (Standard 240 Sekunden), und alle 30 Sekunden die gesamte Liste der Abrufe gescannt und geprüft für Timeouts. Ein global Timer ist leichter auf Windows-Ressourcen als ein Timer für jedes Objekt. Wie es auch schwierig ist, genau zu bestimmen, wann eine Seite vollständig heruntergeladen wurde, bietet dieses Timeout einen aufgeräumter Weg es zu tun.
Wenn ein Abruf erfolgreich ist, sind die HTML-Inhalt des Dokuments heraus eine Ergebnisordner gespeichert. Ich habe nicht die Grafiken enthalten, um den Code kürzer zu halten. Der Dateiname wird von der Framename abgeleitet, nach dem Entfernen der unzulässige Zeichen.
Parallelität
In gewisser Weise ist dies einer Multithreadanwendung mit einer gewissen Parallelität, zwar gibt es keine Threads explizit verwendet. Jeder WebBrowser-Komponente wird verwendet, unabhängig voneinander, eine in jeder TSearchEngine und eine in jeder TFetchResult. Es scheint keine obere Grenze für die Anzahl der parallelen suchen, obwohl die allgemeine Geschwindigkeit selbstverständlich unterliegen die Bandbreite der Internetanbindung.
Wenn Sie ein Produkt schreiben würden, würde Sie wahrscheinlich eine Config-Datei erstellen, mit irgendeiner Weise des Definierens des Abfrageformats für jedes Modul, das damit umgehen kann, sowie die Ergebnis-Links extrahieren. Jede Suchmaschine liefert Ergebnisse in verschiedenen Formaten und möglicherweise auch das Format ändern, wann immer sie mögen.
Es gibt auch die hohe Wahrscheinlichkeit, dass zwei oder mehr Suchbegriffe werden die gleiche URL erzielen. Ich mich um, die durch Durchsuchen der Liste der aktuellen Abrufe. Ich schlage eine andere Liste verwendet werden, wie dies nur aktuelle Abrufe hält. Vor dem Abrufen der Ergebnisse von einem bestimmten URL, erfolgt eine schnelle Suche von dieser Liste, um sicherzustellen, dass die URL bereits abgerufen wurde noch nicht. Wenn es nicht hat, ist die URL zur Liste hinzugefügt und der Abruf wird fortgesetzt.
Wie immer bei Suchmaschinen müssen Sie Ihr Suchtext mehrere Millionen Ergebnisse sorgfältig zu wählen. Ein Grenzwert hartcodierte wie 100 für jede TSearchEngine festgelegt ist.
Ein letzter Punkt: seien Sie vorsichtig mit der Verwendung von Application.ProcessMessages, bei Verwendung der WebBrowser. Ich habe es vermieden werden, außer wo Abrufe werden hinzugefügt, welche Wartezeiten wenn die ResultProcessor besetzt ist. Ich weiß nicht, ob es ist die Art und Weise Ereignisse gesendet werden, aber ich fand, dass eine Bezeichnung festgelegt und Anwendung. ProcessMessages könnte das gleiche Ereignis wieder passieren zwingen. Dies geschah mehr im Debugger, aber wenn man ungewöhnliches Verhalten, kommentieren sie heraus.
Vorbehalt
Ich denke, dieser Code ist etwas rauh und bereit, aber es funktioniert sehr gut. Möglicherweise sind die am wenigsten zufriedenstellende Methoden erkennen, welcher Frame Text hat. Ich fand es schwer zu trainieren, anders als mit Ausnahme abfangen, wenn Sie es im Debugger ausführen erwarten Sie also ein paar Gefangene Ausnahmen. Es ist auch kein sehr poliert Anwendung-es könnte zum Beispiel eine bessere Benutzeroberfläche. Aber es tut, was ich bestimmt-It führt mehrere parallele suchen und downloads zur gleichen Zeit.
Roboter Willkommen nicht
Entstanden ist ein Standard namens Robot Exclusion Standard, welche Websites können Bäume an, die von Spinnen nicht indiziert werden sollte nicht, weil die Seiten ändern sich häufig oder ausführbare Dateien oder nicht-Text-Dateien enthalten sollte.
Ich habe gelesen, dass die neuesten Schätzungen gehen davon aus, dass in Existenz gibt es mehr als 800 Millionen Web-Seiten und die meisten von den Suchmaschinen indexiert sind, weniger als die Hälfte unter ihnen. Die größten Suchmaschinen haben nur Indizes für 150 Millionen Seiten. Also alles, was das 'Rauschen' beschränkt, willkommen ist, und eine Möglichkeit dies zu tun durch diese Norm wird. Vergeben Sie einfach eine Textdatei robots.txt im Stammverzeichnis-z. B. der www.altavista.com/robots.txt-like Folgendes:

Benutzer-Agent: *
Abweisen: cgi-bin

Dies besagt, dass alle Web-Robots in cgi-bin aussehen sollte nicht. Natürlich Ihre Roboter müssen nicht beachten dieser-It ist vor allem für Web-Spider, bedeutete aber es ist schlechte Manieren zu ignorieren und es macht Sinn, zusammen mit ihm zu gehen, es sei denn, Sie wirklich brauchen, um zu sehen, was da ist.
Wie, wissen Sie Fragen sich vielleicht, Website Menschen wann ein Roboter, die sie besucht hat? Ganz einfach-es ist der UserAgent-Name im Header an den Web-Server übergeben. Dies ist am häufigsten Mozilla, aber es könnte sein Scooter (AltaVista-Spinne) oder andere. Mozilla (für 'Mosaik-Killer') war der Arbeitstitel für Netscape und IE hat es auch. Es wäre möglich, dies in der fünfte Parameter der TWebBrowser Navigate-Methode zu ändern, die zusätzliche Header enthält. Oder Sie konnten Ihre eigene HTTP-Schnittstelle statt mit IE zu schreiben, und geben Sie dann einen Namen. Da tun wir sehr beliebt bei den Suchmaschinen möglicherweise nicht, ist es wahrscheinlich am besten hinter der Anonymität eines Mozilla-Browsers zu tun! Darüber hinaus sollten Sie eine 10-Sekunden-Verzögerung zwischen springen Seiten hinzufügen. Auf diese Weise wird es zumindest aussehen, als ob es einem menschlichen Operator und kein Programm ist.


Schreiben einen Web-Roboter in delphi

Schreiben einen Web-Roboter in delphi : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Schreiben einen Web-Roboter in delphi
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung