Как обработать все виды исключений в проекте 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