Как обработать все виды исключений в проекте scrapy, в errback и callback?

В настоящее время я работаю над проектом скребка, который очень важен для обеспечения правильной обработки КАЖДОГО запроса, то есть либо для регистрации ошибки, либо для сохранения успешного результата. Я уже реализовал базовый паук, и теперь я могу успешно обработать 99% запросов, но в результате я мог получить ошибки, такие как captcha, 50x, 30x или даже недостаточно полей (тогда я попробую другой веб-сайт, чтобы найти пропущенные поля).

Сначала я подумал, что это более "логично". Вызывать исключения в обратном вызове синтаксического анализа и обрабатывать их все в ошибке, это может сделать код более читабельным. Но я попытался только выяснить, что ошибка может только перехватывать ошибки в модуле загрузчика, такие как статусы ответов, отличные от 200. Если я вызову самореализованный ParseError в обратном вызове, паук просто поднимает его и останавливается.

Даже если мне придется обрабатывать запрос синтаксического анализа непосредственно в обратном вызове, я не знаю, как немедленно повторить запрос в обратном вызове в чистом виде. вы знаете, мне может потребоваться включить другой прокси-сервер для отправки другого запроса или изменить какой-либо заголовок запроса.

Я признаю, что я относительно новичок в области скрапа, но я пробовал туда-сюда несколько дней и до сих пор не могу заставить его работать & # x2026; Я проверил каждый вопрос на SO, и никто не совпал, заранее спасибо за помощь.

ОБНОВЛЕНИЕ: я понимаю, что это может быть очень сложный вопрос, поэтому я попытаюсь проиллюстрировать сценарий в следующем псевдокоде, надеюсь, это поможет:

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

Ответы на вопрос(2)

Ваш ответ на вопрос