2011-12-16 8 views
6

Ho un CrawlSpider impostare fino a seguito determinati link e raschiare una rivista in cui i collegamenti a ciascun problema seguono il seguente schema URL:Scrapy sta seguendo e raschiando maglie non consentito

http://example.com/YYYY/DDDD/index.htm dove YYYY è l'anno e DDDD è il numero di emissione a tre o quattro cifre.

Desidero solo i problemi 928 in poi e ho le mie regole di seguito. Non ho alcun problema a connettermi al sito, a strisciare link o estrapolare elementi (quindi non ho incluso il resto del mio codice). Sembra che il ragno segua determinati collegamenti non consentiti. Sta cercando di analizzare i problemi 377, 398 e altro, e segue i link "culture.htm" e "feature.htm". Questo genera molti errori e non è terribilmente importante, ma richiede un sacco di pulizia dei dati. Qualche suggerimento su cosa sta andando storto?

class crawlerNameSpider(CrawlSpider): 
name = 'crawler' 
allowed_domains = ["example.com"] 
start_urls = ["http://example.com/issues.htm"] 

rules = (
     Rule(SgmlLinkExtractor(allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',)), follow = True), 
     Rule(SgmlLinkExtractor(allow = ('fr[0-9].htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('eg[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('ec[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('op[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('sc[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('re[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(allow = ('in[0-9]*.htm',)), callback = 'parse_item'), 
     Rule(SgmlLinkExtractor(deny = ('culture.htm',)),), 
     Rule(SgmlLinkExtractor(deny = ('feature.htm',)),), 
    ) 

EDIT: Ho risolto questo utilizzando un'espressione regolare molto più semplice fot 2009, 2010, 2011, ma io sono ancora curioso di sapere perchè quanto sopra non funziona se qualcuno ha qualche suggerimento.

risposta

8

È necessario passare gli argomenti deny a SgmlLinkExtractor che raccoglie i collegamenti a follow. E non è necessario creare così tanti Rule se chiamano una funzione parse_item. Vorrei scrivere il codice come:

rules = (
     Rule(SgmlLinkExtractor(
        allow = ('\d\d\d\d/(92[8-9]|9[3-9][0-9]|\d\d\d\d)/index\.htm',), 
        deny = ('culture\.htm', 'feature\.htm'), 
        ), 
      follow = True 
     ), 
     Rule(SgmlLinkExtractor(
       allow = (
        'fr[0-9].htm', 
        'eg[0-9]*.htm', 
        'ec[0-9]*.htm', 
        'op[0-9]*.htm', 
        'sc[0-9]*.htm', 
        're[0-9]*.htm', 
        'in[0-9]*.htm', 
        ) 
       ), 
       callback = 'parse_item', 
     ), 
    ) 

Se si tratta di modelli di vero e proprio URL nelle regole che si utilizza per parse_item, può essere semplificata a questo:

Rule(SgmlLinkExtractor(
       allow = ('(fr|eg|ec|op|sc|re|in)[0-9]*\.htm',), 
       callback = 'parse_item', 
     ), 
) 
+0

Fantastic. Grazie per l'aiuto! – Trey

Problemi correlati