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 listastart_url
y llamará a la devolución de llamada deparse
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.