2010-10-06 27 views
13

Im utilisant scrapy pour explorer un site Web de nouvelles sur une base quotidienne. Comment puis-je restreindre scrapy de gratter les URL déjà grattées. Il existe également une documentation claire ou des exemples sur SgmlLinkExtractor.Scrapy - comment identifier les URLs déjà éraflées

+1

Pour ce faire, vous devrez stocker les URL que vous avez effacées. Est-ce que vous faites ça? Si c'est le cas, comment? –

Répondre

0

Ceci est simple. Gérez toutes vos URL précédemment explorées dans Python dict. Donc, quand vous essayez de les essayer la prochaine fois, voir si cette URL est là dans la dict. d'autre crawl.

def load_urls(prev_urls): 
    prev = dict() 
    for url in prev_urls: 
     prev[url] = True 
    return prev 

def fresh_crawl(prev_urls, new_urls): 
    for url in new_urls: 
     if url not in prev_urls: 
      crawl(url) 
    return 

def main(): 
    purls = load_urls(prev_urls) 
    fresh_crawl(purls, nurls) 
    return 

Le code ci-dessus a été tapé dans l'éditeur de texte SO aka navigateur. Peut avoir des erreurs de syntaxe. Vous pourriez aussi avoir besoin de faire quelques changements. Mais la logique est là ...

NOTE: Mais attention, certains sites web changent constamment leur contenu. Il est donc parfois nécessaire de réexplorer une page Web particulière (c'est-à-dire la même URL) juste pour obtenir le contenu mis à jour.

+3

Il serait préférable d'utiliser un ensemble que d'un dict dans ce cas. –

13

Vous pouvez réellement faire assez facilement avec l'extrait de scrapy situé ici: http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/

Pour l'utiliser, copiez le code du lien et le mettre dans un certain fichier dans votre projet scrapy. Pour référencer, ajoutez une ligne dans votre settings.py à référencer:

SPIDER_MIDDLEWARES = { 'project.middlewares.ignore.IgnoreVisitedItems': 560 } 

Les détails pourquoi vous choisissez le nombre que vous ne peut être lu ici: http://doc.scrapy.org/en/latest/topics/downloader-middleware.html

Enfin, vous ll faut modifier vos items.py pour que chaque classe d'objet ait les champs suivants:

visit_id = Field() 
visit_status = Field() 

Et je pense que c'est tout. La prochaine fois que vous exécuterez votre araignée, il devrait automatiquement essayer de commencer à éviter les mêmes sites.

Bonne chance!

+0

J'ai tout fait comme vous l'avez mentionné mais cela n'a pas aidé. Il explore toujours la même URL. –

+0

Le lien mentionné est ici: http://snipplr.com/view/67018/middleware-to-avoid-revisiting-already-visited-items/ now. – vrleboss

+0

Eh bien, j'ai suivi ces étapes, il assigne un visit_id et visit_status comme neuf. Mais scanne les mêmes éléments encore et encore dans chaque exécution (et assigne les mêmes visit_id et visit_status comme nouveau). Des indices? – Anshu

1

Je pense que la réponse de jama22 est un peu incomplète.

Dans l'extrait if self.FILTER_VISITED in x.meta:, vous pouvez voir que vous avez besoin de FILTER_VISITED dans votre instance de demande pour que cette demande soit ignorée. C'est pour vous assurer que vous pouvez faire la différence entre les liens que vous voulez traverser et déplacer et les liens d'éléments, vous ne voulez pas voir à nouveau.

1

Scrapy peut auto-filtrer les URL qui sont grattées, n'est-ce pas? Certaines URL pointant vers la même page ne seront pas filtrées, comme "www.xxx.com/home/" et "www.xxx.com/home/index.html".