follow example crawler python web-scraping scrapy

python - example - scrapy vs beautifulsoup



¿En qué orden se evalúan las reglas en el CrawlSpider? (1)

Tengo una pregunta sobre el orden en que se evalúan las reglas en un CrawlSpider. Si tengo el código a continuación:

from scrapy.contrib.spiders.crawl import CrawlSpider, Rule from scrapy.contrib.linkextractors import LinkExtractor class MySpider(CrawlSpider): start_urls = [''http://someurlhere.com''] rules = ( Rule( LinkExtractor(restrict_xpaths=[ "//ul[@class=''menu-categories'']", "//ul[@class=''menu-subcategories'']"]), callback=''first_callback'' ), Rule( LinkExtractor(allow=''/product.php?id=/d+''), callback=''second_callback'' ) )

En este caso:

  • El motor enviará una solicitud para ''http://someurlhere.com'' en la lista start_url y llamará a la devolución de llamada de parse predeterminada cuando reciba la respuesta.
  • Luego, en el método de análisis sintáctico, a partir de la respuesta que obtiene del paso anterior extraerá los enlaces de esa respuesta en función del xpath que proporcionamos al FIRST LinkExtractor.

Ahora mi pregunta son los enlaces que se extraen de la regla FIRST LinkExtractor , ¿están simplemente programados en el programador y no se siguen de inmediato? Entonces, después de programar todos los enlaces que se extraen del primer LinkExtractor , ¿se llamará al método first_callback para todos esos enlaces con la respuesta pasada a ese first_callback ?

Además, ¿cuándo se LinkExtractor el segundo LinkExtractor ? ¿ LinkExtractor evalúa el primer LinkExtractor y luego solo se ejecuta el segundo LinkExtractor ?


Si revisamos la documentación oficial . El proceso es simple

Primero, su URL de inicio se analiza y luego cada enlace de páginas rastreadas subsecuentes será extraído por las reglas proporcionadas.

Ahora llegando a tu pregunta.

Ahora mi pregunta son los enlaces que se extraen de la regla FIRST LinkExtractor, ¿están simplemente programados en el programador y no se siguen de inmediato? Entonces, después de programar todos los enlaces que se extraen del primer LinkExtractor, ¿se llamará al método first_callback para todos esos enlaces con la respuesta pasada a ese first_callback?

Si la devolución de llamada es None siga por defecto a True , de lo contrario, su valor predeterminado es False . Significa que en su caso, no habrá seguimiento. Cualquier enlace que haya extraído de la respuesta de inicio de URL es lo que tendrá en el programador y su rastreo finalizará después de analizar todo esto.

Si quieres seguir, rompe las reglas. Encuentra dónde está tu contenido y dónde están los recursos.

# Extract links matching ''products'' (but not matching ''shampoo'') # and follow links from them (since no callback means follow=True by default). Rule(LinkExtractor(allow=(''products'', ), deny=(''shampoo'', ))), # Extract links matching ''item'' and parse them with the spider''s method parse_item Rule(LinkExtractor(allow=(''item'', )), callback=''parse_item''),

Ahora viene tu segunda pregunta:

Además, ¿cuándo se llamará el segundo LinkExtractor? ¿Se evalúa el primer LinkExtractor y luego solo se ejecuta el segundo LinkExtractor?

Uno no es dependiente del otro. LinkExtractor Object aplica la expresión regular o la coincidencia de cadenas de forma independiente. Si encuentran su URL coincidente, continúan con sus devoluciones de llamada o seguimiento.