Actualmente estoy trabajando en un proyecto de raspador, que es muy importante para garantizar que TODAS las solicitudes se manejen correctamente, es decir, para registrar un error o guardar un resultado exitoso. Ya implementé la araña básica, y ahora puedo procesar el 99% de las solicitudes con éxito, pero puedo obtener errores como captcha, 50x, 30x o incluso no hay suficientes campos en el resultado (entonces intentaré con otro sitio web para encontrar los campos faltantes).cómo procesar todo tipo de excepción en un proyecto de scrapy, en errback y callback?
Al principio, pensé que es más "lógico" para elevar excepciones en la devolución de llamada analizar y procesar a todos ellos en errback, esto podría hacer que el código sea más legible. Pero intenté solo descubrir que el error errback solo puede atrapar errores en el módulo de descarga, como estados de respuesta que no sean 200. Si elevo un ParseError autoaplicado en la devolución de llamada, la araña simplemente lo levanta y se detiene.
Incluso si voy a tener que procesar la solicitud de análisis directamente en la devolución de llamada, no sé cómo volver a intentar la solicitud inmediatamente en la devolución de llamada de una manera limpia. Ya sabes, es posible que deba incluir un proxy diferente para enviar otra solicitud o modificar algún encabezado de solicitud.
Admito que soy relativamente nuevo en scrapy pero lo he intentado de un lado a otro durante días y todavía no puedo hacer que funcione ... Revisé cada pregunta en SO y nadie coincide, gracias de antemano por la ayuda.
ACTUALIZACIÓN: Me da cuenta de que esto podría ser una cuestión muy compleja, así que intenta ilustrar el escenario en el siguiente pseudo código, espero que esta ayuda:
from scraper.myexceptions import *
def parseRound1(self, response):
.... some parsing routines ...
if something wrong happened:
# this causes the spider raises a SpiderException and stops
raise CaptchaError
...
if no enough fields scraped:
raise ParseError(task, "no enough fields")
else:
return items
def parseRound2(self, response):
...some other parsing routines...
def errHandler(self, failure):
# how to trap all the exceptions?
r = failure.trap()
# cannot trap ParseError here
if r == CaptchaError:
# how to enqueue the original request here?
retry
elif r == ParseError:
if raised from parseRound1:
new request for Round2
else:
some other retry mechanism
elif r == HTTPError:
ignore or retry
gracias por aclarar las responsabilidades de 'callback' y' err back'! Esto me ha estado confundiendo por mucho tiempo ... supongo que debería haberlo entendido escribiendo algunas arañas de prueba antes ... –