2011-12-16 11 views
6

he puesto un CrawlSpider hasta siguientes ciertos enlaces y raspar una revista de noticias, donde los enlaces a cada tema siguen el siguiente esquema URL:Scrapy está siguiendo y raspando enlaces no permitidos

http://example.com/YYYY/DDDD/index.htm donde AAAA es el año y DDDD es el número de emisión de tres o cuatro dígitos.

Solo quiero que surjan los problemas 928 en adelante, y tengo mis reglas a continuación. No tengo ningún problema para conectarme al sitio, rastrear enlaces o extraer elementos (por lo que no incluí el resto de mi código). La araña parece decidida a seguir enlaces no permitidos. Está tratando de resolver los problemas 377, 398 y más, y sigue los enlaces "culture.htm" y "feature.htm". Esto arroja muchos errores y no es terriblemente importante, pero requiere mucha limpieza de los datos. ¿Alguna sugerencia sobre qué está pasando mal?

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: He fijado esta usando una expresión regular mucho más simple fot 2009, 2010, 2011, pero todavía estoy curioso por qué el anterior no funciona si alguien tiene alguna sugerencia.

Respuesta

8

Debe pasar deny argumentos a SgmlLinkExtractor que recoge enlaces a follow. Y no necesita crear tantas Rule si llaman a una función parse_item. Me gustaría escribir el código como:

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', 
     ), 
    ) 

Si se trata de patrones de URL real en las reglas que está utilizando para parse_item, se puede simplificar a esto:

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

fantástico. ¡Gracias por la ayuda! – Trey

Cuestiones relacionadas