2009-11-08 7 views
4

Je construis une petite application qui va explorer des sites où le contenu est en croissance (comme sur stackoverflow) la différence est que le contenu une fois créé est rarement modifié.Ne pas explorer deux fois le même contenu

Maintenant, dans la première passe, je crawl toutes les pages du site.

Mais ensuite, le contenu paginé de ce site - je ne veux pas réexplorer tout cela, juste les derniers ajouts. Donc, si le site a 500 pages, au second passage si le site a 501 pages, je ne ferais que parcourir les première et deuxième pages. Serait-ce un bon moyen de gérer la situation? En fin de compte, le contenu analysé se retrouvera dans Lucene - créant un moteur de recherche personnalisé. Donc, je voudrais éviter d'explorer plusieurs fois le même contenu. De meilleures idées?

EDIT:

Disons que le site a une page: Les résultats qui sont accessibles comme ceci:?

résultats page = 1, résultats page = 2 ... etc

Je suppose que garder une trace de combien de pages il y avait au moment de la dernière exploration et simplement explorer la différence serait suffisant. (peut-être en utilisant un hachage de chaque résultat sur la page - si je commence à courir dans les mêmes hachages - je devrais arrêter)

+0

Je ne suis pas sûr de savoir quelle est la question, vraiment. – Artelius

+2

Si vous supposez que le contenu ne sera jamais modifié, comment pensez-vous que les nouveaux liens d'exploration apparaîtront? – Thomas

+0

En plus de ce que Thomas a dit, cette approche ne tient pas compte du fait que le contenu peut être modifié après l'insertion. Rester ici sur SO, pensez aux questions avec beaucoup de réponses où les clarifications viennent en termes de modifications à la question originale ... – em70

Répondre

5

Si chaque élément de contenu est à un emplacement unique, alimentez ces emplacements (probablement des URL) dans un champ de hachage et vérifiez-le avant de "crawler" le contenu. L'URL devrait probablement faire partie de vos données stockées dans Lucene, donc cela devrait être facile à faire en effectuant une recherche avant d'ajouter à l'index.

+0

Merde, vous avez raison, je viens de réaliser que chaque résultat sur la page doit avoir une URL unique. Merci :) – sirrocco

2

Mon approche serait de stocker un hachage/empreinte du contenu de chaque page vue. De cette façon, lorsque vous réenregistrez une page, vous validez l'empreinte, si elle correspond, rien n'a changé et aucune analyse n'est nécessaire, puisque vous traitez déjà la page et tous les liens. Le site publie-t-il des balises électroniques efficaces pour chaque ressource recherchée?

+0

Mais en réalité, aller chercher la page est probablement plus lent que de l'analyser et de l'ajouter à l'index. Et vous auriez besoin de le chercher pour le hacher. – dlamblin

+0

C'est le conflit .. à moins que vous ne le récupériez (ou demandez au serveur s'il a changé), vous ne savez pas vraiment s'il a changé ... comment le PO sait-il que le nombre de pages a changé? Connaître le nom de la page n'est pas la même chose que connaître son contenu ... au moins j'ai compris que la page était similaire à SO, où les pages changent. – lexu

1

Si oui, vous pouvez émettre des GET conditionnels de ressources connues et dans le cas où le serveur envoie la ressource (c.-à-d. Qu'elle a changé), vous pouvez rechercher de nouveaux liens pour explorer, mettre à jour le contenu, etc. si votre site émet E-tags et répond à la condition ... get

1
  1. Faites une exploration standard l'ensemble du site du site pour obtenir tout le contenu historique
  2. suivre leur flux RSS pour trouver du nouveau contenu
  3. Répéter l'analyse à l'échelle du site périodiquement pour obtenir le contenu mis à jour
1

Regardez l'en-tête HTTP 'Last-Modified'. En C#, à partir de HttpWebResponse, s'il n'est pas égal à DateTime.Now, le contenu a changé. Ainsi, vous pouvez utiliser le contenu local (en supposant que vous le stockez) pour alimenter votre robot d'exploration. Ainsi, lorsque vous explorez, stockez le contenu WebPage et l'en-tête «Last-Modified».De plus, vous pouvez soit stocker chaque AbsoluteUri unique, ce qui fonctionne bien jusqu'à ce que la durée de recherche pour l'AbsoluteUri éclipse le temps nécessaire pour récupérer la page ou vous pouvez utiliser un filtre Bloom: http://en.wikipedia.org/wiki/Bloom_filter.

En plus de savoir où se trouve le sitemap Google (ou un flux RSS), vous ne saurez pas où le nouveau contenu est ajouté. Savoir automatiquement est comme un cambrioleur demandant où sont vos nouveaux achats sans vous demander d'abord. :)

Questions connexes