Reglas dinámicas basadas en start_urls para Scrapy CrawlSpider?
Estoy escribiendo un raspador Scrapy que usa CrawlSpider para rastrear sitios, revisar sus enlaces internos y raspar el contenido de cualquier enlace externo (enlaces con un dominio diferente del dominio original).
Logré hacerlo con 2 reglas, pero se basan en el dominio del sitio que se rastrea. Si quiero ejecutar esto en varios sitios web, me encuentro con un problema porque no sé en qué "start_url" estoy actualmente, por lo que no puedo cambiar la regla adecuadamente.
Esto es lo que se me ocurrió hasta ahora, funciona para un sitio web y no estoy seguro de cómo aplicarlo a una lista de sitios web:
class HomepagesSpider(CrawlSpider):
name = 'homepages'
homepage = 'http://www.somesite.com'
start_urls = [homepage]
# strip http and www
domain = homepage.replace('http://', '').replace('https://', '').replace('www.', '')
domain = domain[:-1] if domain[-1] == '/' else domain
rules = (
Rule(LinkExtractor(allow_domains=(domain), deny_domains=()), callback='parse_internal', follow=True),
Rule(LinkExtractor(allow_domains=(), deny_domains=(domain)), callback='parse_external', follow=False),
)
def parse_internal(self, response):
# log internal page...
def parse_external(self, response):
# parse external page...
Probablemente esto se pueda hacer simplemente pasando start_url como argumento al llamar al scraper, pero estoy buscando una manera de hacerlo mediante programación dentro del scraper.
¿Algunas ideas? ¡Gracias!
Simon