Capturando códigos de status http com aranha escamosa

Eu sou novo para scrapy. Estou escrevendo uma aranha projetada para verificar uma longa lista de URLs para os códigos de status do servidor e, quando apropriado, para quais URLs eles são redirecionados. É importante ressaltar que, se houver uma cadeia de redirecionamentos, preciso saber o código de status e o URL em cada salto. Eu estou usando response.meta ['redirect_urls'] para capturar os URLs, mas não tenho certeza de como capturar os códigos de status - não parece haver uma meta-chave de resposta para isso.

Eu percebo que talvez precise escrever algum middlewear personalizado para expor esses valores, mas não estou bem claro como registrar os códigos de status de cada salto, nem como acessar esses valores da aranha. Eu dei uma olhada, mas não encontrei um exemplo de alguém fazendo isso. Se alguém puder me apontar na direção certa, seria muito apreciado.

Por exemplo,

    items = []
    item = RedirectItem()
    item['url'] = response.url
    item['redirected_urls'] = response.meta['redirect_urls']     
    item['status_codes'] = #????
    items.append(item)

Editar - Com base no feedback de warawauk e em alguma ajuda realmente proativa dos caras no canal de IRC (freenode #scrappy), consegui fazer isso. Eu acredito que é um pouco hacky então qualquer comentário para melhorias será bem vindo:

(1) Desative o middleware padrão nas configurações e adicione o seu próprio:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': None,
    'myproject.middlewares.CustomRedirectMiddleware': 100,
}

(2) Crie seu CustomRedirectMiddleware em seu middlewares.py. Ele herda da classe principal redirectmiddleware e captura o redirecionamento:

class CustomRedirectMiddleware(RedirectMiddleware):
    """Handle redirection of requests based on response status and meta-refresh html tag"""

    def process_response(self, request, response, spider):
        #Get the redirect status codes
        request.meta.setdefault('redirect_status', []).append(response.status)
        if 'dont_redirect' in request.meta:
            return response
        if request.method.upper() == 'HEAD':
            if response.status in [301, 302, 303, 307] and 'Location' in response.headers:
                redirected_url = urljoin(request.url, response.headers['location'])
                redirected = request.replace(url=redirected_url)

                return self._redirect(redirected, request, spider, response.status)
            else:
                return response

        if response.status in [302, 303] and 'Location' in response.headers:
            redirected_url = urljoin(request.url, response.headers['location'])
            redirected = self._redirect_request_using_get(request, redirected_url)
            return self._redirect(redirected, request, spider, response.status)

        if response.status in [301, 307] and 'Location' in response.headers:
            redirected_url = urljoin(request.url, response.headers['location'])
            redirected = request.replace(url=redirected_url)
            return self._redirect(redirected, request, spider, response.status)

        if isinstance(response, HtmlResponse):
            interval, url = get_meta_refresh(response)
            if url and interval < self.max_metarefresh_delay:
                redirected = self._redirect_request_using_get(request, url)
                return self._redirect(redirected, request, spider, 'meta refresh')


        return response

(3) Agora você pode acessar a lista de redirecionamentos em sua aranha com

request.meta['redirect_status']

questionAnswers(3)

yourAnswerToTheQuestion