Scrapy CrawlSpider - errback para start_urls
Sep 23 2020
Estoy usando CrawlSpidercon la regla linkextractor que tiene errback.
Estoy usando parse_start_urlpara poder analizar start_urlspero también los necesito errback.
class CS(CrawlSpider):
name = "CS"
rules = (Rule(LinkExtractor(allow=[], deny=[]), follow=True, callback='my_parse', errback='my_errback'),)
custom_settings = {
'DEPTH_LIMIT': 3,
#etc
}
start_urls = ['url']
allowed_domains = ['domain']
def my_errback(self, failure):
# log all failures
def parse_start_url(self, response):
return self.my_parse(response)
def my_parse(self, response):
# parse responses
El problema al que me enfrento es que el errback se llama SOLO para los enlaces extraídos y NO para start_urls.
No puedo usar el método start_requests (como se muestra a continuación) ya que estoy usando CrawlSpider y las reglas. Cuando lo hago, solo se raspan las start_urls:
def start_requests(self):
for u in self.start_urls:
yield scrapy.Request(u, callback=self.my_parse,
errback=self.my_errback)
Respuestas
J_Z Sep 24 2020 at 07:20
Esta es la respuesta: https://stackoverflow.com/a/34345668/13903397
Básicamente, tenemos que usar start_requestspero eliminar el parámetro de devolución de llamada. De esa forma, se llamará al self.parse predeterminado y se respetarán las reglas.
class CS(CrawlSpider):
name = "CS"
rules = (Rule(LinkExtractor(allow=[], deny=[]), follow=True, callback='my_parse', errback='my_errback'),)
custom_settings = {
'DEPTH_LIMIT': 3,
#etc
}
start_urls = ['url']
allowed_domains = ['domain']
def start_requests(self):
for u in self.start_urls:
yield scrapy.Request(u, errback=self.my_errback)
def my_errback(self, failure):
# log all failures
def parse_start_url(self, response):
return self.my_parse(response)
def my_parse(self, response):
# parse responses