L'écriture d'un web de robot en delphi
Dans cet article, David Bolton montre comment créer un Web simple robot qui n'en parallèle de multiples recherches sur un moteur de recherche et de visites chaque site Web dans les résultats et les téléchargements de la page.
Dans cet article, David Bolton montre comment créer un Web simple robot qui effectue en parallèle de multiples recherches sur un moteur de recherche, puis visite de chaque site Web dans les résultats et les téléchargements de la page. Il utilise les Composants ActiveX fournis par Internet Explorer 4 ou 5.
mise en garde - le code écrit à l'origine serait de travailler avec Altavista, mais ce qui a changé, probablement une douzaine de fois de sorte que son plus susceptibles de travailler en tant que votre chance de bicyling du mont Everest! Copernic (www.copernic.com) est un jeu génial (et gratuite), moteur de recherche moteur de recherche et qu'ils émettent des mises à niveau pour des moteurs spécifiques sur une base régulière. Si vous voulez écrire, jouer avec Copernic. Je l'ai taux de 11 sur 10. (Non je n'ai pas de finanicial ou autrement connexion - je suis un client très satisfait).
Bien que cela sonne exotique, un bot (aussi connu comme une araignée, un agent intelligent, Web robot, robot, robot, etc) est tout simplement un programme qui visite un certain nombre de sites Web. Le plus connu des bots sont, bien sûr, les robots utilisés par les moteurs de recherche différents pour le catalogue de nouveaux contenus. Jetez un oeil sur le Web et vous trouverez beaucoup de références et de détails. Il y a même un livre sur le sujet, publié par Microsoft Press: la Programmation de Robots, des Araignées et des Agents Intelligents dans Visual C , par David Pallmann (ISBN 0-7356-0565-3). Il vaut la peine si vous êtes intéressé par l'écriture de bots et vous n'avez pas l'esprit de patauger dans du code C.
Lorsque vous créez un bot, vous devez être conscient que le matériel de votre bot rassemble à partir de sites qu'il visite peut-être bien protégé-alors, soyez prudent lorsque vous l'utilisez. Une autre chose à garder à l'esprit est la suivante: Si votre bot visites d'un site Web à plusieurs reprises, il pourrait bouleverser le site Web des propriétaires, en particulier s'ils sont porteurs de la publicité payée. Pour une réaction similaire, il suffit de mentionner les Enregistreurs Vidéo qui, automatiquement, passez des annonces ou de Tivo à la publicité des gens. Bien sûr, si votre bot ne le marteau d'un site Web particulier et se fait remarquer, vous pourriez trouver que votre adresse IP n'est plus autorisé à accéder à ce site (Le redoutable 403!). Dans ce cas, une numérotation compte de l'endroit où le fournisseur vous donne une adresse IP dynamique est probablement une bien meilleure idée. Je vais discuter de l'Exclusion des robots Standard, plus tard, dans le respect de cette.
le problème majeur avec Le roulement de votre propre bot n'est pas de l'écriture du code, c'est la rapidité de votre connexion Internet est. Pour le sérieux de l'analyse, vous avez besoin d'un lien permanent, pas de numérotation!
Programmable de navigation
Microsoft a rendu la vie beaucoup plus facile pour le bot de créateurs (et les créateurs de virus, cheval de troie des auteurs!) par leur pratique habituelle, y compris un couple de ActiveX de navigation des objets dans Internet Explorer (IE) depuis la version 4. En fait, ce réutilisable 'moteur' de l'approche est d'être admiré, si seulement il n'était pas abusé tellement! Si vous les utilisez, ils prennent soin de 99% des choses difficiles tels que accès Internet, pare-feu, et à l'aide de HTTP pour télécharger les pages HTML. IE a beaucoup de fonctionnalités intégrées, et pour beaucoup il est accessible. IE 3 a certains objets, mais je ne suis pas sûr de savoir si elles sont utilisables de la même manière.
Si vous êtes un ardent IE hater, prenez à coeur! Vous n'avez pas à trahir ses principes ou ignorer cet article. Lorsque vous utilisez IE, les objets, vous n'avez jamais réellement voir IE-c'est entièrement intégré à Windows.
WebBrowser est le nom de l'objet ActiveX à partir d'IE. Avec Delphi 3, si vous avez internet explorer installée sur votre PC, vous devez créer la bibliothèque de type unit-aller à l'Importation des Contrôles ActiveX dans Delphi, sélectionnez Microsoft Internet Controls, et cliquez sur installer. Vous devriez maintenant voir TWebBrowser_V1, TWebBrowser, et TShellFolderViewOC sur l'onglet ActiveX sur la palette de composants. Nous allons utiliser TWebBrowser. Delphi 4 présente un problème en raison de changements dans le traitement des ActiveX entre Delphes versions 3 et 4. Un programme qui fonctionnait bien sous Delphi 3 génère un EOLESysError sous Delphi 4: 'CoInitialize pas Appelé.' La bibliothèque de type Pascal source pour le contrôle est maintenant deux fois la taille de Delphi 5 qu'il était en Delphi 3. Si vous avez Delphi 4, je vous suggère soit de mise à niveau de Delphi 5 ou de trouver quelqu'un qui l'a et voir si le Delphi 5 shdocvw.pas fonctionne pour vous. Tous les IE fonctionnalités de l'objet est contenu dans le shdocvw.dll.
Si vous avez Delphi 5 ou 6, vous n'avez pas besoin de le faire. TWebBrowser a remplacé l'ancienne THTML composant et est la dernière composante sur l'Onglet Internet. Vous obtenez également une démonstration de l'utilisation de ce dans le dossier Demos/Coolstuff, et le fichier d'Aide a certains trucs sur TWebBrowser, mais curieusement, Borland n'a pas ajouté la TWebBrowser_V1 composant, même si c'est dans le fichier source. Si vous voulez en savoir plus sur l'utilisation de TWebBrowser ou TWebBrowser_V1, aller à www.microsoft.com et faire une recherche, ou d'obtenir de Delphi 5 pour le fichier d'Aide!
TWebBrowser qui est un très facile composant de travailler avec. Environ la moitié des propriétés peuvent être ignorés car ils sont pour le visible IE interface de contrôle de l'écran en regard de l'IE-comme les barres d'outils ou de les afficher en plein écran. La propriété Visible détermine si nous pouvons voir que la fenêtre du navigateur ou pas. Dans l'application finale, l'utilisateur ne sera jamais la voir, mais elle peut être utile pour le débogage.
la façon La plus simple de l'utilisation de WebBrowser est par l'appel de la Navigation(URL) de la méthode, puis la manipulation de la OnNavigateComplete2 de l'événement et à l'aide de la propriété de Document pour accéder à la page téléchargé. Bien qu'il existe deux autres événements-OnDocumentComplete et OnDownloadComplete-qui devrait l'aider à déterminer si une page Web a été téléchargé avec succès, je l'ai trouvé plus facile de traiter de tout, de la OnNavigateComplete2. Cela déclenche uniquement lorsque le navigateur a déplacé avec succès à l'URL spécifiée cependant, il est confondu par plusieurs images, de sorte que certaines des précautions supplémentaires doivent être prises, comme vous allez le voir.
WebBrowser vous offre plusieurs propriétés qui simplifient la tâche d'extraction des données. Ces propriétés comprennent des Liens, des ancres, des applets, des formes, des images, feuilles de style, et un peu plus. Le seul problème, en particulier lorsque les cadres sont utilisées, est de trier l'ivraie du blé-qui les liens sont valides, et qui pourraient être des publicités ou d'autres services? Dans ce cas, la seule façon de le faire est de scanner le code HTML et d'en extraire les informations pertinentes. Chaque page est téléchargé, il peut être accessible directement.
Images
Comme vous le savez peut-être, de nombreux moteurs de recherche n'indexe pas les cadres. Un document HTML peut être constitué d'une ou plusieurs images. L'image qui détient les choses que vous voulez? Il est généralement le premier (et souvent la seule) de la page. Le seul moyen fiable est de marcher à travers chaque page à la recherche pour le texte et la recherche ce pour les chaînes de caractères qui permettent d'identifier les résultats. Un plus grand problème est le multiple de déclenchement des différents DocumentComplete, DownloadComplete, et NavigationComplete événements. Beaucoup de débogage, la malédiction, et l'épilation s'est produite avant que je ne réalise ce qui se passait. Ignorer DownloadComplete. Au lieu de cela, utiliser DocumentComplete ou NavigationComplete. J'ai fait quelques expériences plus et a constaté que le meilleur moyen est d'utiliser une seule et vérifier si un document était prêt VarIsEmpty(fwebbrowser.document). Puis obtenir l'image à partir de l'explorateur de Document := fWebBrowser.Document, le nombre de cadres, et de l'index à travers eux. 0 utilise le script.dessus, tandis que d'autres cadres de l'utilisation des cadres.Item(index). Remarque le type de Base tableau d'indexation. À partir de l'image, vérifier le document.corps, et d'en extraire le texte à partir de ce. Sachez que le CreateTextRange provoquera une exception si il n'y a pas de texte, comme dans une bannière de l'objet d'où l'essai, à l'exception de l'attraper. À ce stade, nous avons le code HTML complète, et tout ce que nous faisons suivante est d'obtenir les résultats et les liens de navigation.
la numérisation HTML
Quand j'ai été le tester cela, j'ai utilisé les Options de word sur AltaVista. La page qui a été retourné contenues 85 des liens en fonction de la WebBrowser liens (document.liens.Les éléments(Index) de la propriété est utilisée). De ces, à seulement 10 sont des résultats et un certain nombre sont des annonces, des bannières, et des trucs comme ça, ainsi que les liens de Navigation. La mise en page est différente pour chacun des résultats du moteur de recherche, et une analyse HTML de l'objet ferait une bonne idée pour un futur article. J'ai coincé avec AltaVista, comme d'autres moteurs de recherche de jeter les choses à leur façon. Pour avoir un code court, j'ai utilisé deux chaînes de texte-'AltaVista trouvé' et 'les Pages de résultats'-pour marquer le début et la fin de la suite de sauts. Toutes les Url (cherchez 'href=') qui se produisent entre ces deux chaînes et ne contiennent pas le texte défini dans l'ignorer texte (comme 'sauter.altavista') sont utilisés.
la structure du Programme
Tout les centres sur trois composantes: TSearchEngine, TFetchResult, et TResultHandler. Une liste de TSearchEngines est construit au début du programme à chaque objet la tenue de détails nécessaires à l'utilisation de ce moteur et une instance de l'objet WebBrowser. La chaîne de recherche est passé à cette liste, et chaque élément commence alors une requête avec son propre moteur. Résultat des liens sont renvoyés à une liste centrale, tout en étant prudent de sérialiser l'accès à cette liste par le biais d'un simple garde variable (fbusy) pour empêcher les deux liste des ajouts de se produire en même temps. Si il y avait une seule opération se fait, ce pourrait être évité, mais j'ai une liste de recherche ainsi et cela prend du temps, de sorte que la garde de la variable doit être utilisé.
Pour un type de moteur de recherche comme AltaVista, la requête est traitée par un cgi-bin script appelé requête avec des paramètres différents ajouté quelque chose comme ça pour la chaîne de recherche 'recherche de texte' (guillemets compris): pg=q & kl=fr & q='recherche de texte' & la stq=20, je comprends que pg = q (c'est une requête), kl = fr (en Langue anglaise), et de la stq=20 (résultats début du 20ème résultat).
La classe TSearchEngine a des méthodes PostQuestion, ExtractResultLinks, et NavigateNextResultPage et définit le WebBrowser des gestionnaires d'événements pour agir en conséquence. La plupart de la demande de son temps à ne rien faire de plus que d'attendre que le WebBrowser des événements pour déclencher. J'ai inclus un état simple mécanisme de sorte que les utilisateurs de cette classe peut déterminer ce qui se passe, et il est capable de garder une trace de ce qu'il est censé faire.
Pour chaque lien résultats trouvés, un TFetchResult composant est créé et ajouté à une liste d'extractions. Chaque instance de cette classe dispose de son propre composant WebBrowser et code de gestionnaire d'événements. J'ai utilisé une liste de simplifier le suivi de toutes les extractions. Je utiliser un délai d'attente (par défaut 240 secondes), et toutes les 30 secondes, la totalité de la liste de l'extrait est analysé et vérifié pour les délais d'attente. Un temps est plus léger sur les ressources de Windows que d'une minuterie pour chaque objet. Comme il est également difficile de déterminer exactement quand une page a été entièrement téléchargé, ce délai fournit un plus propre façon de faire.
Si une extraction réussit, le contenu HTML du document sont enregistrées dans un dossier des résultats. Je n'ai pas inclus les graphiques afin de conserver le code plus court. Le nom est dérivé du nom du cadre après la suppression inacceptable caractères.
Parallélisme
Dans un sens, c'est une application multithread avec un bon degré de parallélisme, bien qu'il n'existe pas de threads utilisés de manière explicite. Chacun des WebBrowser composants est utilisé de manière indépendante, un dans chaque TSearchEngine et un dans chaque TFetchResult. Il semble y avoir pas de limite supérieure pour le nombre de recherches parallèles, bien que la vitesse globale est évidemment sujette à la bande passante de la liaison Internet.
Si vous écriviez un produit de vente au détail, vous auriez probablement créer un fichier de configuration avec une certaine façon de définir le format de la requête pour chaque moteur, il peut gérer ainsi que l'extraction de la suite des liens. Chaque moteur de recherche produit des résultats dans différents formats et pourrait bien changer le format de chaque fois que qu'ils aiment.
Il y a aussi la forte probabilité que deux ou plus de recherches donnera la même URL. Je me déplace que par la recherche de la liste des extractions. Je suggère une autre liste, car cela ne tient courant extrait. Avant d'aller chercher les résultats à partir d'une URL particulière, une recherche rapide est fait de cette liste pour vous assurer que l'URL n'a pas déjà été récupérées. Si ce n'est pas le cas, l'URL est ajoutée à la liste et de le récupérer le produit.
Comme toujours avec les moteurs de recherche, vous devez choisir le texte à rechercher avec soin pour éviter les multi-millions de résultats. Une valeur limite codée en dur comme 100 est défini pour chaque TSearchEngine.
Un dernier point: Être prudent avec l'utilisation de l'Application.ProcessMessages lorsque vous utilisez le Navigateur internet. J'ai évité, sauf lorsque les extractions sont ajoutés, ce qui les attend si le resultProcessor est occupé. Je ne sais pas si c'est la façon dont les événements sont envoyés, mais j'ai trouvé que la fixation d'une étiquette et de l'application appelante.ProcessMessages pourrait forcer le même événement à se produire à nouveau. C'est encore plus dans le débogueur, mais si vous obtenez un comportement étrange, de les commenter.
Avertissement
je pense que ce code est un peu rude, mais il fonctionne très bien. Probablement la moins satisfaisante méthodes de détection de l'image qui a du texte. Je l'ai trouvé dur à travailler, d'autres que par l'aide de l'interception d'exception, donc, si vous exécutez dans le débogueur, s'attendre à un peu pris au piège des exceptions. Il n'est également pas très poli de l'application-il pourrait y avoir une meilleure interface utilisateur, par exemple. Mais ça fait ce que je désirais-il effectue plusieurs recherches parallèles et les téléchargements en même temps.
Robots de ne pas les bienvenus
standard a émergé appelé l'Exclusion des robots Standard, les sites Web qui devraient l'utiliser pour spécifier les arbres qui ne devrait pas être indexé par les araignées parce que les pages changent fréquemment ou qui contiennent des fichiers exécutables ou non des fichiers de texte.
j'ai lu que les dernières estimations suggèrent qu'il existe plus de 800 millions de pages Web dans l'existence, et que la plupart des moteurs de recherche indexent le moins de la moitié de la totalité d'entre eux. Les plus grands moteurs de recherche seulement des indices de 150 à 200 millions de pages. Donc tout ce qui limite le 'bruit' est la bienvenue, et une façon de le faire est par le biais de cette norme. Il suffit de placer un robots.txt fichier texte à la racine-par exemple, www.altavista.com/robots.txt-like suivantes:
User-agent: *
Disallow: /cgi-bin
celle-ci stipule que tous les robots Web ne doit pas regarder dans /cgi-bin. Bien sûr, vos robots n'ont pas à tenir compte de ce-qu'il est destiné principalement pour les araignées, mais c'est de mauvaises manières de l'ignorer, et il est logique d'aller avec elle, sauf si vous avez vraiment besoin de voir ce qui est là.
Comment, vous demandez peut-être, faire le site Web de gens savent quand un robot a visité? Tout simplement-c'est la Véritable nom dans l'en-tête envoyée au serveur Web. C'est le plus souvent de Mozilla, mais il pourrait être Scooter (AltaVista araignée) ou autres. Mozilla (pour 'Mosaïque Killer') était le nom de Netscape et IE a adopté également. Il pourrait être possible de modifier cela dans le cinquième paramètre de la TWebBrowser méthode de navigation, qui contient des en-têtes supplémentaires. Ou vous pouvez écrire votre propre interface HTTP au lieu d'utiliser IE, puis spécifiez un nom. Étant donné que ce que nous faisons peut-être pas très populaire auprès des moteurs de recherche, il est probablement préférable de le faire derrière l'anonymat d'un navigateur de Mozilla! En outre, vous voudrez peut-être ajouter un délai de 10 secondes entre le saut de pages. De cette façon, il aura au moins regarder comme si c'est un opérateur humain et non pas un programme.
L'ecriture d'un web de robot en delphi
L'ecriture d'un web de robot en delphi : Plusieurs milliers de conseils pour vous faciliter la vie.
Dans cet article, David Bolton montre comment creer un Web simple robot qui n'en parallele de multiples recherches sur un moteur de recherche et de visites chaque site Web dans les resultats et les telechargements de la page.
Dans cet article, David Bolton montre comment creer un Web simple robot qui effectue en parallele de multiples recherches sur un moteur de recherche, puis visite de chaque site Web dans les resultats et les telechargements de la page. Il utilise les Composants ActiveX fournis par Internet Explorer 4 ou 5.
mise en garde - le code ecrit a l'origine serait de travailler avec Altavista, mais ce qui a change, probablement une douzaine de fois de sorte que son plus susceptibles de travailler en tant que votre chance de bicyling du mont Everest! Copernic (www.copernic.com) est un jeu genial (et gratuite), moteur de recherche moteur de recherche et qu'ils emettent des mises a niveau pour des moteurs specifiques sur une base reguliere. Si vous voulez ecrire, jouer avec Copernic. Je l'ai taux de 11 sur 10. (Non je n'ai pas de finanicial ou autrement connexion - je suis un client tres satisfait).
Bien que cela sonne exotique, un bot (aussi connu comme une araignee, un agent intelligent, Web robot, robot, robot, etc) est tout simplement un programme qui visite un certain nombre de sites Web. Le plus connu des bots sont, bien sûr, les robots utilises par les moteurs de recherche differents pour le catalogue de nouveaux contenus. Jetez un oeil sur le Web et vous trouverez beaucoup de references et de details. Il y a meme un livre sur le sujet, publie par Microsoft Press: la Programmation de Robots, des Araignees et des Agents Intelligents dans Visual C , par David Pallmann (ISBN 0-7356-0565-3). Il vaut la peine si vous etes interesse par l'ecriture de bots et vous n'avez pas l'esprit de patauger dans du code C.
Lorsque vous creez un bot, vous devez etre conscient que le materiel de votre bot rassemble a partir de sites qu'il visite peut-etre bien protege-alors, soyez prudent lorsque vous l'utilisez. Une autre chose a garder a l'esprit est la suivante: Si votre bot visites d'un site Web a plusieurs reprises, il pourrait bouleverser le site Web des proprietaires, en particulier s'ils sont porteurs de la publicite payee. Pour une reaction similaire, il suffit de mentionner les Enregistreurs Video qui, automatiquement, passez des annonces ou de Tivo a la publicite des gens. Bien sûr, si votre bot ne le marteau d'un site Web particulier et se fait remarquer, vous pourriez trouver que votre adresse IP n'est plus autorise a acceder a ce site (Le redoutable 403!). Dans ce cas, une numerotation compte de l'endroit ou le fournisseur vous donne une adresse IP dynamique est probablement une bien meilleure idee. Je vais discuter de l'Exclusion des robots Standard, plus tard, dans le respect de cette.
le probleme majeur avec Le roulement de votre propre bot n'est pas de l'ecriture du code, c'est la rapidite de votre connexion Internet est. Pour le serieux de l'analyse, vous avez besoin d'un lien permanent, pas de numerotation!
Programmable de navigation
Microsoft a rendu la vie beaucoup plus facile pour le bot de createurs (et les createurs de virus, cheval de troie des auteurs!) par leur pratique habituelle, y compris un couple de ActiveX de navigation des objets dans Internet Explorer (IE) depuis la version 4. En fait, ce reutilisable 'moteur' de l'approche est d'etre admire, si seulement il n'etait pas abuse tellement! Si vous les utilisez, ils prennent soin de 99% des choses difficiles tels que acces Internet, pare-feu, et a l'aide de HTTP pour telecharger les pages HTML. IE a beaucoup de fonctionnalites integrees, et pour beaucoup il est accessible. IE 3 a certains objets, mais je ne suis pas sûr de savoir si elles sont utilisables de la meme maniere.
Si vous etes un ardent IE hater, prenez a coeur! Vous n'avez pas a trahir ses principes ou ignorer cet article. Lorsque vous utilisez IE, les objets, vous n'avez jamais reellement voir IE-c'est entierement integre a Windows.
WebBrowser est le nom de l'objet ActiveX a partir d'IE. Avec Delphi 3, si vous avez internet explorer installee sur votre PC, vous devez creer la bibliotheque de type unit-aller a l'Importation des Controles ActiveX dans Delphi, selectionnez Microsoft Internet Controls, et cliquez sur installer. Vous devriez maintenant voir TWebBrowser_V1, TWebBrowser, et TShellFolderViewOC sur l'onglet ActiveX sur la palette de composants. Nous allons utiliser TWebBrowser. Delphi 4 presente un probleme en raison de changements dans le traitement des ActiveX entre Delphes versions 3 et 4. Un programme qui fonctionnait bien sous Delphi 3 genere un EOLESysError sous Delphi 4: 'CoInitialize pas Appele.' La bibliotheque de type Pascal source pour le controle est maintenant deux fois la taille de Delphi 5 qu'il etait en Delphi 3. Si vous avez Delphi 4, je vous suggere soit de mise a niveau de Delphi 5 ou de trouver quelqu'un qui l'a et voir si le Delphi 5 shdocvw.pas fonctionne pour vous. Tous les IE fonctionnalites de l'objet est contenu dans le shdocvw.dll.
Si vous avez Delphi 5 ou 6, vous n'avez pas besoin de le faire. TWebBrowser a remplace l'ancienne THTML composant et est la derniere composante sur l'Onglet Internet. Vous obtenez egalement une demonstration de l'utilisation de ce dans le dossier Demos/Coolstuff, et le fichier d'Aide a certains trucs sur TWebBrowser, mais curieusement, Borland n'a pas ajoute la TWebBrowser_V1 composant, meme si c'est dans le fichier source. Si vous voulez en savoir plus sur l'utilisation de TWebBrowser ou TWebBrowser_V1, aller a www.microsoft.com et faire une recherche, ou d'obtenir de Delphi 5 pour le fichier d'Aide!
TWebBrowser qui est un tres facile composant de travailler avec. Environ la moitie des proprietes peuvent etre ignores car ils sont pour le visible IE interface de controle de l'ecran en regard de l'IE-comme les barres d'outils ou de les afficher en plein ecran. La propriete Visible determine si nous pouvons voir que la fenetre du navigateur ou pas. Dans l'application finale, l'utilisateur ne sera jamais la voir, mais elle peut etre utile pour le debogage.
la façon La plus simple de l'utilisation de WebBrowser est par l'appel de la Navigation(URL) de la methode, puis la manipulation de la OnNavigateComplete2 de l'evenement et a l'aide de la propriete de Document pour acceder a la page telecharge. Bien qu'il existe deux autres evenements-OnDocumentComplete et OnDownloadComplete-qui devrait l'aider a determiner si une page Web a ete telecharge avec succes, je l'ai trouve plus facile de traiter de tout, de la OnNavigateComplete2. Cela declenche uniquement lorsque le navigateur a deplace avec succes a l'URL specifiee cependant, il est confondu par plusieurs images, de sorte que certaines des precautions supplementaires doivent etre prises, comme vous allez le voir.
WebBrowser vous offre plusieurs proprietes qui simplifient la tache d'extraction des donnees. Ces proprietes comprennent des Liens, des ancres, des applets, des formes, des images, feuilles de style, et un peu plus. Le seul probleme, en particulier lorsque les cadres sont utilisees, est de trier l'ivraie du ble-qui les liens sont valides, et qui pourraient etre des publicites ou d'autres services? Dans ce cas, la seule façon de le faire est de scanner le code HTML et d'en extraire les informations pertinentes. Chaque page est telecharge, il peut etre accessible directement.
Images
Comme vous le savez peut-etre, de nombreux moteurs de recherche n'indexe pas les cadres. Un document HTML peut etre constitue d'une ou plusieurs images. L'image qui detient les choses que vous voulez? Il est generalement le premier (et souvent la seule) de la page. Le seul moyen fiable est de marcher a travers chaque page a la recherche pour le texte et la recherche ce pour les chaînes de caracteres qui permettent d'identifier les resultats. Un plus grand probleme est le multiple de declenchement des differents DocumentComplete, DownloadComplete, et NavigationComplete evenements. Beaucoup de debogage, la malediction, et l'epilation s'est produite avant que je ne realise ce qui se passait. Ignorer DownloadComplete. Au lieu de cela, utiliser DocumentComplete ou NavigationComplete. J'ai fait quelques experiences plus et a constate que le meilleur moyen est d'utiliser une seule et verifier si un document etait pret VarIsEmpty(fwebbrowser.document). Puis obtenir l'image a partir de l'explorateur de Document := fWebBrowser.Document, le nombre de cadres, et de l'index a travers eux. 0 utilise le script.dessus, tandis que d'autres cadres de l'utilisation des cadres.Item(index). Remarque le type de Base tableau d'indexation. A partir de l'image, verifier le document.corps, et d'en extraire le texte a partir de ce. Sachez que le CreateTextRange provoquera une exception si il n'y a pas de texte, comme dans une banniere de l'objet d'ou l'essai, a l'exception de l'attraper. A ce stade, nous avons le code HTML complete, et tout ce que nous faisons suivante est d'obtenir les resultats et les liens de navigation.
la numerisation HTML
Quand j'ai ete le tester cela, j'ai utilise les Options de word sur AltaVista. La page qui a ete retourne contenues 85 des liens en fonction de la WebBrowser liens (document.liens.Les elements(Index) de la propriete est utilisee). De ces, a seulement 10 sont des resultats et un certain nombre sont des annonces, des bannieres, et des trucs comme ça, ainsi que les liens de Navigation. La mise en page est differente pour chacun des resultats du moteur de recherche, et une analyse HTML de l'objet ferait une bonne idee pour un futur article. J'ai coince avec AltaVista, comme d'autres moteurs de recherche de jeter les choses a leur façon. Pour avoir un code court, j'ai utilise deux chaînes de texte-'AltaVista trouve' et 'les Pages de resultats'-pour marquer le debut et la fin de la suite de sauts. Toutes les Url (cherchez 'href=') qui se produisent entre ces deux chaînes et ne contiennent pas le texte defini dans l'ignorer texte (comme 'sauter.altavista') sont utilises.
la structure du Programme
Tout les centres sur trois composantes: TSearchEngine, TFetchResult, et TResultHandler. Une liste de TSearchEngines est construit au debut du programme a chaque objet la tenue de details necessaires a l'utilisation de ce moteur et une instance de l'objet WebBrowser. La chaîne de recherche est passe a cette liste, et chaque element commence alors une requete avec son propre moteur. Resultat des liens sont renvoyes a une liste centrale, tout en etant prudent de serialiser l'acces a cette liste par le biais d'un simple garde variable (fbusy) pour empecher les deux liste des ajouts de se produire en meme temps. Si il y avait une seule operation se fait, ce pourrait etre evite, mais j'ai une liste de recherche ainsi et cela prend du temps, de sorte que la garde de la variable doit etre utilise.
Pour un type de moteur de recherche comme AltaVista, la requete est traitee par un cgi-bin script appele requete avec des parametres differents ajoute quelque chose comme ça pour la chaîne de recherche 'recherche de texte' (guillemets compris): pg=q & kl=fr & q='recherche de texte' & la stq=20, je comprends que pg = q (c'est une requete), kl = fr (en Langue anglaise), et de la stq=20 (resultats debut du 20eme resultat).
La classe TSearchEngine a des methodes PostQuestion, ExtractResultLinks, et NavigateNextResultPage et definit le WebBrowser des gestionnaires d'evenements pour agir en consequence. La plupart de la demande de son temps a ne rien faire de plus que d'attendre que le WebBrowser des evenements pour declencher. J'ai inclus un etat simple mecanisme de sorte que les utilisateurs de cette classe peut determiner ce qui se passe, et il est capable de garder une trace de ce qu'il est cense faire.
Pour chaque lien resultats trouves, un TFetchResult composant est cree et ajoute a une liste d'extractions. Chaque instance de cette classe dispose de son propre composant WebBrowser et code de gestionnaire d'evenements. J'ai utilise une liste de simplifier le suivi de toutes les extractions. Je utiliser un delai d'attente (par defaut 240 secondes), et toutes les 30 secondes, la totalite de la liste de l'extrait est analyse et verifie pour les delais d'attente. Un temps est plus leger sur les ressources de Windows que d'une minuterie pour chaque objet. Comme il est egalement difficile de determiner exactement quand une page a ete entierement telecharge, ce delai fournit un plus propre façon de faire.
Si une extraction reussit, le contenu HTML du document sont enregistrees dans un dossier des resultats. Je n'ai pas inclus les graphiques afin de conserver le code plus court. Le nom est derive du nom du cadre apres la suppression inacceptable caracteres.
Parallelisme
Dans un sens, c'est une application multithread avec un bon degre de parallelisme, bien qu'il n'existe pas de threads utilises de maniere explicite. Chacun des WebBrowser composants est utilise de maniere independante, un dans chaque TSearchEngine et un dans chaque TFetchResult. Il semble y avoir pas de limite superieure pour le nombre de recherches paralleles, bien que la vitesse globale est evidemment sujette a la bande passante de la liaison Internet.
Si vous ecriviez un produit de vente au detail, vous auriez probablement creer un fichier de configuration avec une certaine façon de definir le format de la requete pour chaque moteur, il peut gerer ainsi que l'extraction de la suite des liens. Chaque moteur de recherche produit des resultats dans differents formats et pourrait bien changer le format de chaque fois que qu'ils aiment.
Il y a aussi la forte probabilite que deux ou plus de recherches donnera la meme URL. Je me deplace que par la recherche de la liste des extractions. Je suggere une autre liste, car cela ne tient courant extrait. Avant d'aller chercher les resultats a partir d'une URL particuliere, une recherche rapide est fait de cette liste pour vous assurer que l'URL n'a pas deja ete recuperees. Si ce n'est pas le cas, l'URL est ajoutee a la liste et de le recuperer le produit.
Comme toujours avec les moteurs de recherche, vous devez choisir le texte a rechercher avec soin pour eviter les multi-millions de resultats. Une valeur limite codee en dur comme 100 est defini pour chaque TSearchEngine.
Un dernier point: Etre prudent avec l'utilisation de l'Application.ProcessMessages lorsque vous utilisez le Navigateur internet. J'ai evite, sauf lorsque les extractions sont ajoutes, ce qui les attend si le resultProcessor est occupe. Je ne sais pas si c'est la façon dont les evenements sont envoyes, mais j'ai trouve que la fixation d'une etiquette et de l'application appelante.ProcessMessages pourrait forcer le meme evenement a se produire a nouveau. C'est encore plus dans le debogueur, mais si vous obtenez un comportement etrange, de les commenter.
Avertissement
je pense que ce code est un peu rude, mais il fonctionne tres bien. Probablement la moins satisfaisante methodes de detection de l'image qui a du texte. Je l'ai trouve dur a travailler, d'autres que par l'aide de l'interception d'exception, donc, si vous executez dans le debogueur, s'attendre a un peu pris au piege des exceptions. Il n'est egalement pas tres poli de l'application-il pourrait y avoir une meilleure interface utilisateur, par exemple. Mais ça fait ce que je desirais-il effectue plusieurs recherches paralleles et les telechargements en meme temps.
Robots de ne pas les bienvenus
standard a emerge appele l'Exclusion des robots Standard, les sites Web qui devraient l'utiliser pour specifier les arbres qui ne devrait pas etre indexe par les araignees parce que les pages changent frequemment ou qui contiennent des fichiers executables ou non des fichiers de texte.
j'ai lu que les dernieres estimations suggerent qu'il existe plus de 800 millions de pages Web dans l'existence, et que la plupart des moteurs de recherche indexent le moins de la moitie de la totalite d'entre eux. Les plus grands moteurs de recherche seulement des indices de 150 a 200 millions de pages. Donc tout ce qui limite le 'bruit' est la bienvenue, et une façon de le faire est par le biais de cette norme. Il suffit de placer un robots.txt fichier texte a la racine-par exemple, www.altavista.com/robots.txt-like suivantes:
User-agent: *
Disallow: /cgi-bin
celle-ci stipule que tous les robots Web ne doit pas regarder dans /cgi-bin. Bien sûr, vos robots n'ont pas a tenir compte de ce-qu'il est destine principalement pour les araignees, mais c'est de mauvaises manieres de l'ignorer, et il est logique d'aller avec elle, sauf si vous avez vraiment besoin de voir ce qui est la.
Comment, vous demandez peut-etre, faire le site Web de gens savent quand un robot a visite? Tout simplement-c'est la Veritable nom dans l'en-tete envoyee au serveur Web. C'est le plus souvent de Mozilla, mais il pourrait etre Scooter (AltaVista araignee) ou autres. Mozilla (pour 'Mosaïque Killer') etait le nom de Netscape et IE a adopte egalement. Il pourrait etre possible de modifier cela dans le cinquieme parametre de la TWebBrowser methode de navigation, qui contient des en-tetes supplementaires. Ou vous pouvez ecrire votre propre interface HTTP au lieu d'utiliser IE, puis specifiez un nom. Etant donne que ce que nous faisons peut-etre pas tres populaire aupres des moteurs de recherche, il est probablement preferable de le faire derriere l'anonymat d'un navigateur de Mozilla! En outre, vous voudrez peut-etre ajouter un delai de 10 secondes entre le saut de pages. De cette façon, il aura au moins regarder comme si c'est un operateur humain et non pas un programme.
L'écriture d'un web de robot en delphi
By commentfaire
L'écriture d'un web de robot en delphi : Plusieurs milliers de conseils pour vous faciliter la vie.