Question

La phrase suivante a attiré mon attention dans le manuel de wget

wget --spider --force-html -i bookmarks.html

This feature needs much more work for Wget to get close to the functionality of real web spiders.

Je trouve les lignes de code suivantes pertinentes pour l'option d'araignée dans wget.

src/ftp.c
780:      /* If we're in spider mode, don't really retrieve anything.  The
784:      if (opt.spider)
889:  if (!(cmd & (DO_LIST | DO_RETR)) || (opt.spider && !(cmd & DO_LIST)))
1227:      if (!opt.spider)
1239:      if (!opt.spider)
1268:      else if (!opt.spider)
1827:          if (opt.htmlify && !opt.spider)

src/http.c
64:#include "spider.h"
2405:  /* Skip preliminary HEAD request if we're not in spider mode AND
2407:  if (!opt.spider
2428:      if (opt.spider && !got_head)
2456:      /* Default document type is empty.  However, if spider mode is
2570:           * spider mode.  */
2571:          else if (opt.spider)
2661:              if (opt.spider)

src/res.c
543:  int saved_sp_val = opt.spider;
548:  opt.spider       = false;
551:  opt.spider       = saved_sp_val;  

src/spider.c
1:/* Keep track of visited URLs in spider mode.
37:#include "spider.h"
49:spider_cleanup (void)

src/spider.h
1:/* Declarations for spider.c

src/recur.c
52:#include "spider.h"
279:      if (opt.spider)
366:              || opt.spider /* opt.recursive is implicitely true */
370:             (otherwise unneeded because of --spider or rejected by -R) 
375:                   (opt.spider ? "--spider" : 
378:                     (opt.delete_after || opt.spider
440:      if (opt.spider) 

src/options.h
62:  bool spider;           /* Is Wget in spider mode? */

src/init.c
238:  { "spider",           &opt.spider,            cmd_boolean },

src/main.c
56:#include "spider.h"
238:    { "spider", 0, OPT_BOOLEAN, "spider", -1 },
435:       --spider                  don't download anything.\n"),
1045:  if (opt.recursive && opt.spider)

Je voudrais voir les différences dans le code, et non abstraitement. J'adore les exemples de code.

Comment les araignées Web diffèrent de l'araignée de wget dans le code?

Était-ce utile?

La solution

Une araignée réelle est beaucoup de travail

Ecrire une araignée pour toute WWW est une tâche --- vous devez prendre soin de nombreux « petits détails », comme:

  • Chaque ordinateur araignée doit recevoir des données de quelques milliers de serveurs en parallèle afin d'utiliser efficacement la bande passante de la connexion. (Socket asynchrone i / o).
  • Vous avez besoin de plusieurs ordinateurs qui araignée en parallèle afin de couvrir la grande quantité d'informations sur le WWW (regroupement, le partitionnement du travail)
  • Vous devez être poli avec les sites Web spidered:
    • Respectez les fichiers robots.txt.
    • Ne pas chercher beaucoup d'informations trop rapidement: les serveurs ce surchargent
    • .
    • Ne pas récupérer les fichiers que vous avez vraiment pas besoin. (Par exemple des images de disque iso, tgz packages pour le téléchargement du logiciel ...)
  • Vous devez traiter les cookies / Session ids: De nombreux sites accordent des identifiants de session uniques aux URL pour identifier les sessions client. Chaque fois que vous arrivez sur le site, vous obtenez un nouvel identifiant de session et un nouveau monde virtuel de pages (avec le même contenu). En raison de ces problèmes, les moteurs de recherche début ignorés du contenu dynamique. Les moteurs de recherche modernes ont appris quels sont les problèmes et la façon de traiter avec eux.
  • Vous devez détecter et ignorer les données gênants. Connexions qui fournissent une quantité apparemment infini des données ou des connexions trop lentes pour terminer
  • Outre les liens ci-dessous, vous pouvez vouloir analyser sitemaps pour obtenir des URL de pages.
  • Vous voudrez peut-être évaluer quelle information est importante pour vous et les changements souvent à rafraîchir plus souvent que d'autres pages. Note: Une araignée pour l'ensemble WWW reçoit beaucoup de données --- vous payez pour que la bande passante. Vous pouvez utiliser les requêtes HTTP HEAD pour deviner si une page a changé ou non.
  • En plus de recevoir, vous voulez traiter les informations et les stocker. Google construit des indices que la liste pour chaque mot les pages qui contiennent. Vous devrez peut-être des ordinateurs de stockage séparés et une infrastructure pour les relier. bases de données relationnelles traditionnelles ne tiennent pas aux exigences de volume de données et de performances de stockage / indexation de l'ensemble WWW.

Il est beaucoup de travail. Mais si votre objectif est plus modeste que la lecture de l'ensemble WWW, vous pouvez sauter certaines des parties. Si vous voulez juste télécharger une copie d'un wiki, etc. vous descendez aux spécifications de wget.

Note: Si vous ne croyez pas que ce soit tellement de travail, vous pouvez lire sur la façon dont Google réinventée la plupart des roues de calcul (au-dessus du noyau Linux de base) pour construire de bonnes araignées. Même si vous coupez beaucoup de virages, il est beaucoup de travail.

Permettez-moi d'ajouter quelques remarques techniques sur plus de trois points

connexions parallèles / asynchrone communication par socket

Vous pouvez exécuter plusieurs programmes d'araignée dans les processus ou les fils parallèles. Mais vous avez besoin sur 5000-10000 connexions parallèles afin de faire bon usage de votre connexion réseau. Et cette quantité de processus / threads parallèles produit trop au-dessus.

Une meilleure solution est d'entrée / sortie asynchrone: processus d'environ 1000 connexions parallèles en un seul fil par l'ouverture des douilles en mode non-bloquant et en utilisant epoll ou choisir de traiter seulement les connexions qui ont reçu des données. Depuis le noyau Linux 2.4, Linux a un excellent support pour l'évolutivité (Je recommande également que vous étudiez les fichiers mappés en mémoire) de façon continue améliorée dans les versions ultérieures.

Remarque: L'utilisation asynchrone i / o aide beaucoup plus que d'utiliser un « langage rapide »: Il est préférable d'écrire un processus axé sur epoll-pour 1000 connexions par écrit en Perl que pour exécuter 1000 processus écrits en C. Si vous le faites correctement , vous pouvez saturer une connexion 100Mb avec des processus écrits en Perl.

De la réponse originale: L'inconvénient de cette approche est quevous devrez implémenter la spécification HTTP vous sous une forme asynchrone (je ne suis pas au courant d'une bibliothèque réutilisable qui fait cela). Il est beaucoup plus facile de le faire avec le protocole HTTP / 1.0 plus simple que le protocole HTTP / 1.1 moderne. Vous auriez probablement pas bénéficier des avantages de HTTP / 1.1 pour les navigateurs normaux de toute façon, donc cela peut être un bon endroit pour économiser des coûts de développement.

Modifier cinq ans plus tard: Aujourd'hui, il y a beaucoup de technologie de libre / open source disponible pour vous aider à ce travail. Personnellement, je aime la http mise en œuvre de node.js --- il vous sauve tous les travaux mentionnés dans le paragraphe ci-dessus d'origine. Bien sûr, aujourd'hui, il y a aussi beaucoup de modules facilement disponibles pour les autres composants que vous avez besoin dans votre araignée. Notez, cependant, que la qualité des modules tiers peut varier considérablement. Vous devez vérifier ce que vous utilisez. [info vieillissement:] Récemment, j'ai écrit une araignée en utilisant Node.js et j'ai trouvé la fiabilité des modules NPM pour le traitement HTML pour le lien et l'extraction de données insuffisantes. Pour ce travail, je « externalisé » ce traitement à un processus écrit dans un autre langage de programmation. Mais les choses changent rapidement et le moment où vous lisez ce commentaire, ce problème peut déjà chose du passé ...

Partitionnement le travail sur plusieurs serveurs

Un ordinateur ne peut pas suivre l'ensemble spidering WWW. Vous devez distribuer votre travail sur plusieurs serveurs et d'échanger des informations entre eux. Je suggère d'attribuer certaines « gammes de noms de domaine » à chaque serveur: maintenir une base de données centrale des noms de domaine avec une référence à un ordinateur d'araignée.

Extraire les URL des pages Web reçues par lots: les trier en fonction de leurs noms de domaine; supprimer les doublons et les envoyer à l'ordinateur d'araignée responsable. Sur cet ordinateur, gardez un index d'URL qui sont déjà récupérés et récupérer les URL restantes.

Si vous gardez une file d'attente d'URL en attente d'être récupérées sur chaque ordinateur d'araignée, vous aurez pas les goulots d'étranglement. Mais il est tout à fait beaucoup de programmation à mettre en œuvre.

Lire les normes

je l'ai mentionné plusieurs normes (HTTP / 1.x, robots.txt, cookies). Prenez le temps de les lire et de les mettre en œuvre. Si vous suivez des exemples de sites que vous savez, vous allez faire des erreurs (oublier les parties de la norme qui ne sont pas pertinentes à vos échantillons) et causer des problèmes pour les sites qui utilisent ces fonctionnalités supplémentaires.

Il est une douleur pour lire le HTTP / 1.1 document standard. Mais tous les petits détails à elle se sont ajoutés parce que quelqu'un a vraiment besoin de ce petit détail et utilise maintenant.

Autres conseils

Je ne sais pas exactement ce que l'auteur original du commentaire faisait référence, mais je suppose que wget est lent comme une araignée, car il semble utiliser qu'un seul thread d'exécution (au moins par ce que vous avez montré ).

araignées « réels » tels que Heritrix utilisent beaucoup de parallélisme et astuces pour optimiser leur vitesse lente, tout en étant en même temps agréable sur le site, ils rampent. Cela signifie généralement limiter résultats à un seul site, à raison de 1 par seconde (ou presque), et l'exploration de multiples sites en même temps.

Encore une fois cela est juste une supposition basée sur ce que je sais des araignées en général, et ce que vous avez publié ici.

Malheureusement, bon nombre des plus célèbres araignées web « réelles » sont source fermée et bien fermée binaire. Cependant, il y a un certain nombre de techniques de base wget manque:

  • Parallélisme; vous n'allez être en mesure de suivre l'ensemble du Web sans récupérer plusieurs pages à la fois
  • priorisation; certaines pages sont plus importantes que d'autres à l'araignée
  • Taux limite; vous serez banni rapidement si vous continuez à tirer vers le bas les pages aussi vite que vous pouvez
  • Enregistrement à autre chose qu'un système de fichiers local; le Web est assez grand qu'il ne va pas se tenir dans une arborescence unique
  • Revérification pages périodiquement sans redémarrer l'ensemble du processus; dans la pratique, avec une vraie araignée vous voulez revérifier pages « importantes » pour les mises à jour fréquemment, alors que les pages moins intéressantes peuvent aller pendant des mois.

Il y a aussi d'autres entrées qui peuvent être utilisés tels que sitemaps et autres. Le point est, wget n'a pas été conçu à l'araignée sur le web tout entier, et ce n'est pas vraiment une chose qui peut être capturé dans un petit échantillon de code, car il est un problème de la technique tout l'ensemble utilisé, plutôt que d'une sous-routine seul petit se tromper pour la tâche.

Je ne vais pas entrer dans les détails de la façon d'araignée Internet, je pense que wget commentaire est à spidering un au sujet de site Web qui est encore un sérieux défi.

  • Comme une araignée vous devez savoir quand arrêter, ne pas aller dans crawls récursive juste parce que l'URL a changé comme la date = 1/1/1900 à 1/2/1900 et ainsi
  • défi encore plus grand pour trier URL Rewrite (je n'ai aucune idée ce que si jamais la façon dont Google ou tout autre poignées cela). Il est assez grand défi à ramper assez, mais pas trop. Et comment on peut reconnaître automatiquement Réécriture d'URL avec des paramètres aléatoires et des changements aléatoires dans le contenu?
  • Vous devez analyser Flash / Javascript au moins jusqu'à un certain niveau
  • Vous devez considérer quelques questions folles HTTP comme Base balise. Même l'analyse syntaxique HTML n'est pas facile, sachant que la plupart des sites ne sont pas XHTML et les navigateurs sont si flexibles dans la syntaxe.

Je ne sais pas combien de ces mises en œuvre ou pris en compte dans wget mais vous pouvez jeter un oeil à httrack pour comprendre les défis de cette tâche.

J'aimerais vous donner quelques exemples de code, mais ce qui est grand et une araignée tâches décent environ 5000 loc sans bibliothèques 3ème partie .

+ Certains d'entre eux a déjà été expliqué par @ Yaakov-éructer donc je ne vais pas les taper à nouveau

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top